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