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