• 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 
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