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