• 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,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #include <cassert>
17 #include "libabckit/include/c/abckit.h"
18 #include "libabckit/include/c/extensions/arkts/metadata_arkts.h"
19 
20 #include "libabckit/include/c/metadata_core.h"
21 #include "libabckit/include/c/statuses.h"
22 #include "libabckit/src/adapter_dynamic/metadata_modify_dynamic.h"
23 #include "libabckit/src/macros.h"
24 #include "libabckit/src/helpers_common.h"
25 
26 #include "libabckit/src/metadata_inspect_impl.h"
27 #include "libabckit/src/adapter_dynamic/metadata_inspect_dynamic.h"
28 #include "libabckit/src/adapter_static/metadata_inspect_static.h"
29 
30 // CC-OFFNXT(G.PRE.02) code readability
31 // NOLINTNEXTLINE(cppcoreguidelines-macro-usage)
32 #define LIBABCKIT_CHECK_ARKTS_TARGET(m)                                                     \
33     if ((m)->target != ABCKIT_TARGET_ARK_TS_V1 && (m)->target != ABCKIT_TARGET_ARK_TS_V2) { \
34         libabckit::statuses::SetLastError(ABCKIT_STATUS_WRONG_TARGET);                      \
35         /* CC-OFFNXT(G.PRE.05) code generation */                                           \
36         return nullptr;                                                                     \
37     }
38 
39 namespace libabckit {
40 
41 // ========================================
42 // File
43 // ========================================
44 
45 // ========================================
46 // Module
47 // ========================================
48 
ArktsModuleToCoreModule(AbckitArktsModule * m)49 extern "C" AbckitCoreModule *ArktsModuleToCoreModule(AbckitArktsModule *m)
50 {
51     LIBABCKIT_CLEAR_LAST_ERROR;
52     LIBABCKIT_IMPLEMENTED;
53     LIBABCKIT_BAD_ARGUMENT(m, nullptr);
54     return m->core;
55 }
56 
CoreModuleToArktsModule(AbckitCoreModule * m)57 extern "C" AbckitArktsModule *CoreModuleToArktsModule(AbckitCoreModule *m)
58 {
59     LIBABCKIT_CLEAR_LAST_ERROR;
60     LIBABCKIT_IMPLEMENTED;
61     LIBABCKIT_BAD_ARGUMENT(m, nullptr);
62     LIBABCKIT_CHECK_ARKTS_TARGET(m);
63     return m->GetArkTSImpl();
64 }
65 
66 /* ========================================
67  * Namespace
68  * ======================================== */
69 
ArktsNamespaceToCoreNamespace(AbckitArktsNamespace * n)70 extern "C" AbckitCoreNamespace *ArktsNamespaceToCoreNamespace(AbckitArktsNamespace *n)
71 {
72     LIBABCKIT_CLEAR_LAST_ERROR;
73     LIBABCKIT_IMPLEMENTED;
74     LIBABCKIT_BAD_ARGUMENT(n, nullptr);
75     return n->core;
76 }
77 
CoreNamespaceToArktsNamespace(AbckitCoreNamespace * n)78 extern "C" AbckitArktsNamespace *CoreNamespaceToArktsNamespace(AbckitCoreNamespace *n)
79 {
80     LIBABCKIT_CLEAR_LAST_ERROR;
81     LIBABCKIT_IMPLEMENTED;
82     LIBABCKIT_BAD_ARGUMENT(n, nullptr);
83     LIBABCKIT_CHECK_ARKTS_TARGET(n->owningModule);
84     return n->GetArkTSImpl();
85 }
86 
ArktsV1NamespaceGetConstructor(AbckitArktsNamespace * n)87 extern "C" AbckitArktsFunction *ArktsV1NamespaceGetConstructor(AbckitArktsNamespace *n)
88 {
89     LIBABCKIT_CLEAR_LAST_ERROR;
90     LIBABCKIT_IMPLEMENTED;
91     LIBABCKIT_BAD_ARGUMENT(n, nullptr);
92     if (n->core->owningModule->target != ABCKIT_TARGET_ARK_TS_V1) {
93         libabckit::statuses::SetLastError(ABCKIT_STATUS_WRONG_TARGET);
94         return nullptr;
95     }
96     return n->f->GetArkTSImpl();
97 }
98 
99 // ========================================
100 // ImportDescriptor
101 // ========================================
102 
ArktsImportDescriptorToCoreImportDescriptor(AbckitArktsImportDescriptor * i)103 extern "C" AbckitCoreImportDescriptor *ArktsImportDescriptorToCoreImportDescriptor(AbckitArktsImportDescriptor *i)
104 {
105     LIBABCKIT_CLEAR_LAST_ERROR;
106     LIBABCKIT_IMPLEMENTED;
107     LIBABCKIT_BAD_ARGUMENT(i, nullptr);
108     return i->core;
109 }
110 
CoreImportDescriptorToArktsImportDescriptor(AbckitCoreImportDescriptor * i)111 extern "C" AbckitArktsImportDescriptor *CoreImportDescriptorToArktsImportDescriptor(AbckitCoreImportDescriptor *i)
112 {
113     LIBABCKIT_CLEAR_LAST_ERROR;
114     LIBABCKIT_IMPLEMENTED;
115     LIBABCKIT_BAD_ARGUMENT(i, nullptr);
116     LIBABCKIT_CHECK_ARKTS_TARGET(i->importingModule);
117     return i->GetArkTSImpl();
118 }
119 
120 // ========================================
121 // ExportDescriptor
122 // ========================================
123 
ArktsExportDescriptorToCoreExportDescriptor(AbckitArktsExportDescriptor * e)124 extern "C" AbckitCoreExportDescriptor *ArktsExportDescriptorToCoreExportDescriptor(AbckitArktsExportDescriptor *e)
125 {
126     LIBABCKIT_CLEAR_LAST_ERROR;
127     LIBABCKIT_IMPLEMENTED;
128     LIBABCKIT_BAD_ARGUMENT(e, nullptr);
129     return e->core;
130 }
131 
CoreExportDescriptorToArktsExportDescriptor(AbckitCoreExportDescriptor * e)132 extern "C" AbckitArktsExportDescriptor *CoreExportDescriptorToArktsExportDescriptor(AbckitCoreExportDescriptor *e)
133 {
134     LIBABCKIT_CLEAR_LAST_ERROR;
135     LIBABCKIT_IMPLEMENTED;
136     LIBABCKIT_BAD_ARGUMENT(e, nullptr);
137     LIBABCKIT_CHECK_ARKTS_TARGET(e->exportingModule);
138     return e->GetArkTSImpl();
139 }
140 
141 // ========================================
142 // Class
143 // ========================================
144 
ArktsClassToCoreClass(AbckitArktsClass * c)145 extern "C" AbckitCoreClass *ArktsClassToCoreClass(AbckitArktsClass *c)
146 {
147     LIBABCKIT_CLEAR_LAST_ERROR;
148     LIBABCKIT_IMPLEMENTED;
149     LIBABCKIT_BAD_ARGUMENT(c, nullptr);
150     return c->core;
151 }
152 
CoreClassToArktsClass(AbckitCoreClass * c)153 extern "C" AbckitArktsClass *CoreClassToArktsClass(AbckitCoreClass *c)
154 {
155     LIBABCKIT_CLEAR_LAST_ERROR;
156     LIBABCKIT_IMPLEMENTED;
157     LIBABCKIT_BAD_ARGUMENT(c, nullptr);
158     LIBABCKIT_CHECK_ARKTS_TARGET(c->owningModule);
159     return c->GetArkTSImpl();
160 }
161 
162 // ========================================
163 // Function
164 // ========================================
165 
ArktsFunctionToCoreFunction(AbckitArktsFunction * m)166 extern "C" AbckitCoreFunction *ArktsFunctionToCoreFunction(AbckitArktsFunction *m)
167 {
168     LIBABCKIT_CLEAR_LAST_ERROR;
169     LIBABCKIT_IMPLEMENTED;
170     LIBABCKIT_BAD_ARGUMENT(m, nullptr);
171     return m->core;
172 }
173 
CoreFunctionToArktsFunction(AbckitCoreFunction * m)174 extern "C" AbckitArktsFunction *CoreFunctionToArktsFunction(AbckitCoreFunction *m)
175 {
176     LIBABCKIT_CLEAR_LAST_ERROR;
177     LIBABCKIT_IMPLEMENTED;
178     LIBABCKIT_BAD_ARGUMENT(m, nullptr);
179     LIBABCKIT_CHECK_ARKTS_TARGET(m->owningModule);
180     return m->GetArkTSImpl();
181 }
182 
FunctionIsNative(AbckitArktsFunction * function)183 extern "C" bool FunctionIsNative(AbckitArktsFunction *function)
184 {
185     LIBABCKIT_CLEAR_LAST_ERROR;
186     LIBABCKIT_IMPLEMENTED;
187     LIBABCKIT_BAD_ARGUMENT(function, false);
188 
189     switch (function->core->owningModule->target) {
190         case ABCKIT_TARGET_ARK_TS_V1:
191             return FunctionIsNativeDynamic(function->core);
192         case ABCKIT_TARGET_ARK_TS_V2:
193             return FunctionIsNativeStatic(function->core);
194         default:
195             LIBABCKIT_UNREACHABLE;
196     }
197 }
198 
199 // ========================================
200 // Annotation
201 // ========================================
202 
ArktsAnnotationToCoreAnnotation(AbckitArktsAnnotation * a)203 extern "C" AbckitCoreAnnotation *ArktsAnnotationToCoreAnnotation(AbckitArktsAnnotation *a)
204 {
205     LIBABCKIT_CLEAR_LAST_ERROR;
206     LIBABCKIT_IMPLEMENTED;
207     LIBABCKIT_BAD_ARGUMENT(a, nullptr);
208     return a->core;
209 }
210 
CoreAnnotationToArktsAnnotation(AbckitCoreAnnotation * a)211 extern "C" AbckitArktsAnnotation *CoreAnnotationToArktsAnnotation(AbckitCoreAnnotation *a)
212 {
213     LIBABCKIT_CLEAR_LAST_ERROR;
214     LIBABCKIT_IMPLEMENTED;
215     LIBABCKIT_BAD_ARGUMENT(a, nullptr);
216     LIBABCKIT_CHECK_ARKTS_TARGET(a->ai->owningModule);
217     return a->GetArkTSImpl();
218 }
219 
220 // ========================================
221 // AnnotationElement
222 // ========================================
223 
ArktsAnnotationElementToCoreAnnotationElement(AbckitArktsAnnotationElement * a)224 extern "C" AbckitCoreAnnotationElement *ArktsAnnotationElementToCoreAnnotationElement(AbckitArktsAnnotationElement *a)
225 {
226     LIBABCKIT_CLEAR_LAST_ERROR;
227     LIBABCKIT_IMPLEMENTED;
228     LIBABCKIT_BAD_ARGUMENT(a, nullptr);
229     return a->core;
230 }
231 
CoreAnnotationElementToArktsAnnotationElement(AbckitCoreAnnotationElement * a)232 extern "C" AbckitArktsAnnotationElement *CoreAnnotationElementToArktsAnnotationElement(AbckitCoreAnnotationElement *a)
233 {
234     LIBABCKIT_CLEAR_LAST_ERROR;
235     LIBABCKIT_IMPLEMENTED;
236     LIBABCKIT_BAD_ARGUMENT(a, nullptr);
237     LIBABCKIT_CHECK_ARKTS_TARGET(a->ann->ai->owningModule);
238     return a->GetArkTSImpl();
239 }
240 
241 // ========================================
242 // AnnotationInterface
243 // ========================================
244 
ArktsAnnotationInterfaceToCoreAnnotationInterface(AbckitArktsAnnotationInterface * a)245 extern "C" AbckitCoreAnnotationInterface *ArktsAnnotationInterfaceToCoreAnnotationInterface(
246     AbckitArktsAnnotationInterface *a)
247 {
248     LIBABCKIT_CLEAR_LAST_ERROR;
249     LIBABCKIT_IMPLEMENTED;
250     LIBABCKIT_BAD_ARGUMENT(a, nullptr);
251     return a->core;
252 }
253 
CoreAnnotationInterfaceToArktsAnnotationInterface(AbckitCoreAnnotationInterface * a)254 extern "C" AbckitArktsAnnotationInterface *CoreAnnotationInterfaceToArktsAnnotationInterface(
255     AbckitCoreAnnotationInterface *a)
256 {
257     LIBABCKIT_CLEAR_LAST_ERROR;
258     LIBABCKIT_IMPLEMENTED;
259     LIBABCKIT_BAD_ARGUMENT(a, nullptr);
260     LIBABCKIT_CHECK_ARKTS_TARGET(a->owningModule);
261     return a->GetArkTSImpl();
262 }
263 
264 // ========================================
265 // AnnotationInterfaceField
266 // ========================================
267 
ArktsAnnotationInterfaceFieldToCoreAnnotationInterfaceField(AbckitArktsAnnotationInterfaceField * a)268 extern "C" AbckitCoreAnnotationInterfaceField *ArktsAnnotationInterfaceFieldToCoreAnnotationInterfaceField(
269     AbckitArktsAnnotationInterfaceField *a)
270 {
271     LIBABCKIT_CLEAR_LAST_ERROR;
272     LIBABCKIT_IMPLEMENTED;
273     LIBABCKIT_BAD_ARGUMENT(a, nullptr);
274     return a->core;
275 }
276 
CoreAnnotationInterfaceFieldToArktsAnnotationInterfaceField(AbckitCoreAnnotationInterfaceField * a)277 extern "C" AbckitArktsAnnotationInterfaceField *CoreAnnotationInterfaceFieldToArktsAnnotationInterfaceField(
278     AbckitCoreAnnotationInterfaceField *a)
279 {
280     LIBABCKIT_CLEAR_LAST_ERROR;
281     LIBABCKIT_IMPLEMENTED;
282     LIBABCKIT_BAD_ARGUMENT(a, nullptr);
283     LIBABCKIT_CHECK_ARKTS_TARGET(a->ai->owningModule);
284     return a->GetArkTSImpl();
285 }
286 
287 // ========================================
288 // Type
289 // ========================================
290 
291 // ========================================
292 // Value
293 // ========================================
294 
295 // ========================================
296 // String
297 // ========================================
298 
299 // ========================================
300 // LiteralArray
301 // ========================================
302 
303 // ========================================
304 // Literal
305 // ========================================
306 
307 AbckitArktsInspectApi g_arktsInspectApiImpl = {
308     // ========================================
309     // File
310     // ========================================
311 
312     // ========================================
313     // Module
314     // ========================================
315 
316     ArktsModuleToCoreModule, CoreModuleToArktsModule,
317 
318     /* ========================================
319      * Namespace
320      * ======================================== */
321 
322     ArktsNamespaceToCoreNamespace, CoreNamespaceToArktsNamespace, ArktsV1NamespaceGetConstructor,
323 
324     // ========================================
325     // ImportDescriptor
326     // ========================================
327 
328     ArktsImportDescriptorToCoreImportDescriptor, CoreImportDescriptorToArktsImportDescriptor,
329 
330     // ========================================
331     // ExportDescriptor
332     // ========================================
333 
334     ArktsExportDescriptorToCoreExportDescriptor, CoreExportDescriptorToArktsExportDescriptor,
335 
336     // ========================================
337     // Class
338     // ========================================
339 
340     ArktsClassToCoreClass, CoreClassToArktsClass,
341 
342     // ========================================
343     // Function
344     // ========================================
345 
346     ArktsFunctionToCoreFunction, CoreFunctionToArktsFunction, FunctionIsNative,
347 
348     // ========================================
349     // Annotation
350     // ========================================
351 
352     ArktsAnnotationToCoreAnnotation, CoreAnnotationToArktsAnnotation,
353 
354     // ========================================
355     // AnnotationElement
356     // ========================================
357 
358     ArktsAnnotationElementToCoreAnnotationElement, CoreAnnotationElementToArktsAnnotationElement,
359 
360     // ========================================
361     // AnnotationInterface
362     // ========================================
363 
364     ArktsAnnotationInterfaceToCoreAnnotationInterface, CoreAnnotationInterfaceToArktsAnnotationInterface,
365 
366     // ========================================
367     // AnnotationInterfaceField
368     // ========================================
369 
370     ArktsAnnotationInterfaceFieldToCoreAnnotationInterfaceField,
371     CoreAnnotationInterfaceFieldToArktsAnnotationInterfaceField,
372 
373     // ========================================
374     // Type
375     // ========================================
376 
377     // ========================================
378     // Value
379     // ========================================
380 
381     // ========================================
382     // String
383     // ========================================
384 
385     // ========================================
386     // LiteralArray
387     // ========================================
388 
389     // ========================================
390     // Literal
391     // ========================================
392 };
393 
394 // ========================================
395 // Enumerators
396 // ========================================
397 
398 // ========================================
399 // Module
400 // ========================================
401 
ArkTSModuleEnumerateImports(AbckitCoreModule * m,void * data,bool (* cb)(AbckitCoreImportDescriptor * i,void * data))402 bool ArkTSModuleEnumerateImports(AbckitCoreModule *m, void *data, bool (*cb)(AbckitCoreImportDescriptor *i, void *data))
403 {
404     for (auto &id : m->id) {
405         if (!cb(id.get(), data)) {
406             return false;
407         }
408     }
409     return true;
410 }
411 
ArkTSModuleEnumerateExports(AbckitCoreModule * m,void * data,bool (* cb)(AbckitCoreExportDescriptor * e,void * data))412 bool ArkTSModuleEnumerateExports(AbckitCoreModule *m, void *data, bool (*cb)(AbckitCoreExportDescriptor *e, void *data))
413 {
414     for (auto &ed : m->ed) {
415         if (!cb(ed.get(), data)) {
416             return false;
417         }
418     }
419     return true;
420 }
421 
ArkTSModuleEnumerateNamespaces(AbckitCoreModule * m,void * data,bool (* cb)(AbckitCoreNamespace * n,void * data))422 bool ArkTSModuleEnumerateNamespaces(AbckitCoreModule *m, void *data, bool (*cb)(AbckitCoreNamespace *n, void *data))
423 {
424     for (auto &n : m->namespaces) {
425         if (!cb(n.get(), data)) {
426             return false;
427         }
428     }
429     return true;
430 }
431 
ArkTSModuleEnumerateClasses(AbckitCoreModule * m,void * data,bool cb (AbckitCoreClass * klass,void * data))432 bool ArkTSModuleEnumerateClasses(AbckitCoreModule *m, void *data, bool cb(AbckitCoreClass *klass, void *data))
433 {
434     return ModuleEnumerateClassesHelper(m, data, cb);
435 }
436 
ArkTSModuleEnumerateTopLevelFunctions(AbckitCoreModule * m,void * data,bool (* cb)(AbckitCoreFunction * function,void * data))437 bool ArkTSModuleEnumerateTopLevelFunctions(AbckitCoreModule *m, void *data,
438                                            bool (*cb)(AbckitCoreFunction *function, void *data))
439 {
440     return ModuleEnumerateTopLevelFunctionsHelper(m, data, cb);
441 }
442 
ArkTSModuleEnumerateAnonymousFunctions(AbckitCoreModule * m,void * data,bool (* cb)(AbckitCoreFunction * function,void * data))443 bool ArkTSModuleEnumerateAnonymousFunctions(AbckitCoreModule *m, void *data,
444                                             bool (*cb)(AbckitCoreFunction *function, void *data))
445 {
446     switch (m->target) {
447         case ABCKIT_TARGET_ARK_TS_V1:
448             return ModuleEnumerateAnonymousFunctionsDynamic(m, data, cb);
449         case ABCKIT_TARGET_ARK_TS_V2:
450             return ModuleEnumerateAnonymousFunctionsStatic(m, data, cb);
451         default:
452             LIBABCKIT_UNREACHABLE;
453     }
454 }
455 
ArkTSModuleEnumerateAnnotationInterfaces(AbckitCoreModule * m,void * data,bool (* cb)(AbckitCoreAnnotationInterface * ai,void * data))456 bool ArkTSModuleEnumerateAnnotationInterfaces(AbckitCoreModule *m, void *data,
457                                               bool (*cb)(AbckitCoreAnnotationInterface *ai, void *data))
458 {
459     return ModuleEnumerateAnnotationInterfacesHelper(m, data, cb);
460 }
461 
462 // ========================================
463 // Module
464 // ========================================
465 
ArkTSNamespaceEnumerateNamespaces(AbckitCoreNamespace * n,void * data,bool (* cb)(AbckitCoreNamespace * n,void * data))466 bool ArkTSNamespaceEnumerateNamespaces(AbckitCoreNamespace *n, void *data,
467                                        bool (*cb)(AbckitCoreNamespace *n, void *data))
468 {
469     for (auto &subn : n->namespaces) {
470         if (!cb(subn.get(), data)) {
471             return false;
472         }
473     }
474     return true;
475 }
476 
ArkTSNamespaceEnumerateClasses(AbckitCoreNamespace * n,void * data,bool (* cb)(AbckitCoreClass * klass,void * data))477 bool ArkTSNamespaceEnumerateClasses(AbckitCoreNamespace *n, void *data, bool (*cb)(AbckitCoreClass *klass, void *data))
478 {
479     for (auto &c : n->classes) {
480         if (!cb(c.get(), data)) {
481             return false;
482         }
483     }
484     return true;
485 }
486 
ArkTSNamespaceEnumerateTopLevelFunctions(AbckitCoreNamespace * n,void * data,bool (* cb)(AbckitCoreFunction * func,void * data))487 bool ArkTSNamespaceEnumerateTopLevelFunctions(AbckitCoreNamespace *n, void *data,
488                                               bool (*cb)(AbckitCoreFunction *func, void *data))
489 {
490     for (auto &f : n->functions) {
491         if (!cb(f.get(), data)) {
492             return false;
493         }
494     }
495     return true;
496 }
497 
498 // ========================================
499 // Class
500 // ========================================
501 
ArkTSClassEnumerateMethods(AbckitCoreClass * klass,void * data,bool (* cb)(AbckitCoreFunction * method,void * data))502 bool ArkTSClassEnumerateMethods(AbckitCoreClass *klass, void *data, bool (*cb)(AbckitCoreFunction *method, void *data))
503 {
504     return ClassEnumerateMethodsHelper(klass, data, cb);
505 }
506 
ArkTSClassEnumerateAnnotations(AbckitCoreClass * klass,void * data,bool (* cb)(AbckitCoreAnnotation * anno,void * data))507 bool ArkTSClassEnumerateAnnotations(AbckitCoreClass *klass, void *data,
508                                     bool (*cb)(AbckitCoreAnnotation *anno, void *data))
509 {
510     LIBABCKIT_BAD_ARGUMENT(klass, false)
511     LIBABCKIT_BAD_ARGUMENT(cb, false)
512 
513     for (auto &annotation : klass->annotations) {
514         if (!cb(annotation.get(), data)) {
515             return false;
516         }
517     }
518     return true;
519 }
520 
521 // ========================================
522 // Function
523 // ========================================
524 
ArkTSFunctionEnumerateNestedFunctions(AbckitCoreFunction * function,void * data,bool (* cb)(AbckitCoreFunction * nestedFunc,void * data))525 bool ArkTSFunctionEnumerateNestedFunctions([[maybe_unused]] AbckitCoreFunction *function, [[maybe_unused]] void *data,
526                                            [[maybe_unused]] bool (*cb)(AbckitCoreFunction *nestedFunc, void *data))
527 {
528     return false;  // There is no nested functions in ArkTS
529 }
530 
ArkTSFunctionEnumerateNestedClasses(AbckitCoreFunction * function,void * data,bool (* cb)(AbckitCoreClass * nestedClass,void * data))531 bool ArkTSFunctionEnumerateNestedClasses(AbckitCoreFunction *function, void *data,
532                                          bool (*cb)(AbckitCoreClass *nestedClass, void *data))
533 {
534     for (auto &c : function->nestedClasses) {
535         if (!cb(c.get(), data)) {
536             return false;
537         }
538     }
539     return true;
540 }
541 
ArkTSFunctionEnumerateAnnotations(AbckitCoreFunction * function,void * data,bool (* cb)(AbckitCoreAnnotation * anno,void * data))542 bool ArkTSFunctionEnumerateAnnotations(AbckitCoreFunction *function, void *data,
543                                        bool (*cb)(AbckitCoreAnnotation *anno, void *data))
544 {
545     LIBABCKIT_BAD_ARGUMENT(function, false)
546     LIBABCKIT_BAD_ARGUMENT(cb, false)
547 
548     for (auto &annotation : function->annotations) {
549         if (!cb(annotation.get(), data)) {
550             return false;
551         }
552     }
553     return true;
554 }
555 
556 // ========================================
557 // Annotation
558 // ========================================
559 
ArkTSAnnotationEnumerateElements(AbckitCoreAnnotation * anno,void * data,bool (* cb)(AbckitCoreAnnotationElement * ae,void * data))560 bool ArkTSAnnotationEnumerateElements(AbckitCoreAnnotation *anno, void *data,
561                                       bool (*cb)(AbckitCoreAnnotationElement *ae, void *data))
562 {
563     LIBABCKIT_BAD_ARGUMENT(anno, false)
564     LIBABCKIT_BAD_ARGUMENT(cb, false)
565 
566     LIBABCKIT_INTERNAL_ERROR(anno->ai, false)
567 
568     AbckitCoreModule *m = anno->ai->owningModule;
569 
570     LIBABCKIT_BAD_ARGUMENT(m, false)
571     LIBABCKIT_INTERNAL_ERROR(m->file, false)
572 
573     for (auto &elem : anno->elements) {
574         if (!cb(elem.get(), data)) {
575             return false;
576         }
577     }
578     return true;
579 }
580 
581 // ========================================
582 // AnnotationInterface
583 // ========================================
584 
ArkTSAnnotationInterfaceEnumerateFields(AbckitCoreAnnotationInterface * ai,void * data,bool (* cb)(AbckitCoreAnnotationInterfaceField * fld,void * data))585 bool ArkTSAnnotationInterfaceEnumerateFields(AbckitCoreAnnotationInterface *ai, void *data,
586                                              bool (*cb)(AbckitCoreAnnotationInterfaceField *fld, void *data))
587 {
588     LIBABCKIT_BAD_ARGUMENT(ai, false)
589     LIBABCKIT_BAD_ARGUMENT(cb, false)
590 
591     for (auto &ed : ai->fields) {
592         if (!cb(ed.get(), data)) {
593             return false;
594         }
595     }
596     return true;
597 }
598 
599 }  // namespace libabckit
600 
601 #ifdef ABCKIT_ENABLE_MOCK_IMPLEMENTATION
602 #include "./mock/abckit_mock.h"
603 #endif
604 
AbckitGetArktsInspectApiImpl(AbckitApiVersion version)605 extern "C" AbckitArktsInspectApi const *AbckitGetArktsInspectApiImpl(AbckitApiVersion version)
606 {
607 #ifdef ABCKIT_ENABLE_MOCK_IMPLEMENTATION
608     return AbckitGetMockArktsInspectApiImpl(version);
609 #endif
610     switch (version) {
611         case ABCKIT_VERSION_RELEASE_1_0_0:
612             return &libabckit::g_arktsInspectApiImpl;
613         default:
614             libabckit::statuses::SetLastError(ABCKIT_STATUS_UNKNOWN_API_VERSION);
615             return nullptr;
616     }
617 }
618