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