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