• 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/metadata_core.h"
19 
20 #include "libabckit/src/helpers_common.h"
21 #include "libabckit/src/adapter_dynamic/metadata_modify_dynamic.h"
22 #include "libabckit/src/logger.h"
23 #include "libabckit/src/macros.h"
24 
25 #include "libabckit/src/metadata_inspect_impl.h"
26 #include "libabckit/src/metadata_arkts_inspect_impl.h"
27 #include "libabckit/src/metadata_js_inspect_impl.h"
28 #include "libabckit/src/metadata_unknown_inspect_impl.h"
29 #include "libabckit/src/adapter_dynamic/metadata_inspect_dynamic.h"
30 #include "libabckit/src/adapter_static/metadata_inspect_static.h"
31 
32 namespace libabckit {
33 
34 // ========================================
35 // File
36 // ========================================
37 
FileGetVersion(AbckitFile * file)38 extern "C" AbckitFileVersion FileGetVersion(AbckitFile *file)
39 {
40     LIBABCKIT_IMPLEMENTED;
41 
42     LIBABCKIT_BAD_ARGUMENT(file, nullptr);
43 
44     return file->version;
45 }
46 
FileEnumerateModules(AbckitFile * file,void * data,bool (* cb)(AbckitCoreModule * module,void * data))47 extern "C" bool FileEnumerateModules(AbckitFile *file, void *data, bool (*cb)(AbckitCoreModule *module, void *data))
48 {
49     LIBABCKIT_CLEAR_LAST_ERROR;
50     LIBABCKIT_IMPLEMENTED;
51     LIBABCKIT_BAD_ARGUMENT(file, false)
52     LIBABCKIT_BAD_ARGUMENT(cb, false)
53 
54     bool isNormalExit = true;
55     for (auto &[moduleName, module] : file->localModules) {
56         isNormalExit &= cb(module.get(), data);
57     }
58     for (auto &[moduleName, module] : file->externalModules) {
59         isNormalExit &= cb(module.get(), data);
60     }
61     return isNormalExit;
62 }
63 
FileEnumerateExternalModules(AbckitFile * file,void * data,bool (* cb)(AbckitCoreModule * module,void * data))64 extern "C" bool FileEnumerateExternalModules(AbckitFile *file, void *data,
65                                              bool (*cb)(AbckitCoreModule *module, void *data))
66 {
67     LIBABCKIT_CLEAR_LAST_ERROR;
68     LIBABCKIT_IMPLEMENTED;
69     LIBABCKIT_BAD_ARGUMENT(file, false)
70     LIBABCKIT_BAD_ARGUMENT(cb, false)
71     bool isNormalExit = true;
72     for (auto &[moduleName, module] : file->externalModules) {
73         isNormalExit &= cb(module.get(), data);
74     }
75     return isNormalExit;
76 }
77 
78 // ========================================
79 // Module
80 // ========================================
81 
ModuleGetFile(AbckitCoreModule * m)82 extern "C" AbckitFile *ModuleGetFile(AbckitCoreModule *m)
83 {
84     LIBABCKIT_CLEAR_LAST_ERROR;
85     LIBABCKIT_IMPLEMENTED;
86     LIBABCKIT_BAD_ARGUMENT(m, nullptr);
87     return m->file;
88 }
89 
ModuleGetTarget(AbckitCoreModule * m)90 extern "C" AbckitTarget ModuleGetTarget(AbckitCoreModule *m)
91 {
92     LIBABCKIT_IMPLEMENTED;
93     LIBABCKIT_BAD_ARGUMENT(m, ABCKIT_TARGET_UNKNOWN);
94 
95     return m->target;
96 }
97 
ModuleGetName(AbckitCoreModule * m)98 extern "C" AbckitString *ModuleGetName(AbckitCoreModule *m)
99 {
100     LIBABCKIT_CLEAR_LAST_ERROR;
101     LIBABCKIT_IMPLEMENTED;
102     LIBABCKIT_BAD_ARGUMENT(m, nullptr);
103     return m->moduleName;
104 }
105 
ModuleIsExternal(AbckitCoreModule * m)106 extern "C" bool ModuleIsExternal(AbckitCoreModule *m)
107 {
108     LIBABCKIT_CLEAR_LAST_ERROR;
109     LIBABCKIT_IMPLEMENTED;
110     LIBABCKIT_BAD_ARGUMENT(m, false);
111     return m->isExternal;
112 }
113 
ModuleEnumerateImports(AbckitCoreModule * m,void * data,bool (* cb)(AbckitCoreImportDescriptor * i,void * data))114 extern "C" bool ModuleEnumerateImports(AbckitCoreModule *m, void *data,
115                                        bool (*cb)(AbckitCoreImportDescriptor *i, void *data))
116 {
117     LIBABCKIT_CLEAR_LAST_ERROR;
118     LIBABCKIT_IMPLEMENTED;
119 
120     LIBABCKIT_BAD_ARGUMENT(m, false);
121     LIBABCKIT_BAD_ARGUMENT(cb, false);
122     switch (ModuleGetTarget(m)) {
123         case ABCKIT_TARGET_ARK_TS_V1:
124         case ABCKIT_TARGET_ARK_TS_V2:
125             return ArkTSModuleEnumerateImports(m, data, cb);
126         case ABCKIT_TARGET_JS:
127             return JsModuleEnumerateImports(m, data, cb);
128         case ABCKIT_TARGET_UNKNOWN:
129             return UnknownModuleEnumerateStub(m);
130         default:
131             LIBABCKIT_UNREACHABLE;
132     }
133 }
134 
ModuleEnumerateExports(AbckitCoreModule * m,void * data,bool (* cb)(AbckitCoreExportDescriptor * e,void * data))135 extern "C" bool ModuleEnumerateExports(AbckitCoreModule *m, void *data,
136                                        bool (*cb)(AbckitCoreExportDescriptor *e, void *data))
137 {
138     LIBABCKIT_CLEAR_LAST_ERROR;
139     LIBABCKIT_IMPLEMENTED;
140 
141     LIBABCKIT_BAD_ARGUMENT(m, false)
142     LIBABCKIT_BAD_ARGUMENT(cb, false)
143 
144     switch (ModuleGetTarget(m)) {
145         case ABCKIT_TARGET_ARK_TS_V1:
146         case ABCKIT_TARGET_ARK_TS_V2:
147             return ArkTSModuleEnumerateExports(m, data, cb);
148         case ABCKIT_TARGET_JS:
149             return JsModuleEnumerateExports(m, data, cb);
150         case ABCKIT_TARGET_UNKNOWN:
151             return UnknownModuleEnumerateStub(m);
152         default:
153             LIBABCKIT_UNREACHABLE;
154     }
155 }
156 
ModuleEnumerateNamespaces(AbckitCoreModule * m,void * data,bool (* cb)(AbckitCoreNamespace * n,void * data))157 extern "C" bool ModuleEnumerateNamespaces(AbckitCoreModule *m, void *data,
158                                           bool (*cb)(AbckitCoreNamespace *n, void *data))
159 {
160     LIBABCKIT_CLEAR_LAST_ERROR;
161     LIBABCKIT_IMPLEMENTED;
162 
163     LIBABCKIT_BAD_ARGUMENT(m, false)
164     LIBABCKIT_BAD_ARGUMENT(cb, false)
165 
166     switch (ModuleGetTarget(m)) {
167         case ABCKIT_TARGET_ARK_TS_V1:
168         case ABCKIT_TARGET_ARK_TS_V2:
169             return ArkTSModuleEnumerateNamespaces(m, data, cb);
170         case ABCKIT_TARGET_JS:
171             return false;
172         case ABCKIT_TARGET_UNKNOWN:
173             return UnknownModuleEnumerateStub(m);
174         default:
175             LIBABCKIT_UNREACHABLE;
176     }
177 }
178 
ModuleEnumerateClasses(AbckitCoreModule * m,void * data,bool (* cb)(AbckitCoreClass * klass,void * data))179 extern "C" bool ModuleEnumerateClasses(AbckitCoreModule *m, void *data, bool (*cb)(AbckitCoreClass *klass, void *data))
180 {
181     LIBABCKIT_CLEAR_LAST_ERROR;
182     LIBABCKIT_IMPLEMENTED;
183     LIBABCKIT_BAD_ARGUMENT(m, false)
184     LIBABCKIT_BAD_ARGUMENT(cb, false)
185     switch (ModuleGetTarget(m)) {
186         case ABCKIT_TARGET_ARK_TS_V1:
187         case ABCKIT_TARGET_ARK_TS_V2:
188             return ArkTSModuleEnumerateClasses(m, data, cb);
189         case ABCKIT_TARGET_JS:
190             return JsModuleEnumerateClasses(m, data, cb);
191         case ABCKIT_TARGET_UNKNOWN:
192             return UnknownModuleEnumerateStub(m);
193         default:
194             LIBABCKIT_UNREACHABLE;
195     }
196 }
197 
ModuleEnumerateTopLevelFunctions(AbckitCoreModule * m,void * data,bool (* cb)(AbckitCoreFunction * function,void * data))198 extern "C" bool ModuleEnumerateTopLevelFunctions(AbckitCoreModule *m, void *data,
199                                                  bool (*cb)(AbckitCoreFunction *function, void *data))
200 {
201     LIBABCKIT_CLEAR_LAST_ERROR;
202     LIBABCKIT_IMPLEMENTED;
203     LIBABCKIT_BAD_ARGUMENT(m, false)
204     LIBABCKIT_BAD_ARGUMENT(cb, false)
205     switch (ModuleGetTarget(m)) {
206         case ABCKIT_TARGET_ARK_TS_V1:
207         case ABCKIT_TARGET_ARK_TS_V2:
208             return ArkTSModuleEnumerateTopLevelFunctions(m, data, cb);
209         case ABCKIT_TARGET_JS:
210             return JsModuleEnumerateTopLevelFunctions(m, data, cb);
211         case ABCKIT_TARGET_UNKNOWN:
212             return UnknownModuleEnumerateStub(m);
213         default:
214             LIBABCKIT_UNREACHABLE;
215     }
216 }
217 
ModuleEnumerateAnonymousFunctions(AbckitCoreModule * m,void * data,bool (* cb)(AbckitCoreFunction * function,void * data))218 extern "C" bool ModuleEnumerateAnonymousFunctions(AbckitCoreModule *m, void *data,
219                                                   bool (*cb)(AbckitCoreFunction *function, void *data))
220 {
221     LIBABCKIT_CLEAR_LAST_ERROR;
222     LIBABCKIT_IMPLEMENTED;
223     LIBABCKIT_BAD_ARGUMENT(m, false)
224     LIBABCKIT_BAD_ARGUMENT(cb, false)
225     switch (ModuleGetTarget(m)) {
226         case ABCKIT_TARGET_ARK_TS_V1:
227         case ABCKIT_TARGET_ARK_TS_V2:
228             return ArkTSModuleEnumerateAnonymousFunctions(m, data, cb);
229         case ABCKIT_TARGET_JS:
230             return JsModuleEnumerateAnonymousFunctions(m, data, cb);
231         case ABCKIT_TARGET_UNKNOWN:
232             return UnknownModuleEnumerateStub(m);
233         default:
234             LIBABCKIT_UNREACHABLE;
235     }
236 }
237 
ModuleEnumerateAnnotationInterfaces(AbckitCoreModule * m,void * data,bool (* cb)(AbckitCoreAnnotationInterface * ai,void * data))238 extern "C" bool ModuleEnumerateAnnotationInterfaces(AbckitCoreModule *m, void *data,
239                                                     bool (*cb)(AbckitCoreAnnotationInterface *ai, void *data))
240 {
241     LIBABCKIT_CLEAR_LAST_ERROR;
242     LIBABCKIT_IMPLEMENTED;
243     LIBABCKIT_BAD_ARGUMENT(m, false)
244     LIBABCKIT_BAD_ARGUMENT(cb, false)
245     switch (ModuleGetTarget(m)) {
246         case ABCKIT_TARGET_ARK_TS_V1:
247         case ABCKIT_TARGET_ARK_TS_V2:
248             return ArkTSModuleEnumerateAnnotationInterfaces(m, data, cb);
249         case ABCKIT_TARGET_JS:
250             return false;
251         case ABCKIT_TARGET_UNKNOWN:
252             return UnknownModuleEnumerateStub(m);
253         default:
254             LIBABCKIT_UNREACHABLE;
255     }
256 }
257 
258 // ========================================
259 // Namespace
260 // ========================================
261 
NamespaceGetName(AbckitCoreNamespace * n)262 extern "C" AbckitString *NamespaceGetName(AbckitCoreNamespace *n)
263 {
264     LIBABCKIT_CLEAR_LAST_ERROR;
265     LIBABCKIT_IMPLEMENTED;
266     LIBABCKIT_BAD_ARGUMENT(n, nullptr);
267     switch (n->owningModule->target) {
268         case ABCKIT_TARGET_ARK_TS_V1:
269             return NamespaceGetNameDynamic(n);
270         case ABCKIT_TARGET_JS:
271         case ABCKIT_TARGET_ARK_TS_V2:
272             statuses::SetLastError(ABCKIT_STATUS_WRONG_TARGET);
273             return nullptr;
274         default:
275             LIBABCKIT_UNREACHABLE;
276     }
277 }
278 
NamespaceGetParentNamespace(AbckitCoreNamespace * n)279 extern "C" AbckitCoreNamespace *NamespaceGetParentNamespace(AbckitCoreNamespace *n)
280 {
281     LIBABCKIT_CLEAR_LAST_ERROR;
282     LIBABCKIT_IMPLEMENTED;
283     LIBABCKIT_BAD_ARGUMENT(n, nullptr);
284     return n->parentNamespace;
285 }
286 
NamespaceEnumerateNamespaces(AbckitCoreNamespace * n,void * data,bool (* cb)(AbckitCoreNamespace * klass,void * data))287 extern "C" bool NamespaceEnumerateNamespaces(AbckitCoreNamespace *n, void *data,
288                                              bool (*cb)(AbckitCoreNamespace *klass, void *data))
289 {
290     LIBABCKIT_CLEAR_LAST_ERROR;
291     LIBABCKIT_IMPLEMENTED;
292 
293     LIBABCKIT_BAD_ARGUMENT(n, false)
294     LIBABCKIT_BAD_ARGUMENT(cb, false)
295 
296     switch (ModuleGetTarget(n->owningModule)) {
297         case ABCKIT_TARGET_ARK_TS_V1:
298         case ABCKIT_TARGET_ARK_TS_V2:
299             return ArkTSNamespaceEnumerateNamespaces(n, data, cb);
300         case ABCKIT_TARGET_JS:
301             return false;
302         default:
303             LIBABCKIT_UNREACHABLE;
304     }
305 }
306 
NamespaceEnumerateClasses(AbckitCoreNamespace * n,void * data,bool (* cb)(AbckitCoreClass * klass,void * data))307 extern "C" bool NamespaceEnumerateClasses(AbckitCoreNamespace *n, void *data,
308                                           bool (*cb)(AbckitCoreClass *klass, void *data))
309 {
310     LIBABCKIT_CLEAR_LAST_ERROR;
311     LIBABCKIT_IMPLEMENTED;
312 
313     LIBABCKIT_BAD_ARGUMENT(n, false)
314     LIBABCKIT_BAD_ARGUMENT(cb, false)
315 
316     switch (ModuleGetTarget(n->owningModule)) {
317         case ABCKIT_TARGET_ARK_TS_V1:
318         case ABCKIT_TARGET_ARK_TS_V2:
319             return ArkTSNamespaceEnumerateClasses(n, data, cb);
320         case ABCKIT_TARGET_JS:
321             return false;
322         default:
323             LIBABCKIT_UNREACHABLE;
324     }
325 }
326 
NamespaceEnumerateTopLevelFunctions(AbckitCoreNamespace * n,void * data,bool (* cb)(AbckitCoreFunction * func,void * data))327 extern "C" bool NamespaceEnumerateTopLevelFunctions(AbckitCoreNamespace *n, void *data,
328                                                     bool (*cb)(AbckitCoreFunction *func, void *data))
329 {
330     LIBABCKIT_CLEAR_LAST_ERROR;
331     LIBABCKIT_IMPLEMENTED;
332 
333     LIBABCKIT_BAD_ARGUMENT(n, false)
334     LIBABCKIT_BAD_ARGUMENT(cb, false)
335 
336     switch (ModuleGetTarget(n->owningModule)) {
337         case ABCKIT_TARGET_ARK_TS_V1:
338         case ABCKIT_TARGET_ARK_TS_V2:
339             return ArkTSNamespaceEnumerateTopLevelFunctions(n, data, cb);
340         case ABCKIT_TARGET_JS:
341             return false;
342         default:
343             LIBABCKIT_UNREACHABLE;
344     }
345 }
346 
347 // ========================================
348 // ImportDescriptor
349 // ========================================
350 
ImportDescriptorGetFile(AbckitCoreImportDescriptor * i)351 extern "C" AbckitFile *ImportDescriptorGetFile(AbckitCoreImportDescriptor *i)
352 {
353     LIBABCKIT_CLEAR_LAST_ERROR;
354     LIBABCKIT_IMPLEMENTED;
355     LIBABCKIT_BAD_ARGUMENT(i, nullptr);
356     return i->importingModule->file;
357 }
358 
ImportDescriptorGetImportedModule(AbckitCoreImportDescriptor * i)359 extern "C" AbckitCoreModule *ImportDescriptorGetImportedModule(AbckitCoreImportDescriptor *i)
360 {
361     LIBABCKIT_CLEAR_LAST_ERROR;
362     LIBABCKIT_IMPLEMENTED;
363     LIBABCKIT_BAD_ARGUMENT(i, nullptr);
364     return i->importedModule;
365 }
366 
ImportDescriptorGetImportingModule(AbckitCoreImportDescriptor * i)367 extern "C" AbckitCoreModule *ImportDescriptorGetImportingModule(AbckitCoreImportDescriptor *i)
368 {
369     LIBABCKIT_CLEAR_LAST_ERROR;
370     LIBABCKIT_IMPLEMENTED;
371     LIBABCKIT_BAD_ARGUMENT(i, nullptr);
372     return i->importingModule;
373 }
374 
ImportDescriptorGetName(AbckitCoreImportDescriptor * i)375 extern "C" AbckitString *ImportDescriptorGetName(AbckitCoreImportDescriptor *i)
376 {
377     LIBABCKIT_CLEAR_LAST_ERROR;
378     LIBABCKIT_IMPLEMENTED;
379     LIBABCKIT_BAD_ARGUMENT(i, nullptr);
380     if (IsDynamic(i->importingModule->target)) {
381         return ImportDescriptorGetNameDynamic(i);
382     }
383     statuses::SetLastError(ABCKIT_STATUS_UNSUPPORTED);
384     return nullptr;
385 }
386 
ImportDescriptorGetAlias(AbckitCoreImportDescriptor * i)387 extern "C" AbckitString *ImportDescriptorGetAlias(AbckitCoreImportDescriptor *i)
388 {
389     LIBABCKIT_CLEAR_LAST_ERROR;
390     LIBABCKIT_IMPLEMENTED;
391     LIBABCKIT_BAD_ARGUMENT(i, nullptr);
392     if (IsDynamic(i->importingModule->target)) {
393         return ImportDescriptorGetAliasDynamic(i);
394     }
395     statuses::SetLastError(ABCKIT_STATUS_UNSUPPORTED);
396     return nullptr;
397 }
398 
399 // ========================================
400 // ExportDescriptor
401 // ========================================
402 
ExportDescriptorGetFile(AbckitCoreExportDescriptor * i)403 extern "C" AbckitFile *ExportDescriptorGetFile(AbckitCoreExportDescriptor *i)
404 {
405     LIBABCKIT_CLEAR_LAST_ERROR;
406     LIBABCKIT_IMPLEMENTED;
407     LIBABCKIT_BAD_ARGUMENT(i, nullptr);
408     return i->exportingModule->file;
409 }
410 
ExportDescriptorGetExportingModule(AbckitCoreExportDescriptor * i)411 extern "C" AbckitCoreModule *ExportDescriptorGetExportingModule(AbckitCoreExportDescriptor *i)
412 {
413     LIBABCKIT_CLEAR_LAST_ERROR;
414     LIBABCKIT_IMPLEMENTED;
415     LIBABCKIT_BAD_ARGUMENT(i, nullptr);
416     return i->exportingModule;
417 }
418 
ExportDescriptorGetExportedModule(AbckitCoreExportDescriptor * i)419 extern "C" AbckitCoreModule *ExportDescriptorGetExportedModule(AbckitCoreExportDescriptor *i)
420 {
421     LIBABCKIT_CLEAR_LAST_ERROR;
422     LIBABCKIT_IMPLEMENTED;
423     LIBABCKIT_BAD_ARGUMENT(i, nullptr);
424     return i->exportedModule;
425 }
426 
ExportDescriptorGetName(AbckitCoreExportDescriptor * i)427 extern "C" AbckitString *ExportDescriptorGetName(AbckitCoreExportDescriptor *i)
428 {
429     LIBABCKIT_CLEAR_LAST_ERROR;
430     LIBABCKIT_IMPLEMENTED;
431     LIBABCKIT_BAD_ARGUMENT(i, nullptr);
432     if (IsDynamic(i->exportingModule->target)) {
433         return ExportDescriptorGetNameDynamic(i);
434     }
435     statuses::SetLastError(ABCKIT_STATUS_UNSUPPORTED);
436     return nullptr;
437 }
438 
ExportDescriptorGetAlias(AbckitCoreExportDescriptor * i)439 extern "C" AbckitString *ExportDescriptorGetAlias(AbckitCoreExportDescriptor *i)
440 {
441     LIBABCKIT_CLEAR_LAST_ERROR;
442     LIBABCKIT_IMPLEMENTED;
443     LIBABCKIT_BAD_ARGUMENT(i, nullptr);
444     if (IsDynamic(i->exportingModule->target)) {
445         return ExportDescriptorGetAliasDynamic(i);
446     }
447     statuses::SetLastError(ABCKIT_STATUS_UNSUPPORTED);
448     return nullptr;
449 }
450 
451 // ========================================
452 // Class
453 // ========================================
454 
ClassGetFile(AbckitCoreClass * klass)455 extern "C" AbckitFile *ClassGetFile(AbckitCoreClass *klass)
456 {
457     LIBABCKIT_CLEAR_LAST_ERROR;
458     LIBABCKIT_IMPLEMENTED;
459     LIBABCKIT_BAD_ARGUMENT(klass, nullptr);
460     return klass->owningModule->file;
461 }
462 
ClassGetModule(AbckitCoreClass * klass)463 extern "C" AbckitCoreModule *ClassGetModule(AbckitCoreClass *klass)
464 {
465     LIBABCKIT_CLEAR_LAST_ERROR;
466     LIBABCKIT_IMPLEMENTED;
467 
468     LIBABCKIT_BAD_ARGUMENT(klass, nullptr);
469 
470     return klass->owningModule;
471 }
472 
ClassGetName(AbckitCoreClass * klass)473 extern "C" AbckitString *ClassGetName(AbckitCoreClass *klass)
474 {
475     LIBABCKIT_CLEAR_LAST_ERROR;
476     LIBABCKIT_IMPLEMENTED;
477     LIBABCKIT_BAD_ARGUMENT(klass, nullptr)
478 
479     if (IsDynamic(klass->owningModule->target)) {
480         return ClassGetNameDynamic(klass);
481     }
482     return ClassGetNameStatic(klass);
483 }
484 
ClassGetParentFunction(AbckitCoreClass * klass)485 extern "C" AbckitCoreFunction *ClassGetParentFunction(AbckitCoreClass *klass)
486 {
487     LIBABCKIT_CLEAR_LAST_ERROR;
488     LIBABCKIT_IMPLEMENTED;
489     LIBABCKIT_BAD_ARGUMENT(klass, nullptr);
490     return klass->parentFunction;
491 }
492 
ClassGetParentNamespace(AbckitCoreClass * klass)493 extern "C" AbckitCoreNamespace *ClassGetParentNamespace(AbckitCoreClass *klass)
494 {
495     LIBABCKIT_CLEAR_LAST_ERROR;
496     LIBABCKIT_IMPLEMENTED;
497     LIBABCKIT_BAD_ARGUMENT(klass, nullptr);
498     return klass->parentNamespace;
499 }
500 
ClassEnumerateMethods(AbckitCoreClass * klass,void * data,bool (* cb)(AbckitCoreFunction * function,void * data))501 extern "C" bool ClassEnumerateMethods(AbckitCoreClass *klass, void *data,
502                                       bool (*cb)(AbckitCoreFunction *function, void *data))
503 {
504     LIBABCKIT_CLEAR_LAST_ERROR;
505     LIBABCKIT_IMPLEMENTED;
506 
507     LIBABCKIT_BAD_ARGUMENT(klass, false)
508     LIBABCKIT_BAD_ARGUMENT(cb, false)
509 
510     switch (klass->owningModule->target) {
511         case ABCKIT_TARGET_ARK_TS_V1:
512         case ABCKIT_TARGET_ARK_TS_V2:
513             return ArkTSClassEnumerateMethods(klass, data, cb);
514         case ABCKIT_TARGET_JS:
515             return JsClassEnumerateMethods(klass, data, cb);
516         default:
517             LIBABCKIT_UNREACHABLE;
518     }
519 }
520 
ClassEnumerateAnnotations(AbckitCoreClass * klass,void * data,bool (* cb)(AbckitCoreAnnotation * anno,void * data))521 extern "C" bool ClassEnumerateAnnotations(AbckitCoreClass *klass, void *data,
522                                           bool (*cb)(AbckitCoreAnnotation *anno, void *data))
523 {
524     LIBABCKIT_CLEAR_LAST_ERROR;
525     LIBABCKIT_IMPLEMENTED;
526 
527     LIBABCKIT_BAD_ARGUMENT(klass, false)
528     LIBABCKIT_BAD_ARGUMENT(cb, false)
529 
530     switch (ModuleGetTarget(klass->owningModule)) {
531         case ABCKIT_TARGET_ARK_TS_V1:
532         case ABCKIT_TARGET_ARK_TS_V2:
533             return ArkTSClassEnumerateAnnotations(klass, data, cb);
534         case ABCKIT_TARGET_JS:
535             return false;
536         default:
537             LIBABCKIT_UNREACHABLE;
538     }
539 }
540 
541 // ========================================
542 // AnnotationInterface
543 // ========================================
544 
AnnotationInterfaceGetFile(AbckitCoreAnnotationInterface * anno)545 extern "C" AbckitFile *AnnotationInterfaceGetFile(AbckitCoreAnnotationInterface *anno)
546 {
547     LIBABCKIT_CLEAR_LAST_ERROR;
548     LIBABCKIT_IMPLEMENTED;
549 
550     LIBABCKIT_BAD_ARGUMENT(anno, nullptr);
551     return anno->owningModule->file;
552 }
553 
AnnotationInterfaceGetModule(AbckitCoreAnnotationInterface * anno)554 extern "C" AbckitCoreModule *AnnotationInterfaceGetModule(AbckitCoreAnnotationInterface *anno)
555 {
556     LIBABCKIT_CLEAR_LAST_ERROR;
557     LIBABCKIT_IMPLEMENTED;
558 
559     LIBABCKIT_BAD_ARGUMENT(anno, nullptr);
560     return anno->owningModule;
561 }
562 
AnnotationInterfaceGetName(AbckitCoreAnnotationInterface * ai)563 extern "C" AbckitString *AnnotationInterfaceGetName(AbckitCoreAnnotationInterface *ai)
564 {
565     LIBABCKIT_CLEAR_LAST_ERROR;
566     LIBABCKIT_IMPLEMENTED;
567 
568     LIBABCKIT_BAD_ARGUMENT(ai, nullptr);
569 
570     if (IsDynamic(ai->owningModule->target)) {
571         return AnnotationInterfaceGetNameDynamic(ai);
572     }
573     statuses::SetLastError(ABCKIT_STATUS_UNSUPPORTED);
574     return nullptr;
575 }
576 
AnnotationInterfaceEnumerateFields(AbckitCoreAnnotationInterface * ai,void * data,bool (* cb)(AbckitCoreAnnotationInterfaceField * fld,void * data))577 extern "C" bool AnnotationInterfaceEnumerateFields(AbckitCoreAnnotationInterface *ai, void *data,
578                                                    bool (*cb)(AbckitCoreAnnotationInterfaceField *fld, void *data))
579 {
580     LIBABCKIT_CLEAR_LAST_ERROR;
581     LIBABCKIT_IMPLEMENTED;
582 
583     LIBABCKIT_BAD_ARGUMENT(ai, false)
584     LIBABCKIT_BAD_ARGUMENT(cb, false)
585 
586     switch (ModuleGetTarget(ai->owningModule)) {
587         case ABCKIT_TARGET_ARK_TS_V1:
588         case ABCKIT_TARGET_ARK_TS_V2:
589             return ArkTSAnnotationInterfaceEnumerateFields(ai, data, cb);
590         case ABCKIT_TARGET_JS:
591             return false;
592         default:
593             LIBABCKIT_UNREACHABLE;
594     }
595 }
596 
597 // ========================================
598 // AnnotationInterfaceField
599 // ========================================
600 
AnnotationInterfaceFieldGetFile(AbckitCoreAnnotationInterfaceField * fld)601 extern "C" AbckitFile *AnnotationInterfaceFieldGetFile(AbckitCoreAnnotationInterfaceField *fld)
602 {
603     LIBABCKIT_CLEAR_LAST_ERROR;
604     LIBABCKIT_IMPLEMENTED;
605 
606     LIBABCKIT_BAD_ARGUMENT(fld, nullptr);
607 
608     return fld->ai->owningModule->file;
609 }
610 
AnnotationInterfaceFieldGetInterface(AbckitCoreAnnotationInterfaceField * fld)611 extern "C" AbckitCoreAnnotationInterface *AnnotationInterfaceFieldGetInterface(AbckitCoreAnnotationInterfaceField *fld)
612 {
613     LIBABCKIT_CLEAR_LAST_ERROR;
614     LIBABCKIT_IMPLEMENTED;
615 
616     LIBABCKIT_BAD_ARGUMENT(fld, nullptr);
617 
618     return fld->ai;
619 }
620 
AnnotationInterfaceFieldGetName(AbckitCoreAnnotationInterfaceField * fld)621 extern "C" AbckitString *AnnotationInterfaceFieldGetName(AbckitCoreAnnotationInterfaceField *fld)
622 {
623     LIBABCKIT_CLEAR_LAST_ERROR;
624     LIBABCKIT_IMPLEMENTED;
625 
626     LIBABCKIT_BAD_ARGUMENT(fld, nullptr);
627 
628     return fld->name;
629 }
630 
AnnotationInterfaceFieldGetType(AbckitCoreAnnotationInterfaceField * fld)631 extern "C" AbckitType *AnnotationInterfaceFieldGetType(AbckitCoreAnnotationInterfaceField *fld)
632 {
633     LIBABCKIT_CLEAR_LAST_ERROR;
634     LIBABCKIT_IMPLEMENTED;
635 
636     LIBABCKIT_BAD_ARGUMENT(fld, nullptr);
637 
638     return fld->type;
639 }
640 
AnnotationInterfaceFieldGetDefaultValue(AbckitCoreAnnotationInterfaceField * fld)641 extern "C" AbckitValue *AnnotationInterfaceFieldGetDefaultValue(AbckitCoreAnnotationInterfaceField *fld)
642 {
643     LIBABCKIT_CLEAR_LAST_ERROR;
644     LIBABCKIT_IMPLEMENTED;
645 
646     LIBABCKIT_BAD_ARGUMENT(fld, nullptr);
647 
648     return fld->value;
649 }
650 
651 // ========================================
652 // Function
653 // ========================================
654 
FunctionGetFile(AbckitCoreFunction * function)655 extern "C" AbckitFile *FunctionGetFile(AbckitCoreFunction *function)
656 {
657     LIBABCKIT_CLEAR_LAST_ERROR;
658     LIBABCKIT_IMPLEMENTED;
659     LIBABCKIT_BAD_ARGUMENT(function, nullptr);
660     return function->owningModule->file;
661 }
662 
FunctionGetModule(AbckitCoreFunction * function)663 extern "C" AbckitCoreModule *FunctionGetModule(AbckitCoreFunction *function)
664 {
665     LIBABCKIT_CLEAR_LAST_ERROR;
666     LIBABCKIT_IMPLEMENTED;
667 
668     LIBABCKIT_BAD_ARGUMENT(function, nullptr);
669 
670     return function->owningModule;
671 }
672 
FunctionGetName(AbckitCoreFunction * function)673 extern "C" AbckitString *FunctionGetName(AbckitCoreFunction *function)
674 {
675     LIBABCKIT_CLEAR_LAST_ERROR;
676     LIBABCKIT_IMPLEMENTED;
677 
678     LIBABCKIT_BAD_ARGUMENT(function, nullptr);
679 
680     if (IsDynamic(function->owningModule->target)) {
681         return FunctionGetNameDynamic(function);
682     }
683     return FunctionGetNameStatic(function);
684 }
685 
FunctionGetParentFunction(AbckitCoreFunction * function)686 extern "C" AbckitCoreFunction *FunctionGetParentFunction(AbckitCoreFunction *function)
687 {
688     LIBABCKIT_CLEAR_LAST_ERROR;
689     LIBABCKIT_IMPLEMENTED;
690 
691     LIBABCKIT_BAD_ARGUMENT(function, nullptr);
692 
693     return function->parentFunction;
694 }
695 
FunctionGetParentClass(AbckitCoreFunction * function)696 extern "C" AbckitCoreClass *FunctionGetParentClass(AbckitCoreFunction *function)
697 {
698     LIBABCKIT_CLEAR_LAST_ERROR;
699     LIBABCKIT_IMPLEMENTED;
700 
701     LIBABCKIT_BAD_ARGUMENT(function, nullptr);
702 
703     return function->parentClass;
704 }
705 
FunctionGetParentNamespace(AbckitCoreFunction * function)706 extern "C" AbckitCoreNamespace *FunctionGetParentNamespace(AbckitCoreFunction *function)
707 {
708     LIBABCKIT_CLEAR_LAST_ERROR;
709     LIBABCKIT_IMPLEMENTED;
710     LIBABCKIT_BAD_ARGUMENT(function, nullptr);
711     return function->parentNamespace;
712 }
713 
FunctionEnumerateNestedFunctions(AbckitCoreFunction * function,void * data,bool (* cb)(AbckitCoreFunction * nestedFunc,void * data))714 extern "C" bool FunctionEnumerateNestedFunctions(AbckitCoreFunction *function, void *data,
715                                                  bool (*cb)(AbckitCoreFunction *nestedFunc, void *data))
716 {
717     LIBABCKIT_CLEAR_LAST_ERROR;
718     LIBABCKIT_IMPLEMENTED;
719 
720     LIBABCKIT_BAD_ARGUMENT(function, false)
721     LIBABCKIT_BAD_ARGUMENT(cb, false)
722 
723     switch (ModuleGetTarget(function->owningModule)) {
724         case ABCKIT_TARGET_ARK_TS_V1:
725         case ABCKIT_TARGET_ARK_TS_V2:
726             return ArkTSFunctionEnumerateNestedFunctions(function, data, cb);
727         case ABCKIT_TARGET_JS:
728             return JsFunctionEnumerateNestedFunctions(function, data, cb);
729         default:
730             LIBABCKIT_UNREACHABLE;
731     }
732 }
733 
FunctionEnumerateNestedClasses(AbckitCoreFunction * function,void * data,bool (* cb)(AbckitCoreClass * nestedClass,void * data))734 extern "C" bool FunctionEnumerateNestedClasses(AbckitCoreFunction *function, void *data,
735                                                bool (*cb)(AbckitCoreClass *nestedClass, void *data))
736 {
737     LIBABCKIT_CLEAR_LAST_ERROR;
738     LIBABCKIT_IMPLEMENTED;
739 
740     LIBABCKIT_BAD_ARGUMENT(function, false)
741     LIBABCKIT_BAD_ARGUMENT(cb, false)
742 
743     switch (ModuleGetTarget(function->owningModule)) {
744         case ABCKIT_TARGET_ARK_TS_V1:
745         case ABCKIT_TARGET_ARK_TS_V2:
746             return ArkTSFunctionEnumerateNestedClasses(function, data, cb);
747         case ABCKIT_TARGET_JS:
748             return JsFunctionEnumerateNestedClasses(function, data, cb);
749         default:
750             LIBABCKIT_UNREACHABLE;
751     }
752 }
753 
FunctionEnumerateAnnotations(AbckitCoreFunction * function,void * data,bool (* cb)(AbckitCoreAnnotation * anno,void * data))754 extern "C" bool FunctionEnumerateAnnotations(AbckitCoreFunction *function, void *data,
755                                              bool (*cb)(AbckitCoreAnnotation *anno, void *data))
756 {
757     LIBABCKIT_CLEAR_LAST_ERROR;
758     LIBABCKIT_IMPLEMENTED;
759 
760     LIBABCKIT_BAD_ARGUMENT(function, false)
761     LIBABCKIT_BAD_ARGUMENT(cb, false)
762 
763     switch (ModuleGetTarget(function->owningModule)) {
764         case ABCKIT_TARGET_ARK_TS_V1:
765         case ABCKIT_TARGET_ARK_TS_V2:
766             return ArkTSFunctionEnumerateAnnotations(function, data, cb);
767         case ABCKIT_TARGET_JS:
768             return false;
769         default:
770             LIBABCKIT_UNREACHABLE;
771     }
772 }
773 
CreateGraphFromFunction(AbckitCoreFunction * function)774 extern "C" AbckitGraph *CreateGraphFromFunction(AbckitCoreFunction *function)
775 {
776     LIBABCKIT_CLEAR_LAST_ERROR;
777     LIBABCKIT_IMPLEMENTED;
778     LIBABCKIT_BAD_ARGUMENT(function, nullptr);
779 
780     if (IsDynamic(function->owningModule->target)) {
781         return CreateGraphFromFunctionDynamic(function);
782     }
783     return CreateGraphFromFunctionStatic(function);
784 }
785 
FunctionIsStatic(AbckitCoreFunction * function)786 extern "C" bool FunctionIsStatic(AbckitCoreFunction *function)
787 {
788     LIBABCKIT_CLEAR_LAST_ERROR;
789     LIBABCKIT_IMPLEMENTED;
790     LIBABCKIT_BAD_ARGUMENT(function, false);
791 
792     if (IsDynamic(function->owningModule->target)) {
793         return FunctionIsStaticDynamic(function);
794     }
795     return FunctionIsStaticStatic(function);
796 }
797 
FunctionIsCtor(AbckitCoreFunction * function)798 extern "C" bool FunctionIsCtor(AbckitCoreFunction *function)
799 {
800     LIBABCKIT_CLEAR_LAST_ERROR;
801     LIBABCKIT_IMPLEMENTED;
802     LIBABCKIT_BAD_ARGUMENT(function, false);
803 
804     if (IsDynamic(function->owningModule->target)) {
805         return FunctionIsCtorDynamic(function);
806     }
807     return FunctionIsCtorStatic(function);
808 }
809 
FunctionIsAnonymous(AbckitCoreFunction * function)810 extern "C" bool FunctionIsAnonymous(AbckitCoreFunction *function)
811 {
812     LIBABCKIT_CLEAR_LAST_ERROR;
813     LIBABCKIT_IMPLEMENTED;
814     LIBABCKIT_BAD_ARGUMENT(function, false);
815 
816     if (IsDynamic(function->owningModule->target)) {
817         return FunctionIsAnonymousDynamic(function);
818     }
819     return FunctionIsAnonymousStatic(function);
820 }
821 
822 // ========================================
823 // Annotation
824 // ========================================
825 
AnnotationGetFile(AbckitCoreAnnotation * anno)826 extern "C" AbckitFile *AnnotationGetFile(AbckitCoreAnnotation *anno)
827 {
828     LIBABCKIT_CLEAR_LAST_ERROR;
829     LIBABCKIT_IMPLEMENTED;
830 
831     LIBABCKIT_BAD_ARGUMENT(anno, nullptr);
832 
833     return anno->ai->owningModule->file;
834 }
835 
AnnotationGetInterface(AbckitCoreAnnotation * anno)836 extern "C" AbckitCoreAnnotationInterface *AnnotationGetInterface(AbckitCoreAnnotation *anno)
837 {
838     LIBABCKIT_CLEAR_LAST_ERROR;
839     LIBABCKIT_IMPLEMENTED;
840 
841     LIBABCKIT_BAD_ARGUMENT(anno, nullptr);
842 
843     return anno->ai;
844 }
845 
AnnotationEnumerateElements(AbckitCoreAnnotation * anno,void * data,bool (* cb)(AbckitCoreAnnotationElement * ae,void * data))846 extern "C" bool AnnotationEnumerateElements(AbckitCoreAnnotation *anno, void *data,
847                                             bool (*cb)(AbckitCoreAnnotationElement *ae, void *data))
848 {
849     LIBABCKIT_CLEAR_LAST_ERROR;
850     LIBABCKIT_IMPLEMENTED;
851 
852     LIBABCKIT_BAD_ARGUMENT(anno, false)
853     LIBABCKIT_BAD_ARGUMENT(cb, false)
854 
855     AbckitCoreModule *m = anno->ai->owningModule;
856 
857     switch (ModuleGetTarget(m)) {
858         case ABCKIT_TARGET_ARK_TS_V1:
859         case ABCKIT_TARGET_ARK_TS_V2:
860             return ArkTSAnnotationEnumerateElements(anno, data, cb);
861         case ABCKIT_TARGET_JS:
862             return false;
863         default:
864             LIBABCKIT_UNREACHABLE;
865     }
866 }
867 
868 // ========================================
869 // AnnotationElement
870 // ========================================
871 
AnnotationElementGetFile(AbckitCoreAnnotationElement * ae)872 extern "C" AbckitFile *AnnotationElementGetFile(AbckitCoreAnnotationElement *ae)
873 {
874     LIBABCKIT_CLEAR_LAST_ERROR;
875     LIBABCKIT_IMPLEMENTED;
876 
877     LIBABCKIT_BAD_ARGUMENT(ae, nullptr);
878 
879     return ae->ann->ai->owningModule->file;
880 }
881 
AnnotationElementGetAnnotation(AbckitCoreAnnotationElement * ae)882 extern "C" AbckitCoreAnnotation *AnnotationElementGetAnnotation(AbckitCoreAnnotationElement *ae)
883 {
884     LIBABCKIT_CLEAR_LAST_ERROR;
885     LIBABCKIT_IMPLEMENTED;
886 
887     LIBABCKIT_BAD_ARGUMENT(ae, nullptr);
888 
889     return ae->ann;
890 }
891 
AnnotationElementGetName(AbckitCoreAnnotationElement * ae)892 extern "C" AbckitString *AnnotationElementGetName(AbckitCoreAnnotationElement *ae)
893 {
894     LIBABCKIT_CLEAR_LAST_ERROR;
895     LIBABCKIT_IMPLEMENTED;
896 
897     LIBABCKIT_BAD_ARGUMENT(ae, nullptr);
898 
899     return ae->name;
900 }
901 
AnnotationElementGetValue(AbckitCoreAnnotationElement * ae)902 extern "C" AbckitValue *AnnotationElementGetValue(AbckitCoreAnnotationElement *ae)
903 {
904     LIBABCKIT_CLEAR_LAST_ERROR;
905     LIBABCKIT_IMPLEMENTED;
906 
907     LIBABCKIT_BAD_ARGUMENT(ae, nullptr);
908 
909     return ae->value;
910 }
911 
912 // ========================================
913 // Type
914 // ========================================
915 
TypeGetTypeId(AbckitType * type)916 extern "C" AbckitTypeId TypeGetTypeId(AbckitType *type)
917 {
918     LIBABCKIT_CLEAR_LAST_ERROR;
919     LIBABCKIT_IMPLEMENTED;
920     LIBABCKIT_BAD_ARGUMENT(type, AbckitTypeId::ABCKIT_TYPE_ID_INVALID);
921 
922     return type->id;
923 }
924 
TypeGetReferenceClass(AbckitType * type)925 extern "C" AbckitCoreClass *TypeGetReferenceClass(AbckitType *type)
926 {
927     LIBABCKIT_CLEAR_LAST_ERROR;
928     LIBABCKIT_IMPLEMENTED;
929     LIBABCKIT_BAD_ARGUMENT(type, nullptr);
930     if (type->id != AbckitTypeId::ABCKIT_TYPE_ID_REFERENCE) {
931         return nullptr;
932     }
933 
934     return type->klass;
935 }
936 
937 // ========================================
938 // Value
939 // ========================================
940 
ValueGetFile(AbckitValue * value)941 extern "C" AbckitFile *ValueGetFile(AbckitValue *value)
942 {
943     LIBABCKIT_CLEAR_LAST_ERROR;
944     LIBABCKIT_IMPLEMENTED;
945 
946     LIBABCKIT_BAD_ARGUMENT(value, nullptr);
947 
948     return value->file;
949 }
950 
ValueGetType(AbckitValue * value)951 extern "C" AbckitType *ValueGetType(AbckitValue *value)
952 {
953     LIBABCKIT_CLEAR_LAST_ERROR;
954     LIBABCKIT_IMPLEMENTED;
955 
956     LIBABCKIT_BAD_ARGUMENT(value, nullptr);
957 
958     switch (value->file->frontend) {
959         case Mode::DYNAMIC:
960             return ValueGetTypeDynamic(value);
961         case Mode::STATIC:
962             return ValueGetTypeStatic(value);
963         default:
964             LIBABCKIT_UNREACHABLE;
965     }
966 }
967 
ValueGetU1(AbckitValue * value)968 extern "C" bool ValueGetU1(AbckitValue *value)
969 {
970     LIBABCKIT_CLEAR_LAST_ERROR;
971     LIBABCKIT_IMPLEMENTED;
972 
973     LIBABCKIT_BAD_ARGUMENT(value, false);
974 
975     switch (value->file->frontend) {
976         case Mode::DYNAMIC:
977             return ValueGetU1Dynamic(value);
978         case Mode::STATIC:
979             return ValueGetU1Static(value);
980         default:
981             LIBABCKIT_UNREACHABLE;
982     }
983 }
984 
ValueGetDouble(AbckitValue * value)985 extern "C" double ValueGetDouble(AbckitValue *value)
986 {
987     LIBABCKIT_CLEAR_LAST_ERROR;
988     LIBABCKIT_IMPLEMENTED;
989 
990     LIBABCKIT_BAD_ARGUMENT(value, 0);
991 
992     switch (value->file->frontend) {
993         case Mode::DYNAMIC:
994             return ValueGetDoubleDynamic(value);
995         case Mode::STATIC:
996             return ValueGetDoubleStatic(value);
997         default:
998             LIBABCKIT_UNREACHABLE;
999     }
1000 }
1001 
ValueGetString(AbckitValue * value)1002 extern "C" AbckitString *ValueGetString(AbckitValue *value)
1003 {
1004     LIBABCKIT_CLEAR_LAST_ERROR;
1005     LIBABCKIT_IMPLEMENTED;
1006 
1007     LIBABCKIT_BAD_ARGUMENT(value, nullptr);
1008 
1009     switch (value->file->frontend) {
1010         case Mode::DYNAMIC:
1011             return ValueGetStringDynamic(value);
1012         case Mode::STATIC:
1013             return ValueGetStringStatic(value);
1014         default:
1015             LIBABCKIT_UNREACHABLE;
1016     }
1017 }
1018 
ArrayValueGetLiteralArray(AbckitValue * value)1019 extern "C" AbckitLiteralArray *ArrayValueGetLiteralArray(AbckitValue *value)
1020 {
1021     LIBABCKIT_CLEAR_LAST_ERROR;
1022     LIBABCKIT_IMPLEMENTED;
1023 
1024     LIBABCKIT_BAD_ARGUMENT(value, nullptr);
1025 
1026     switch (value->file->frontend) {
1027         case Mode::DYNAMIC:
1028             return ArrayValueGetLiteralArrayDynamic(value);
1029         case Mode::STATIC:
1030             return ArrayValueGetLiteralArrayStatic(value);
1031         default:
1032             LIBABCKIT_UNREACHABLE;
1033     }
1034 }
1035 
1036 // ========================================
1037 // String
1038 // ========================================
1039 
AbckitStringToString(AbckitString * value)1040 extern "C" const char *AbckitStringToString(AbckitString *value)
1041 {
1042     LIBABCKIT_CLEAR_LAST_ERROR;
1043     LIBABCKIT_IMPLEMENTED;
1044 
1045     LIBABCKIT_BAD_ARGUMENT(value, nullptr);
1046 
1047     return value->impl.data();
1048 }
1049 
1050 // ========================================
1051 // LiteralArray
1052 // ========================================
1053 
LiteralArrayEnumerateElements(AbckitLiteralArray * litArr,void * data,bool (* cb)(AbckitFile * file,AbckitLiteral * v,void * data))1054 extern "C" bool LiteralArrayEnumerateElements(AbckitLiteralArray *litArr, void *data,
1055                                               bool (*cb)(AbckitFile *file, AbckitLiteral *v, void *data))
1056 {
1057     LIBABCKIT_CLEAR_LAST_ERROR;
1058     LIBABCKIT_IMPLEMENTED;
1059 
1060     LIBABCKIT_BAD_ARGUMENT(litArr, false);
1061     LIBABCKIT_BAD_ARGUMENT(cb, false);
1062 
1063     switch (litArr->file->frontend) {
1064         case Mode::DYNAMIC:
1065             return LiteralArrayEnumerateElementsDynamic(litArr, data, cb);
1066         case Mode::STATIC:
1067             statuses::SetLastError(ABCKIT_STATUS_UNSUPPORTED);
1068             return false;
1069         default:
1070             LIBABCKIT_UNREACHABLE;
1071     }
1072 }
1073 
1074 // ========================================
1075 // Literal
1076 // ========================================
1077 
LiteralGetFile(AbckitLiteral * lit)1078 extern "C" AbckitFile *LiteralGetFile(AbckitLiteral *lit)
1079 {
1080     LIBABCKIT_CLEAR_LAST_ERROR;
1081     LIBABCKIT_IMPLEMENTED;
1082 
1083     LIBABCKIT_BAD_ARGUMENT(lit, nullptr);
1084 
1085     return lit->file;
1086 }
1087 
LiteralGetTag(AbckitLiteral * lit)1088 extern "C" AbckitLiteralTag LiteralGetTag(AbckitLiteral *lit)
1089 {
1090     LIBABCKIT_CLEAR_LAST_ERROR;
1091     LIBABCKIT_IMPLEMENTED;
1092 
1093     LIBABCKIT_BAD_ARGUMENT(lit, ABCKIT_LITERAL_TAG_INVALID);
1094 
1095     switch (lit->file->frontend) {
1096         case Mode::DYNAMIC:
1097             return LiteralGetTagDynamic(lit);
1098         case Mode::STATIC:
1099             return LiteralGetTagStatic(lit);
1100         default:
1101             LIBABCKIT_UNREACHABLE;
1102     }
1103 }
1104 
LiteralGetBool(AbckitLiteral * lit)1105 extern "C" bool LiteralGetBool(AbckitLiteral *lit)
1106 {
1107     LIBABCKIT_CLEAR_LAST_ERROR;
1108     LIBABCKIT_IMPLEMENTED;
1109 
1110     LIBABCKIT_BAD_ARGUMENT(lit, false);
1111 
1112     switch (lit->file->frontend) {
1113         case Mode::DYNAMIC:
1114             return LiteralGetBoolDynamic(lit);
1115         case Mode::STATIC:
1116             return LiteralGetBoolStatic(lit);
1117         default:
1118             LIBABCKIT_UNREACHABLE;
1119     }
1120 }
1121 
LiteralGetU8(AbckitLiteral * lit)1122 extern "C" uint8_t LiteralGetU8(AbckitLiteral *lit)
1123 {
1124     LIBABCKIT_CLEAR_LAST_ERROR;
1125     LIBABCKIT_IMPLEMENTED;
1126 
1127     LIBABCKIT_BAD_ARGUMENT(lit, 0);
1128 
1129     switch (lit->file->frontend) {
1130         case Mode::DYNAMIC:
1131             return LiteralGetU8Dynamic(lit);
1132         case Mode::STATIC:
1133             return LiteralGetU8Static(lit);
1134         default:
1135             LIBABCKIT_UNREACHABLE;
1136     }
1137 }
1138 
LiteralGetU16(AbckitLiteral * lit)1139 extern "C" uint16_t LiteralGetU16(AbckitLiteral *lit)
1140 {
1141     LIBABCKIT_CLEAR_LAST_ERROR;
1142     LIBABCKIT_IMPLEMENTED;
1143 
1144     LIBABCKIT_BAD_ARGUMENT(lit, 0);
1145 
1146     switch (lit->file->frontend) {
1147         case Mode::DYNAMIC:
1148             return LiteralGetU16Dynamic(lit);
1149         case Mode::STATIC:
1150             return LiteralGetU16Static(lit);
1151         default:
1152             LIBABCKIT_UNREACHABLE;
1153     }
1154 }
1155 
LiteralGetMethodAffiliate(AbckitLiteral * lit)1156 extern "C" uint16_t LiteralGetMethodAffiliate(AbckitLiteral *lit)
1157 {
1158     LIBABCKIT_CLEAR_LAST_ERROR;
1159     LIBABCKIT_IMPLEMENTED;
1160 
1161     LIBABCKIT_BAD_ARGUMENT(lit, 0);
1162 
1163     switch (lit->file->frontend) {
1164         case Mode::DYNAMIC:
1165             return LiteralGetMethodAffiliateDynamic(lit);
1166         case Mode::STATIC:
1167             return LiteralGetMethodAffiliateStatic(lit);
1168         default:
1169             LIBABCKIT_UNREACHABLE;
1170     }
1171 }
1172 
LiteralGetU32(AbckitLiteral * lit)1173 extern "C" uint32_t LiteralGetU32(AbckitLiteral *lit)
1174 {
1175     LIBABCKIT_CLEAR_LAST_ERROR;
1176     LIBABCKIT_IMPLEMENTED;
1177 
1178     LIBABCKIT_BAD_ARGUMENT(lit, 0);
1179 
1180     switch (lit->file->frontend) {
1181         case Mode::DYNAMIC:
1182             return LiteralGetU32Dynamic(lit);
1183         case Mode::STATIC:
1184             return LiteralGetU32Static(lit);
1185         default:
1186             LIBABCKIT_UNREACHABLE;
1187     }
1188 }
1189 
LiteralGetU64(AbckitLiteral * lit)1190 extern "C" uint64_t LiteralGetU64(AbckitLiteral *lit)
1191 {
1192     LIBABCKIT_CLEAR_LAST_ERROR;
1193     LIBABCKIT_IMPLEMENTED;
1194 
1195     LIBABCKIT_BAD_ARGUMENT(lit, 0);
1196 
1197     switch (lit->file->frontend) {
1198         case Mode::DYNAMIC:
1199             return LiteralGetU64Dynamic(lit);
1200         case Mode::STATIC:
1201             return LiteralGetU64Static(lit);
1202         default:
1203             LIBABCKIT_UNREACHABLE;
1204     }
1205 }
1206 
LiteralGetFloat(AbckitLiteral * lit)1207 extern "C" float LiteralGetFloat(AbckitLiteral *lit)
1208 {
1209     LIBABCKIT_CLEAR_LAST_ERROR;
1210     LIBABCKIT_IMPLEMENTED;
1211 
1212     LIBABCKIT_BAD_ARGUMENT(lit, 0);
1213 
1214     switch (lit->file->frontend) {
1215         case Mode::DYNAMIC:
1216             return LiteralGetFloatDynamic(lit);
1217         case Mode::STATIC:
1218             return LiteralGetFloatStatic(lit);
1219         default:
1220             LIBABCKIT_UNREACHABLE;
1221     }
1222 }
1223 
LiteralGetDouble(AbckitLiteral * lit)1224 extern "C" double LiteralGetDouble(AbckitLiteral *lit)
1225 {
1226     LIBABCKIT_CLEAR_LAST_ERROR;
1227     LIBABCKIT_IMPLEMENTED;
1228 
1229     LIBABCKIT_BAD_ARGUMENT(lit, 0);
1230 
1231     switch (lit->file->frontend) {
1232         case Mode::DYNAMIC:
1233             return LiteralGetDoubleDynamic(lit);
1234         case Mode::STATIC:
1235             return LiteralGetDoubleStatic(lit);
1236         default:
1237             LIBABCKIT_UNREACHABLE;
1238     }
1239 }
1240 
LiteralGetLiteralArray(AbckitLiteral * lit)1241 extern "C" AbckitLiteralArray *LiteralGetLiteralArray(AbckitLiteral *lit)
1242 {
1243     LIBABCKIT_CLEAR_LAST_ERROR;
1244     LIBABCKIT_IMPLEMENTED;
1245 
1246     LIBABCKIT_BAD_ARGUMENT(lit, nullptr);
1247 
1248     switch (lit->file->frontend) {
1249         case Mode::DYNAMIC:
1250             return LiteralGetLiteralArrayDynamic(lit);
1251         case Mode::STATIC:
1252             statuses::SetLastError(ABCKIT_STATUS_UNSUPPORTED);
1253             return nullptr;
1254         default:
1255             LIBABCKIT_UNREACHABLE;
1256     }
1257 }
1258 
LiteralGetString(AbckitLiteral * lit)1259 extern "C" AbckitString *LiteralGetString(AbckitLiteral *lit)
1260 {
1261     LIBABCKIT_CLEAR_LAST_ERROR;
1262     LIBABCKIT_IMPLEMENTED;
1263 
1264     LIBABCKIT_BAD_ARGUMENT(lit, nullptr);
1265 
1266     switch (lit->file->frontend) {
1267         case Mode::DYNAMIC:
1268             return LiteralGetStringDynamic(lit);
1269         case Mode::STATIC:
1270             return LiteralGetStringStatic(lit);
1271         default:
1272             LIBABCKIT_UNREACHABLE;
1273     }
1274 }
1275 
LiteralGetMethod(AbckitLiteral * lit)1276 extern "C" AbckitString *LiteralGetMethod(AbckitLiteral *lit)
1277 {
1278     LIBABCKIT_CLEAR_LAST_ERROR;
1279     LIBABCKIT_IMPLEMENTED;
1280 
1281     LIBABCKIT_BAD_ARGUMENT(lit, nullptr);
1282 
1283     switch (lit->file->frontend) {
1284         case Mode::DYNAMIC:
1285             return LiteralGetStringDynamic(lit);
1286         case Mode::STATIC:
1287             statuses::SetLastError(ABCKIT_STATUS_UNSUPPORTED);
1288             return nullptr;
1289         default:
1290             LIBABCKIT_UNREACHABLE;
1291     }
1292 }
1293 
1294 AbckitInspectApi g_inspectApiImpl = {
1295     // ========================================
1296     // File
1297     // ========================================
1298 
1299     FileGetVersion,
1300     FileEnumerateModules,
1301     FileEnumerateExternalModules,
1302 
1303     // ========================================
1304     // String
1305     // ========================================
1306 
1307     AbckitStringToString,
1308 
1309     // ========================================
1310     // Type
1311     // ========================================
1312 
1313     TypeGetTypeId,
1314     TypeGetReferenceClass,
1315 
1316     // ========================================
1317     // Value
1318     // ========================================
1319 
1320     ValueGetFile,
1321     ValueGetType,
1322     ValueGetU1,
1323     ValueGetDouble,
1324     ValueGetString,
1325     ArrayValueGetLiteralArray,
1326 
1327     // ========================================
1328     // Literal
1329     // ========================================
1330 
1331     LiteralGetFile,
1332     LiteralGetTag,
1333     LiteralGetBool,
1334     LiteralGetU8,
1335     LiteralGetU16,
1336     LiteralGetMethodAffiliate,
1337     LiteralGetU32,
1338     LiteralGetU64,
1339     LiteralGetFloat,
1340     LiteralGetDouble,
1341     LiteralGetLiteralArray,
1342     LiteralGetString,
1343     LiteralGetMethod,
1344 
1345     // ========================================
1346     // LiteralArray
1347     // ========================================
1348 
1349     LiteralArrayEnumerateElements,
1350 
1351     // ========================================
1352     // Module
1353     // ========================================
1354 
1355     ModuleGetFile,
1356     ModuleGetTarget,
1357     ModuleGetName,
1358     ModuleIsExternal,
1359     ModuleEnumerateImports,
1360     ModuleEnumerateExports,
1361     ModuleEnumerateNamespaces,
1362     ModuleEnumerateClasses,
1363     ModuleEnumerateTopLevelFunctions,
1364     ModuleEnumerateAnonymousFunctions,
1365     ModuleEnumerateAnnotationInterfaces,
1366 
1367     // ========================================
1368     // Namespace
1369     // ========================================
1370 
1371     NamespaceGetName,
1372     NamespaceGetParentNamespace,
1373     NamespaceEnumerateNamespaces,
1374     NamespaceEnumerateClasses,
1375     NamespaceEnumerateTopLevelFunctions,
1376 
1377     // ========================================
1378     // ImportDescriptor
1379     // ========================================
1380 
1381     ImportDescriptorGetFile,
1382     ImportDescriptorGetImportingModule,
1383     ImportDescriptorGetImportedModule,
1384     ImportDescriptorGetName,
1385     ImportDescriptorGetAlias,
1386 
1387     // ========================================
1388     // ExportDescriptor
1389     // ========================================
1390 
1391     ExportDescriptorGetFile,
1392     ExportDescriptorGetExportingModule,
1393     ExportDescriptorGetExportedModule,
1394     ExportDescriptorGetName,
1395     ExportDescriptorGetAlias,
1396 
1397     // ========================================
1398     // Class
1399     // ========================================
1400 
1401     ClassGetFile,
1402     ClassGetModule,
1403     ClassGetName,
1404     ClassGetParentFunction,
1405     ClassGetParentNamespace,
1406     ClassEnumerateMethods,
1407     ClassEnumerateAnnotations,
1408 
1409     // ========================================
1410     // Function
1411     // ========================================
1412 
1413     FunctionGetFile,
1414     FunctionGetModule,
1415     FunctionGetName,
1416     FunctionGetParentFunction,
1417     FunctionGetParentClass,
1418     FunctionGetParentNamespace,
1419     FunctionEnumerateNestedFunctions,
1420     FunctionEnumerateNestedClasses,
1421     FunctionEnumerateAnnotations,
1422     CreateGraphFromFunction,
1423     FunctionIsStatic,
1424     FunctionIsCtor,
1425     FunctionIsAnonymous,
1426 
1427     // ========================================
1428     // Annotation
1429     // ========================================
1430 
1431     AnnotationGetFile,
1432     AnnotationGetInterface,
1433     AnnotationEnumerateElements,
1434     AnnotationElementGetFile,
1435     AnnotationElementGetAnnotation,
1436     AnnotationElementGetName,
1437     AnnotationElementGetValue,
1438 
1439     // ========================================
1440     // AnnotationInterface
1441     // ========================================
1442 
1443     AnnotationInterfaceGetFile,
1444     AnnotationInterfaceGetModule,
1445     AnnotationInterfaceGetName,
1446     AnnotationInterfaceEnumerateFields,
1447 
1448     // ========================================
1449     // AnnotationInterfaceField
1450     // ========================================
1451 
1452     AnnotationInterfaceFieldGetFile,
1453     AnnotationInterfaceFieldGetInterface,
1454     AnnotationInterfaceFieldGetName,
1455     AnnotationInterfaceFieldGetType,
1456     AnnotationInterfaceFieldGetDefaultValue,
1457 };
1458 
1459 }  // namespace libabckit
1460 
1461 #ifdef ABCKIT_ENABLE_MOCK_IMPLEMENTATION
1462 #include "./mock/abckit_mock.h"
1463 #endif
1464 
AbckitGetInspectApiImpl(AbckitApiVersion version)1465 extern "C" AbckitInspectApi const *AbckitGetInspectApiImpl(AbckitApiVersion version)
1466 {
1467 #ifdef ABCKIT_ENABLE_MOCK_IMPLEMENTATION
1468     return AbckitGetMockInspectApiImpl(version);
1469 #endif
1470     switch (version) {
1471         case ABCKIT_VERSION_RELEASE_1_0_0:
1472             return &libabckit::g_inspectApiImpl;
1473         default:
1474             libabckit::statuses::SetLastError(ABCKIT_STATUS_UNKNOWN_API_VERSION);
1475             return nullptr;
1476     }
1477 }
1478