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