1 /**
2 * Copyright (c) 2024 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 #include <cassert>
17 #include "libabckit/include/c/abckit.h"
18 #include "libabckit/include/c/extensions/js/metadata_js.h"
19
20 #include "libabckit/src/adapter_dynamic/metadata_modify_dynamic.h"
21 #include "libabckit/src/macros.h"
22 #include "scoped_timer.h"
23
24 #include "libabckit/src/metadata_inspect_impl.h"
25 #include "libabckit/src/adapter_dynamic/metadata_inspect_dynamic.h"
26 #include "libabckit/src/adapter_static/metadata_inspect_static.h"
27 #include "libabckit/src/helpers_common.h"
28
29 // CC-OFFNXT(G.PRE.02) code readability
30 // NOLINTNEXTLINE(cppcoreguidelines-macro-usage)
31 #define LIBABCKIT_CHECK_JS_TARGET(m) \
32 if ((m)->target != ABCKIT_TARGET_JS) { \
33 libabckit::statuses::SetLastError(ABCKIT_STATUS_WRONG_TARGET); \
34 /* CC-OFFNXT(G.PRE.05) code generation */ \
35 return nullptr; \
36 }
37
38 namespace libabckit {
39
40 // ========================================
41 // File
42 // ========================================
43
44 // ========================================
45 // Module
46 // ========================================
47
JsModuleToCoreModule(AbckitJsModule * m)48 extern "C" AbckitCoreModule *JsModuleToCoreModule(AbckitJsModule *m)
49 {
50 LIBABCKIT_CLEAR_LAST_ERROR;
51 LIBABCKIT_IMPLEMENTED;
52 LIBABCKIT_TIME_EXEC;
53 LIBABCKIT_BAD_ARGUMENT(m, nullptr);
54 return m->core;
55 }
56
CoreModuleToJsModule(AbckitCoreModule * m)57 extern "C" AbckitJsModule *CoreModuleToJsModule(AbckitCoreModule *m)
58 {
59 LIBABCKIT_CLEAR_LAST_ERROR;
60 LIBABCKIT_IMPLEMENTED;
61 LIBABCKIT_TIME_EXEC;
62 LIBABCKIT_BAD_ARGUMENT(m, nullptr);
63 LIBABCKIT_CHECK_JS_TARGET(m);
64 return m->GetJsImpl();
65 }
66
67 // ========================================
68 // ImportDescriptor
69 // ========================================
70
JsImportDescriptorToCoreImportDescriptor(AbckitJsImportDescriptor * id)71 extern "C" AbckitCoreImportDescriptor *JsImportDescriptorToCoreImportDescriptor(AbckitJsImportDescriptor *id)
72 {
73 LIBABCKIT_CLEAR_LAST_ERROR;
74 LIBABCKIT_IMPLEMENTED;
75 LIBABCKIT_TIME_EXEC;
76 LIBABCKIT_BAD_ARGUMENT(id, nullptr);
77 return id->core;
78 }
79
CoreImportDescriptorToJsImportDescriptor(AbckitCoreImportDescriptor * id)80 extern "C" AbckitJsImportDescriptor *CoreImportDescriptorToJsImportDescriptor(AbckitCoreImportDescriptor *id)
81 {
82 LIBABCKIT_CLEAR_LAST_ERROR;
83 LIBABCKIT_IMPLEMENTED;
84 LIBABCKIT_TIME_EXEC;
85 LIBABCKIT_BAD_ARGUMENT(id, nullptr);
86 LIBABCKIT_CHECK_JS_TARGET(id->importingModule);
87 return id->GetJsImpl();
88 }
89
90 // ========================================
91 // ExportDescriptor
92 // ========================================
93
JsExportDescriptorToCoreExportDescriptor(AbckitJsExportDescriptor * ed)94 extern "C" AbckitCoreExportDescriptor *JsExportDescriptorToCoreExportDescriptor(AbckitJsExportDescriptor *ed)
95 {
96 LIBABCKIT_CLEAR_LAST_ERROR;
97 LIBABCKIT_IMPLEMENTED;
98 LIBABCKIT_TIME_EXEC;
99 LIBABCKIT_BAD_ARGUMENT(ed, nullptr);
100 return ed->core;
101 }
102
CoreExportDescriptorToJsExportDescriptor(AbckitCoreExportDescriptor * ed)103 extern "C" AbckitJsExportDescriptor *CoreExportDescriptorToJsExportDescriptor(AbckitCoreExportDescriptor *ed)
104 {
105 LIBABCKIT_CLEAR_LAST_ERROR;
106 LIBABCKIT_IMPLEMENTED;
107 LIBABCKIT_TIME_EXEC;
108 LIBABCKIT_BAD_ARGUMENT(ed, nullptr);
109 LIBABCKIT_CHECK_JS_TARGET(ed->exportingModule);
110 return ed->GetJsImpl();
111 }
112
113 // ========================================
114 // Class
115 // ========================================
116
JsClassToCoreClass(AbckitJsClass * c)117 extern "C" AbckitCoreClass *JsClassToCoreClass(AbckitJsClass *c)
118 {
119 LIBABCKIT_CLEAR_LAST_ERROR;
120 LIBABCKIT_IMPLEMENTED;
121 LIBABCKIT_TIME_EXEC;
122 LIBABCKIT_BAD_ARGUMENT(c, nullptr);
123 return c->core;
124 }
125
CoreClassToJsClass(AbckitCoreClass * c)126 extern "C" AbckitJsClass *CoreClassToJsClass(AbckitCoreClass *c)
127 {
128 LIBABCKIT_CLEAR_LAST_ERROR;
129 LIBABCKIT_IMPLEMENTED;
130 LIBABCKIT_TIME_EXEC;
131 LIBABCKIT_BAD_ARGUMENT(c, nullptr);
132 LIBABCKIT_CHECK_JS_TARGET(c->owningModule);
133 return c->GetJsImpl();
134 }
135
136 // ========================================
137 // AnnotationInterface
138 // ========================================
139
140 // ========================================
141 // AnnotationInterfaceField
142 // ========================================
143
144 // ========================================
145 // Function
146 // ========================================
147
JsFunctionToCoreFunction(AbckitJsFunction * m)148 extern "C" AbckitCoreFunction *JsFunctionToCoreFunction(AbckitJsFunction *m)
149 {
150 LIBABCKIT_CLEAR_LAST_ERROR;
151 LIBABCKIT_IMPLEMENTED;
152 LIBABCKIT_TIME_EXEC;
153 LIBABCKIT_BAD_ARGUMENT(m, nullptr);
154 return m->core;
155 }
156
CoreFunctionToJsFunction(AbckitCoreFunction * m)157 extern "C" AbckitJsFunction *CoreFunctionToJsFunction(AbckitCoreFunction *m)
158 {
159 LIBABCKIT_CLEAR_LAST_ERROR;
160 LIBABCKIT_IMPLEMENTED;
161 LIBABCKIT_TIME_EXEC;
162 LIBABCKIT_BAD_ARGUMENT(m, nullptr);
163 LIBABCKIT_CHECK_JS_TARGET(m->owningModule);
164 return m->GetJsImpl();
165 }
166
167 // ========================================
168 // Annotation
169 // ========================================
170
171 // ========================================
172 // AnnotationElement
173 // ========================================
174
175 // ========================================
176 // Type
177 // ========================================
178
179 // ========================================
180 // Value
181 // ========================================
182
183 // ========================================
184 // String
185 // ========================================
186
187 // ========================================
188 // LiteralArray
189 // ========================================
190
191 // ========================================
192 // Literal
193 // ========================================
194
195 AbckitJsInspectApi g_jsInspectApiImpl = {
196 // ========================================
197 // File
198 // ========================================
199
200 // ========================================
201 // Module
202 // ========================================
203
204 JsModuleToCoreModule, CoreModuleToJsModule,
205
206 // ========================================
207 // ImportDescriptor
208 // ========================================
209
210 JsImportDescriptorToCoreImportDescriptor, CoreImportDescriptorToJsImportDescriptor,
211
212 // ========================================
213 // ExportDescriptor
214 // ========================================
215
216 JsExportDescriptorToCoreExportDescriptor, CoreExportDescriptorToJsExportDescriptor,
217
218 // ========================================
219 // Class
220 // ========================================
221
222 JsClassToCoreClass, CoreClassToJsClass,
223
224 // ========================================
225 // AnnotationInterface
226 // ========================================
227
228 // ========================================
229 // AnnotationInterfaceField
230 // ========================================
231
232 // ========================================
233 // Function
234 // ========================================
235
236 JsFunctionToCoreFunction, CoreFunctionToJsFunction,
237
238 // ========================================
239 // Annotation
240 // ========================================
241
242 // ========================================
243 // Type
244 // ========================================
245
246 // ========================================
247 // Value
248 // ========================================
249
250 // ========================================
251 // String
252 // ========================================
253
254 // ========================================
255 // LiteralArray
256 // ========================================
257
258 // ========================================
259 // Literal
260 // ========================================
261 };
262
263 // ========================================
264 // Enumerators
265 // ========================================
266
267 // ========================================
268 // Module
269 // ========================================
270
JsModuleEnumerateImports(AbckitCoreModule * m,void * data,bool (* cb)(AbckitCoreImportDescriptor * i,void * data))271 bool JsModuleEnumerateImports(AbckitCoreModule *m, void *data, bool (*cb)(AbckitCoreImportDescriptor *i, void *data))
272 {
273 for (auto &id : m->id) {
274 if (!cb(id.get(), data)) {
275 return false;
276 }
277 }
278 return true;
279 }
280
JsModuleEnumerateExports(AbckitCoreModule * m,void * data,bool (* cb)(AbckitCoreExportDescriptor * e,void * data))281 bool JsModuleEnumerateExports(AbckitCoreModule *m, void *data, bool (*cb)(AbckitCoreExportDescriptor *e, void *data))
282 {
283 for (auto &ed : m->ed) {
284 if (!cb(ed.get(), data)) {
285 return false;
286 }
287 }
288 return true;
289 }
290
JsModuleEnumerateClasses(AbckitCoreModule * m,void * data,bool cb (AbckitCoreClass * klass,void * data))291 bool JsModuleEnumerateClasses(AbckitCoreModule *m, void *data, bool cb(AbckitCoreClass *klass, void *data))
292 {
293 return ModuleEnumerateClassesHelper(m, data, cb);
294 }
295
JsModuleEnumerateTopLevelFunctions(AbckitCoreModule * m,void * data,bool (* cb)(AbckitCoreFunction * function,void * data))296 bool JsModuleEnumerateTopLevelFunctions(AbckitCoreModule *m, void *data,
297 bool (*cb)(AbckitCoreFunction *function, void *data))
298 {
299 return ModuleEnumerateTopLevelFunctionsHelper(m, data, cb);
300 }
301
JsModuleEnumerateAnonymousFunctions(AbckitCoreModule * m,void * data,bool (* cb)(AbckitCoreFunction * function,void * data))302 bool JsModuleEnumerateAnonymousFunctions(AbckitCoreModule *m, void *data,
303 bool (*cb)(AbckitCoreFunction *function, void *data))
304 {
305 return ModuleEnumerateAnonymousFunctionsDynamic(m, data, cb);
306 }
307
JsModuleEnumerateAnnotationInterfaces(AbckitCoreModule * m,void * data,bool (* cb)(AbckitCoreAnnotationInterface * ai,void * data))308 bool JsModuleEnumerateAnnotationInterfaces(AbckitCoreModule *m, void *data,
309 bool (*cb)(AbckitCoreAnnotationInterface *ai, void *data))
310 {
311 return ModuleEnumerateAnnotationInterfacesHelper(m, data, cb);
312 }
313
314 // ========================================
315 // Class
316 // ========================================
317
JsClassEnumerateMethods(AbckitCoreClass * klass,void * data,bool (* cb)(AbckitCoreFunction * function,void * data))318 bool JsClassEnumerateMethods(AbckitCoreClass *klass, void *data, bool (*cb)(AbckitCoreFunction *function, void *data))
319 {
320 return ClassEnumerateMethodsHelper(klass, data, cb);
321 }
322
323 // ========================================
324 // Function
325 // ========================================
326
JsFunctionEnumerateNestedFunctions(AbckitCoreFunction * function,void * data,bool (* cb)(AbckitCoreFunction * nestedFunc,void * data))327 bool JsFunctionEnumerateNestedFunctions(AbckitCoreFunction *function, void *data,
328 bool (*cb)(AbckitCoreFunction *nestedFunc, void *data))
329 {
330 for (auto &f : function->nestedFunction) {
331 if (!cb(f.get(), data)) {
332 return false;
333 }
334 }
335 return true;
336 }
337
JsFunctionEnumerateNestedClasses(AbckitCoreFunction * function,void * data,bool (* cb)(AbckitCoreClass * nestedClass,void * data))338 bool JsFunctionEnumerateNestedClasses(AbckitCoreFunction *function, void *data,
339 bool (*cb)(AbckitCoreClass *nestedClass, void *data))
340 {
341 for (auto &c : function->nestedClasses) {
342 if (!cb(c.get(), data)) {
343 return false;
344 }
345 }
346 return true;
347 }
348
349 } // namespace libabckit
350
351 #ifdef ABCKIT_ENABLE_MOCK_IMPLEMENTATION
352 #include "./mock/abckit_mock.h"
353 #endif
354
AbckitGetJsInspectApiImpl(AbckitApiVersion version)355 extern "C" AbckitJsInspectApi const *AbckitGetJsInspectApiImpl(AbckitApiVersion version)
356 {
357 #ifdef ABCKIT_ENABLE_MOCK_IMPLEMENTATION
358 return AbckitGetMockJsInspectApiImpl(version);
359 #endif
360 switch (version) {
361 case ABCKIT_VERSION_RELEASE_1_0_0:
362 return &libabckit::g_jsInspectApiImpl;
363 default:
364 libabckit::statuses::SetLastError(ABCKIT_STATUS_UNKNOWN_API_VERSION);
365 return nullptr;
366 }
367 }
368