• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /**
2  * Copyright (c) 2024 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  * http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #include <cassert>
17 #include "libabckit/include/c/abckit.h"
18 #include "libabckit/include/c/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