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