• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /**
2  * Copyright (c) 2024 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  * http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
11  * either express or implied. See the License for the specific language governing permissions and limitations under the
12  * License.
13  */
14 
15 #include <cassert>
16 #include <cstdint>
17 #include "libabckit/include/c/abckit.h"
18 #include "libabckit/include/c/extensions/arkts/metadata_arkts.h"
19 
20 #include "libabckit/src/macros.h"
21 
22 #include "libabckit/src/metadata_inspect_impl.h"
23 #include "libabckit/src/adapter_dynamic/metadata_modify_dynamic.h"
24 #include "libabckit/src/adapter_static/metadata_modify_static.h"
25 
26 // CC-OFFNXT(G.PRE.02) code readability
27 // NOLINTNEXTLINE(cppcoreguidelines-macro-usage)
28 #define LIBABCKIT_CHECK_SAME_TARGET(target1, target2)                  \
29     if ((target1) != (target2)) {                                      \
30         libabckit::statuses::SetLastError(ABCKIT_STATUS_WRONG_TARGET); \
31         /* CC-OFFNXT(G.PRE.05) code generation */                      \
32         return nullptr;                                                \
33     }
34 
35 // CC-OFFNXT(G.PRE.02) code readability
36 // NOLINTNEXTLINE(cppcoreguidelines-macro-usage)
37 #define LIBABCKIT_CHECK_SAME_TARGET_VOID(target1, target2)             \
38     if ((target1) != (target2)) {                                      \
39         libabckit::statuses::SetLastError(ABCKIT_STATUS_WRONG_TARGET); \
40         /* CC-OFFNXT(G.PRE.05) code generation */                      \
41         return;                                                        \
42     }
43 
44 namespace libabckit {
45 
46 // ========================================
47 // File
48 // ========================================
49 
FileAddExternalModuleArktsV1(AbckitFile * file,const struct AbckitArktsV1ExternalModuleCreateParams * params)50 extern "C" AbckitArktsModule *FileAddExternalModuleArktsV1(AbckitFile *file,
51                                                            const struct AbckitArktsV1ExternalModuleCreateParams *params)
52 {
53     LIBABCKIT_CLEAR_LAST_ERROR;
54     LIBABCKIT_IMPLEMENTED;
55 
56     LIBABCKIT_BAD_ARGUMENT(file, nullptr);
57     LIBABCKIT_BAD_ARGUMENT(params, nullptr);
58     LIBABCKIT_BAD_ARGUMENT(params->name, nullptr);
59 
60     switch (file->frontend) {
61         case Mode::DYNAMIC:
62             return FileAddExternalArkTsV1Module(file, params);
63         case Mode::STATIC:
64             statuses::SetLastError(ABCKIT_STATUS_UNSUPPORTED);
65             return nullptr;
66         default:
67             LIBABCKIT_UNREACHABLE;
68     }
69 }
70 
71 // ========================================
72 // Module
73 // ========================================
74 
ModuleAddImportFromArktsV1ToArktsV1(AbckitArktsModule * importing,AbckitArktsModule * imported,const AbckitArktsImportFromDynamicModuleCreateParams * params)75 extern "C" AbckitArktsImportDescriptor *ModuleAddImportFromArktsV1ToArktsV1(
76     AbckitArktsModule *importing, AbckitArktsModule *imported,
77     const AbckitArktsImportFromDynamicModuleCreateParams *params)
78 {
79     LIBABCKIT_CLEAR_LAST_ERROR;
80     LIBABCKIT_IMPLEMENTED;
81 
82     LIBABCKIT_BAD_ARGUMENT(importing, nullptr);
83     LIBABCKIT_BAD_ARGUMENT(imported, nullptr);
84 
85     LIBABCKIT_BAD_ARGUMENT(params, nullptr);
86     LIBABCKIT_BAD_ARGUMENT(params->name, nullptr);
87     LIBABCKIT_BAD_ARGUMENT(params->alias, nullptr);
88 
89     LIBABCKIT_INTERNAL_ERROR(importing->core, nullptr);
90     LIBABCKIT_INTERNAL_ERROR(imported->core, nullptr);
91 
92     if (importing->core->target != ABCKIT_TARGET_ARK_TS_V1) {
93         statuses::SetLastError(ABCKIT_STATUS_WRONG_TARGET);
94         return nullptr;
95     }
96 
97     LIBABCKIT_CHECK_SAME_TARGET(importing->core->target, imported->core->target);
98 
99     return ModuleAddImportFromDynamicModuleDynamic(importing->core, imported->core, params);
100 }
101 
ModuleAddImportFromArktsV2ToArktsV2(AbckitArktsModule *,AbckitArktsModule *,const AbckitArktsImportFromDynamicModuleCreateParams *)102 extern "C" AbckitArktsImportDescriptor *ModuleAddImportFromArktsV2ToArktsV2(
103     AbckitArktsModule * /*importing*/, AbckitArktsModule * /*imported*/,
104     const AbckitArktsImportFromDynamicModuleCreateParams * /*params*/)
105 {
106     LIBABCKIT_CLEAR_LAST_ERROR;
107     LIBABCKIT_IMPLEMENTED;
108 
109     statuses::SetLastError(ABCKIT_STATUS_UNSUPPORTED);
110     return nullptr;
111 }
112 
ModuleRemoveImport(AbckitArktsModule * m,AbckitArktsImportDescriptor * i)113 extern "C" void ModuleRemoveImport(AbckitArktsModule *m, AbckitArktsImportDescriptor *i)
114 {
115     LIBABCKIT_CLEAR_LAST_ERROR;
116     LIBABCKIT_IMPLEMENTED;
117 
118     LIBABCKIT_BAD_ARGUMENT_VOID(m)
119     LIBABCKIT_BAD_ARGUMENT_VOID(i)
120 
121     LIBABCKIT_INTERNAL_ERROR_VOID(m->core);
122     LIBABCKIT_INTERNAL_ERROR_VOID(i->core);
123 
124     auto mt = m->core->target;
125     auto it = i->core->importingModule->target;
126 
127     LIBABCKIT_CHECK_SAME_TARGET_VOID(mt, it);
128 
129     switch (mt) {
130         case ABCKIT_TARGET_ARK_TS_V1:
131             return ModuleRemoveImportDynamic(m->core, i);
132         case ABCKIT_TARGET_ARK_TS_V2:
133             statuses::SetLastError(ABCKIT_STATUS_UNSUPPORTED);
134             return;
135         default:
136             LIBABCKIT_UNREACHABLE;
137     }
138 }
139 
ModuleAddExportFromArktsV1ToArktsV1(AbckitArktsModule * exporting,AbckitArktsModule * exported,const AbckitArktsDynamicModuleExportCreateParams * params)140 extern "C" AbckitArktsExportDescriptor *ModuleAddExportFromArktsV1ToArktsV1(
141     AbckitArktsModule *exporting, AbckitArktsModule *exported, const AbckitArktsDynamicModuleExportCreateParams *params)
142 {
143     LIBABCKIT_CLEAR_LAST_ERROR;
144     LIBABCKIT_IMPLEMENTED;
145 
146     LIBABCKIT_BAD_ARGUMENT(exporting, nullptr);
147     LIBABCKIT_BAD_ARGUMENT(exported, nullptr);
148     LIBABCKIT_BAD_ARGUMENT(params, nullptr);
149     LIBABCKIT_BAD_ARGUMENT(params->name, nullptr);
150 
151     LIBABCKIT_INTERNAL_ERROR(exporting->core, nullptr);
152     LIBABCKIT_INTERNAL_ERROR(exported->core, nullptr);
153 
154     if (exporting->core->target != ABCKIT_TARGET_ARK_TS_V1) {
155         statuses::SetLastError(ABCKIT_STATUS_WRONG_TARGET);
156         return nullptr;
157     }
158 
159     LIBABCKIT_CHECK_SAME_TARGET(exporting->core->target, exported->core->target);
160 
161     return DynamicModuleAddExportDynamic(exporting->core, exported->core, params);
162 }
163 
ModuleAddExportFromArktsV2ToArktsV2(AbckitArktsModule *,AbckitArktsModule *,const AbckitArktsDynamicModuleExportCreateParams *)164 extern "C" AbckitArktsExportDescriptor *ModuleAddExportFromArktsV2ToArktsV2(
165     AbckitArktsModule * /*exporting*/ /* assert(exporting.target === AbckitTarget_ArkTS_v2) */,
166     AbckitArktsModule * /*exported*/ /* assert(exporting.target === AbckitTarget_ArkTS_v2) */,
167     const AbckitArktsDynamicModuleExportCreateParams * /*params*/)
168 {
169     LIBABCKIT_CLEAR_LAST_ERROR;
170     LIBABCKIT_IMPLEMENTED;
171 
172     statuses::SetLastError(ABCKIT_STATUS_UNSUPPORTED);
173     return nullptr;
174 }
175 
ModuleRemoveExport(AbckitArktsModule * m,AbckitArktsExportDescriptor * e)176 extern "C" void ModuleRemoveExport(AbckitArktsModule *m, AbckitArktsExportDescriptor *e)
177 {
178     LIBABCKIT_CLEAR_LAST_ERROR;
179     LIBABCKIT_IMPLEMENTED;
180 
181     LIBABCKIT_BAD_ARGUMENT_VOID(m)
182     LIBABCKIT_BAD_ARGUMENT_VOID(e)
183 
184     LIBABCKIT_INTERNAL_ERROR_VOID(m->core);
185     LIBABCKIT_INTERNAL_ERROR_VOID(e->core);
186 
187     auto mt = m->core->target;
188     auto et = e->core->exportingModule->target;
189 
190     LIBABCKIT_CHECK_SAME_TARGET_VOID(mt, et);
191 
192     switch (mt) {
193         case ABCKIT_TARGET_ARK_TS_V1:
194             return ModuleRemoveExportDynamic(m->core, e);
195         case ABCKIT_TARGET_ARK_TS_V2:
196             statuses::SetLastError(ABCKIT_STATUS_UNSUPPORTED);
197             return;
198         default:
199             LIBABCKIT_UNREACHABLE;
200     }
201 }
202 
ModuleAddAnnotationInterface(AbckitArktsModule * m,const AbckitArktsAnnotationInterfaceCreateParams * params)203 extern "C" AbckitArktsAnnotationInterface *ModuleAddAnnotationInterface(
204     AbckitArktsModule *m, const AbckitArktsAnnotationInterfaceCreateParams *params)
205 {
206     LIBABCKIT_CLEAR_LAST_ERROR;
207     LIBABCKIT_IMPLEMENTED;
208 
209     LIBABCKIT_BAD_ARGUMENT(m, nullptr);
210     LIBABCKIT_BAD_ARGUMENT(params, nullptr);
211     LIBABCKIT_BAD_ARGUMENT(params->name, nullptr);
212 
213     LIBABCKIT_INTERNAL_ERROR(m->core, nullptr);
214 
215     switch (m->core->target) {
216         case ABCKIT_TARGET_ARK_TS_V1:
217             return ModuleAddAnnotationInterfaceDynamic(m->core, params);
218         case ABCKIT_TARGET_ARK_TS_V2:
219             statuses::SetLastError(ABCKIT_STATUS_UNSUPPORTED);
220             return nullptr;
221         default:
222             LIBABCKIT_UNREACHABLE;
223     }
224 }
225 
226 // ========================================
227 // Class
228 // ========================================
229 
ClassAddAnnotation(AbckitArktsClass * klass,const AbckitArktsAnnotationCreateParams * params)230 extern "C" AbckitArktsAnnotation *ClassAddAnnotation(AbckitArktsClass *klass,
231                                                      const AbckitArktsAnnotationCreateParams *params)
232 {
233     LIBABCKIT_CLEAR_LAST_ERROR;
234     LIBABCKIT_IMPLEMENTED;
235 
236     LIBABCKIT_BAD_ARGUMENT(klass, nullptr);
237     LIBABCKIT_BAD_ARGUMENT(params, nullptr);
238     LIBABCKIT_BAD_ARGUMENT(params->ai, nullptr);
239 
240     LIBABCKIT_INTERNAL_ERROR(klass->core, nullptr);
241     LIBABCKIT_INTERNAL_ERROR(params->ai->core, nullptr);
242 
243     auto kt = klass->core->owningModule->target;
244     auto at = params->ai->core->owningModule->target;
245 
246     LIBABCKIT_CHECK_SAME_TARGET(kt, at);
247 
248     switch (kt) {
249         case ABCKIT_TARGET_ARK_TS_V1:
250             return ClassAddAnnotationDynamic(klass->core, params);
251         case ABCKIT_TARGET_ARK_TS_V2:
252             statuses::SetLastError(ABCKIT_STATUS_UNSUPPORTED);
253             return nullptr;
254         default:
255             LIBABCKIT_UNREACHABLE;
256     }
257 }
258 
ClassRemoveAnnotation(AbckitArktsClass * klass,AbckitArktsAnnotation * anno)259 extern "C" void ClassRemoveAnnotation(AbckitArktsClass *klass, AbckitArktsAnnotation *anno)
260 {
261     LIBABCKIT_CLEAR_LAST_ERROR;
262     LIBABCKIT_IMPLEMENTED;
263 
264     LIBABCKIT_BAD_ARGUMENT_VOID(klass);
265     LIBABCKIT_BAD_ARGUMENT_VOID(anno);
266 
267     LIBABCKIT_INTERNAL_ERROR_VOID(klass->core);
268     LIBABCKIT_INTERNAL_ERROR_VOID(anno->core);
269 
270     auto kt = klass->core->owningModule->target;
271     auto at = anno->core->ai->owningModule->target;
272 
273     LIBABCKIT_CHECK_SAME_TARGET_VOID(kt, at);
274 
275     switch (kt) {
276         case ABCKIT_TARGET_ARK_TS_V1:
277             return ClassRemoveAnnotationDynamic(klass->core, anno->core);
278         case ABCKIT_TARGET_ARK_TS_V2:
279             statuses::SetLastError(ABCKIT_STATUS_UNSUPPORTED);
280             return;
281         default:
282             LIBABCKIT_UNREACHABLE;
283     }
284 }
285 
286 // ========================================
287 // AnnotationInterface
288 // ========================================
289 
AnnotationInterfaceAddField(AbckitArktsAnnotationInterface * ai,const AbckitArktsAnnotationInterfaceFieldCreateParams * params)290 extern "C" AbckitArktsAnnotationInterfaceField *AnnotationInterfaceAddField(
291     AbckitArktsAnnotationInterface *ai, const AbckitArktsAnnotationInterfaceFieldCreateParams *params)
292 {
293     LIBABCKIT_CLEAR_LAST_ERROR;
294     LIBABCKIT_IMPLEMENTED;
295 
296     LIBABCKIT_BAD_ARGUMENT(ai, nullptr);
297 
298     LIBABCKIT_BAD_ARGUMENT(params, nullptr);
299     LIBABCKIT_BAD_ARGUMENT(params->name, nullptr);
300     LIBABCKIT_BAD_ARGUMENT(params->type, nullptr);
301 
302     LIBABCKIT_INTERNAL_ERROR(ai->core, nullptr);
303 
304     switch (ai->core->owningModule->target) {
305         case ABCKIT_TARGET_ARK_TS_V1:
306             return AnnotationInterfaceAddFieldDynamic(ai->core, params);
307         case ABCKIT_TARGET_ARK_TS_V2:
308             statuses::SetLastError(ABCKIT_STATUS_UNSUPPORTED);
309             return nullptr;
310         default:
311             LIBABCKIT_UNREACHABLE;
312     }
313 }
314 
AnnotationInterfaceRemoveField(AbckitArktsAnnotationInterface * ai,AbckitArktsAnnotationInterfaceField * field)315 extern "C" void AnnotationInterfaceRemoveField(AbckitArktsAnnotationInterface *ai,
316                                                AbckitArktsAnnotationInterfaceField *field)
317 {
318     LIBABCKIT_CLEAR_LAST_ERROR;
319     LIBABCKIT_IMPLEMENTED;
320 
321     LIBABCKIT_BAD_ARGUMENT_VOID(ai);
322     LIBABCKIT_BAD_ARGUMENT_VOID(field);
323 
324     LIBABCKIT_INTERNAL_ERROR_VOID(ai->core);
325     LIBABCKIT_INTERNAL_ERROR_VOID(field->core);
326 
327     switch (ai->core->owningModule->target) {
328         case ABCKIT_TARGET_ARK_TS_V1:
329             return AnnotationInterfaceRemoveFieldDynamic(ai->core, field->core);
330         case ABCKIT_TARGET_ARK_TS_V2:
331             statuses::SetLastError(ABCKIT_STATUS_UNSUPPORTED);
332             return;
333         default:
334             LIBABCKIT_UNREACHABLE;
335     }
336 }
337 
338 // ========================================
339 // Function
340 // ========================================
341 
FunctionAddAnnotation(AbckitArktsFunction * function,const AbckitArktsAnnotationCreateParams * params)342 extern "C" AbckitArktsAnnotation *FunctionAddAnnotation(AbckitArktsFunction *function,
343                                                         const AbckitArktsAnnotationCreateParams *params)
344 {
345     LIBABCKIT_CLEAR_LAST_ERROR;
346     LIBABCKIT_IMPLEMENTED;
347 
348     LIBABCKIT_BAD_ARGUMENT(function, nullptr);
349     LIBABCKIT_BAD_ARGUMENT(params, nullptr);
350 
351     LIBABCKIT_INTERNAL_ERROR(function->core, nullptr);
352     LIBABCKIT_INTERNAL_ERROR(params->ai->core, nullptr);
353 
354     auto ft = function->core->owningModule->target;
355     auto at = params->ai->core->owningModule->target;
356 
357     LIBABCKIT_CHECK_SAME_TARGET(ft, at);
358 
359     switch (ft) {
360         case ABCKIT_TARGET_ARK_TS_V1:
361             return FunctionAddAnnotationDynamic(function->core, params);
362         case ABCKIT_TARGET_ARK_TS_V2:
363             statuses::SetLastError(ABCKIT_STATUS_UNSUPPORTED);
364             return nullptr;
365         default:
366             LIBABCKIT_UNREACHABLE;
367     }
368 }
369 
FunctionRemoveAnnotation(AbckitArktsFunction * function,AbckitArktsAnnotation * anno)370 extern "C" void FunctionRemoveAnnotation(AbckitArktsFunction *function, AbckitArktsAnnotation *anno)
371 {
372     LIBABCKIT_CLEAR_LAST_ERROR;
373     LIBABCKIT_IMPLEMENTED;
374 
375     LIBABCKIT_BAD_ARGUMENT_VOID(function);
376     LIBABCKIT_BAD_ARGUMENT_VOID(anno);
377 
378     LIBABCKIT_INTERNAL_ERROR_VOID(function->core);
379     LIBABCKIT_INTERNAL_ERROR_VOID(anno->core);
380 
381     auto ft = function->core->owningModule->target;
382     auto at = anno->core->ai->owningModule->target;
383 
384     LIBABCKIT_CHECK_SAME_TARGET_VOID(ft, at);
385 
386     switch (ft) {
387         case ABCKIT_TARGET_ARK_TS_V1:
388             return FunctionRemoveAnnotationDynamic(function->core, anno->core);
389         case ABCKIT_TARGET_ARK_TS_V2:
390             statuses::SetLastError(ABCKIT_STATUS_UNSUPPORTED);
391             return;
392         default:
393             LIBABCKIT_UNREACHABLE;
394     }
395 }
396 
397 // ========================================
398 // Annotation
399 // ========================================
400 
AnnotationAddAnnotationElement(AbckitArktsAnnotation * anno,AbckitArktsAnnotationElementCreateParams * params)401 extern "C" AbckitArktsAnnotationElement *AnnotationAddAnnotationElement(
402     AbckitArktsAnnotation *anno, AbckitArktsAnnotationElementCreateParams *params)
403 {
404     LIBABCKIT_CLEAR_LAST_ERROR;
405     LIBABCKIT_IMPLEMENTED;
406 
407     LIBABCKIT_BAD_ARGUMENT(anno, nullptr);
408 
409     LIBABCKIT_BAD_ARGUMENT(params, nullptr);
410     LIBABCKIT_BAD_ARGUMENT(params->name, nullptr);
411     LIBABCKIT_BAD_ARGUMENT(params->value, nullptr);
412 
413     LIBABCKIT_INTERNAL_ERROR(anno->core, nullptr);
414     AbckitCoreModule *module = anno->core->ai->owningModule;
415 
416     LIBABCKIT_INTERNAL_ERROR(module, nullptr);
417     LIBABCKIT_INTERNAL_ERROR(module->file, nullptr);
418 
419     switch (module->target) {
420         case ABCKIT_TARGET_ARK_TS_V1:
421             return AnnotationAddAnnotationElementDynamic(anno->core, params);
422         case ABCKIT_TARGET_ARK_TS_V2:
423             statuses::SetLastError(ABCKIT_STATUS_UNSUPPORTED);
424             return nullptr;
425         default:
426             LIBABCKIT_UNREACHABLE;
427     }
428 }
429 
AnnotationRemoveAnnotationElement(AbckitArktsAnnotation * anno,AbckitArktsAnnotationElement * elem)430 extern "C" void AnnotationRemoveAnnotationElement(AbckitArktsAnnotation *anno, AbckitArktsAnnotationElement *elem)
431 {
432     LIBABCKIT_CLEAR_LAST_ERROR;
433     LIBABCKIT_IMPLEMENTED;
434 
435     LIBABCKIT_BAD_ARGUMENT_VOID(anno);
436     LIBABCKIT_BAD_ARGUMENT_VOID(elem);
437 
438     LIBABCKIT_INTERNAL_ERROR_VOID(anno->core->ai);
439 
440     AbckitCoreModule *module = anno->core->ai->owningModule;
441 
442     LIBABCKIT_INTERNAL_ERROR_VOID(module);
443     LIBABCKIT_INTERNAL_ERROR_VOID(module->file);
444 
445     switch (module->target) {
446         case ABCKIT_TARGET_ARK_TS_V1:
447             return AnnotationRemoveAnnotationElementDynamic(anno->core, elem->core);
448         case ABCKIT_TARGET_ARK_TS_V2:
449             statuses::SetLastError(ABCKIT_STATUS_UNSUPPORTED);
450             return;
451         default:
452             LIBABCKIT_UNREACHABLE;
453     }
454 }
455 
456 // ========================================
457 // Type
458 // ========================================
459 
460 // ========================================
461 // Value
462 // ========================================
463 
464 // ========================================
465 // String
466 // ========================================
467 
468 // ========================================
469 // LiteralArray
470 // ========================================
471 
472 AbckitArktsModifyApi g_arktsModifyApiImpl = {
473 
474     // ========================================
475     // File
476     // ========================================
477 
478     FileAddExternalModuleArktsV1,
479 
480     // ========================================
481     // Module
482     // ========================================
483 
484     ModuleAddImportFromArktsV1ToArktsV1, ModuleRemoveImport, ModuleAddExportFromArktsV1ToArktsV1, ModuleRemoveExport,
485     ModuleAddAnnotationInterface,
486 
487     // ========================================
488     // Class
489     // ========================================
490 
491     ClassAddAnnotation, ClassRemoveAnnotation,
492 
493     // ========================================
494     // AnnotationInterface
495     // ========================================
496 
497     AnnotationInterfaceAddField, AnnotationInterfaceRemoveField,
498 
499     // ========================================
500     // Function
501     // ========================================
502 
503     FunctionAddAnnotation, FunctionRemoveAnnotation,
504 
505     // ========================================
506     // Annotation
507     // ========================================
508 
509     AnnotationAddAnnotationElement, AnnotationRemoveAnnotationElement,
510 
511     // ========================================
512     // Type
513     // ========================================
514 
515     // ========================================
516     // Value
517     // ========================================
518 
519     // ========================================
520     // String
521     // ========================================
522 
523     // ========================================
524     // LiteralArray
525     // ========================================
526 
527     // ========================================
528     // LiteralArray
529     // ========================================
530 };
531 
532 }  // namespace libabckit
533 
534 #ifdef ABCKIT_ENABLE_MOCK_IMPLEMENTATION
535 #include "./mock/abckit_mock.h"
536 #endif
537 
AbckitGetArktsModifyApiImpl(AbckitApiVersion version)538 extern "C" AbckitArktsModifyApi const *AbckitGetArktsModifyApiImpl(AbckitApiVersion version)
539 {
540 #ifdef ABCKIT_ENABLE_MOCK_IMPLEMENTATION
541     return AbckitGetMockArktsModifyApiImpl(version);
542 #endif
543     switch (version) {
544         case ABCKIT_VERSION_RELEASE_1_0_0:
545             return &libabckit::g_arktsModifyApiImpl;
546         default:
547             libabckit::statuses::SetLastError(ABCKIT_STATUS_UNKNOWN_API_VERSION);
548             return nullptr;
549     }
550 }
551