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, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
11 * either express or implied. See the License for the specific language governing permissions and limitations under the
12 * License.
13 */
14
15 #include <cassert>
16 #include <cstdint>
17 #include "libabckit/include/c/abckit.h"
18 #include "libabckit/include/c/extensions/arkts/metadata_arkts.h"
19
20 #include "libabckit/src/macros.h"
21
22 #include "libabckit/src/metadata_inspect_impl.h"
23 #include "libabckit/src/adapter_dynamic/metadata_modify_dynamic.h"
24 #include "libabckit/src/adapter_static/metadata_modify_static.h"
25
26 // CC-OFFNXT(G.PRE.02) code readability
27 // NOLINTNEXTLINE(cppcoreguidelines-macro-usage)
28 #define LIBABCKIT_CHECK_SAME_TARGET(target1, target2) \
29 if ((target1) != (target2)) { \
30 libabckit::statuses::SetLastError(ABCKIT_STATUS_WRONG_TARGET); \
31 /* CC-OFFNXT(G.PRE.05) code generation */ \
32 return nullptr; \
33 }
34
35 // CC-OFFNXT(G.PRE.02) code readability
36 // NOLINTNEXTLINE(cppcoreguidelines-macro-usage)
37 #define LIBABCKIT_CHECK_SAME_TARGET_VOID(target1, target2) \
38 if ((target1) != (target2)) { \
39 libabckit::statuses::SetLastError(ABCKIT_STATUS_WRONG_TARGET); \
40 /* CC-OFFNXT(G.PRE.05) code generation */ \
41 return; \
42 }
43
44 namespace libabckit {
45
46 // ========================================
47 // File
48 // ========================================
49
FileAddExternalModuleArktsV1(AbckitFile * file,const struct AbckitArktsV1ExternalModuleCreateParams * params)50 extern "C" AbckitArktsModule *FileAddExternalModuleArktsV1(AbckitFile *file,
51 const struct AbckitArktsV1ExternalModuleCreateParams *params)
52 {
53 LIBABCKIT_CLEAR_LAST_ERROR;
54 LIBABCKIT_IMPLEMENTED;
55
56 LIBABCKIT_BAD_ARGUMENT(file, nullptr);
57 LIBABCKIT_BAD_ARGUMENT(params, nullptr);
58 LIBABCKIT_BAD_ARGUMENT(params->name, nullptr);
59
60 switch (file->frontend) {
61 case Mode::DYNAMIC:
62 return FileAddExternalArkTsV1Module(file, params);
63 case Mode::STATIC:
64 statuses::SetLastError(ABCKIT_STATUS_UNSUPPORTED);
65 return nullptr;
66 default:
67 LIBABCKIT_UNREACHABLE;
68 }
69 }
70
71 // ========================================
72 // Module
73 // ========================================
74
ModuleAddImportFromArktsV1ToArktsV1(AbckitArktsModule * importing,AbckitArktsModule * imported,const AbckitArktsImportFromDynamicModuleCreateParams * params)75 extern "C" AbckitArktsImportDescriptor *ModuleAddImportFromArktsV1ToArktsV1(
76 AbckitArktsModule *importing, AbckitArktsModule *imported,
77 const AbckitArktsImportFromDynamicModuleCreateParams *params)
78 {
79 LIBABCKIT_CLEAR_LAST_ERROR;
80 LIBABCKIT_IMPLEMENTED;
81
82 LIBABCKIT_BAD_ARGUMENT(importing, nullptr);
83 LIBABCKIT_BAD_ARGUMENT(imported, nullptr);
84
85 LIBABCKIT_BAD_ARGUMENT(params, nullptr);
86 LIBABCKIT_BAD_ARGUMENT(params->name, nullptr);
87 LIBABCKIT_BAD_ARGUMENT(params->alias, nullptr);
88
89 LIBABCKIT_INTERNAL_ERROR(importing->core, nullptr);
90 LIBABCKIT_INTERNAL_ERROR(imported->core, nullptr);
91
92 if (importing->core->target != ABCKIT_TARGET_ARK_TS_V1) {
93 statuses::SetLastError(ABCKIT_STATUS_WRONG_TARGET);
94 return nullptr;
95 }
96
97 LIBABCKIT_CHECK_SAME_TARGET(importing->core->target, imported->core->target);
98
99 return ModuleAddImportFromDynamicModuleDynamic(importing->core, imported->core, params);
100 }
101
ModuleAddImportFromArktsV2ToArktsV2(AbckitArktsModule *,AbckitArktsModule *,const AbckitArktsImportFromDynamicModuleCreateParams *)102 extern "C" AbckitArktsImportDescriptor *ModuleAddImportFromArktsV2ToArktsV2(
103 AbckitArktsModule * /*importing*/, AbckitArktsModule * /*imported*/,
104 const AbckitArktsImportFromDynamicModuleCreateParams * /*params*/)
105 {
106 LIBABCKIT_CLEAR_LAST_ERROR;
107 LIBABCKIT_IMPLEMENTED;
108
109 statuses::SetLastError(ABCKIT_STATUS_UNSUPPORTED);
110 return nullptr;
111 }
112
ModuleRemoveImport(AbckitArktsModule * m,AbckitArktsImportDescriptor * i)113 extern "C" void ModuleRemoveImport(AbckitArktsModule *m, AbckitArktsImportDescriptor *i)
114 {
115 LIBABCKIT_CLEAR_LAST_ERROR;
116 LIBABCKIT_IMPLEMENTED;
117
118 LIBABCKIT_BAD_ARGUMENT_VOID(m)
119 LIBABCKIT_BAD_ARGUMENT_VOID(i)
120
121 LIBABCKIT_INTERNAL_ERROR_VOID(m->core);
122 LIBABCKIT_INTERNAL_ERROR_VOID(i->core);
123
124 auto mt = m->core->target;
125 auto it = i->core->importingModule->target;
126
127 LIBABCKIT_CHECK_SAME_TARGET_VOID(mt, it);
128
129 switch (mt) {
130 case ABCKIT_TARGET_ARK_TS_V1:
131 return ModuleRemoveImportDynamic(m->core, i);
132 case ABCKIT_TARGET_ARK_TS_V2:
133 statuses::SetLastError(ABCKIT_STATUS_UNSUPPORTED);
134 return;
135 default:
136 LIBABCKIT_UNREACHABLE;
137 }
138 }
139
ModuleAddExportFromArktsV1ToArktsV1(AbckitArktsModule * exporting,AbckitArktsModule * exported,const AbckitArktsDynamicModuleExportCreateParams * params)140 extern "C" AbckitArktsExportDescriptor *ModuleAddExportFromArktsV1ToArktsV1(
141 AbckitArktsModule *exporting, AbckitArktsModule *exported, const AbckitArktsDynamicModuleExportCreateParams *params)
142 {
143 LIBABCKIT_CLEAR_LAST_ERROR;
144 LIBABCKIT_IMPLEMENTED;
145
146 LIBABCKIT_BAD_ARGUMENT(exporting, nullptr);
147 LIBABCKIT_BAD_ARGUMENT(exported, nullptr);
148 LIBABCKIT_BAD_ARGUMENT(params, nullptr);
149 LIBABCKIT_BAD_ARGUMENT(params->name, nullptr);
150
151 LIBABCKIT_INTERNAL_ERROR(exporting->core, nullptr);
152 LIBABCKIT_INTERNAL_ERROR(exported->core, nullptr);
153
154 if (exporting->core->target != ABCKIT_TARGET_ARK_TS_V1) {
155 statuses::SetLastError(ABCKIT_STATUS_WRONG_TARGET);
156 return nullptr;
157 }
158
159 LIBABCKIT_CHECK_SAME_TARGET(exporting->core->target, exported->core->target);
160
161 return DynamicModuleAddExportDynamic(exporting->core, exported->core, params);
162 }
163
ModuleAddExportFromArktsV2ToArktsV2(AbckitArktsModule *,AbckitArktsModule *,const AbckitArktsDynamicModuleExportCreateParams *)164 extern "C" AbckitArktsExportDescriptor *ModuleAddExportFromArktsV2ToArktsV2(
165 AbckitArktsModule * /*exporting*/ /* assert(exporting.target === AbckitTarget_ArkTS_v2) */,
166 AbckitArktsModule * /*exported*/ /* assert(exporting.target === AbckitTarget_ArkTS_v2) */,
167 const AbckitArktsDynamicModuleExportCreateParams * /*params*/)
168 {
169 LIBABCKIT_CLEAR_LAST_ERROR;
170 LIBABCKIT_IMPLEMENTED;
171
172 statuses::SetLastError(ABCKIT_STATUS_UNSUPPORTED);
173 return nullptr;
174 }
175
ModuleRemoveExport(AbckitArktsModule * m,AbckitArktsExportDescriptor * e)176 extern "C" void ModuleRemoveExport(AbckitArktsModule *m, AbckitArktsExportDescriptor *e)
177 {
178 LIBABCKIT_CLEAR_LAST_ERROR;
179 LIBABCKIT_IMPLEMENTED;
180
181 LIBABCKIT_BAD_ARGUMENT_VOID(m)
182 LIBABCKIT_BAD_ARGUMENT_VOID(e)
183
184 LIBABCKIT_INTERNAL_ERROR_VOID(m->core);
185 LIBABCKIT_INTERNAL_ERROR_VOID(e->core);
186
187 auto mt = m->core->target;
188 auto et = e->core->exportingModule->target;
189
190 LIBABCKIT_CHECK_SAME_TARGET_VOID(mt, et);
191
192 switch (mt) {
193 case ABCKIT_TARGET_ARK_TS_V1:
194 return ModuleRemoveExportDynamic(m->core, e);
195 case ABCKIT_TARGET_ARK_TS_V2:
196 statuses::SetLastError(ABCKIT_STATUS_UNSUPPORTED);
197 return;
198 default:
199 LIBABCKIT_UNREACHABLE;
200 }
201 }
202
ModuleAddAnnotationInterface(AbckitArktsModule * m,const AbckitArktsAnnotationInterfaceCreateParams * params)203 extern "C" AbckitArktsAnnotationInterface *ModuleAddAnnotationInterface(
204 AbckitArktsModule *m, const AbckitArktsAnnotationInterfaceCreateParams *params)
205 {
206 LIBABCKIT_CLEAR_LAST_ERROR;
207 LIBABCKIT_IMPLEMENTED;
208
209 LIBABCKIT_BAD_ARGUMENT(m, nullptr);
210 LIBABCKIT_BAD_ARGUMENT(params, nullptr);
211 LIBABCKIT_BAD_ARGUMENT(params->name, nullptr);
212
213 LIBABCKIT_INTERNAL_ERROR(m->core, nullptr);
214
215 switch (m->core->target) {
216 case ABCKIT_TARGET_ARK_TS_V1:
217 return ModuleAddAnnotationInterfaceDynamic(m->core, params);
218 case ABCKIT_TARGET_ARK_TS_V2:
219 statuses::SetLastError(ABCKIT_STATUS_UNSUPPORTED);
220 return nullptr;
221 default:
222 LIBABCKIT_UNREACHABLE;
223 }
224 }
225
226 // ========================================
227 // Class
228 // ========================================
229
ClassAddAnnotation(AbckitArktsClass * klass,const AbckitArktsAnnotationCreateParams * params)230 extern "C" AbckitArktsAnnotation *ClassAddAnnotation(AbckitArktsClass *klass,
231 const AbckitArktsAnnotationCreateParams *params)
232 {
233 LIBABCKIT_CLEAR_LAST_ERROR;
234 LIBABCKIT_IMPLEMENTED;
235
236 LIBABCKIT_BAD_ARGUMENT(klass, nullptr);
237 LIBABCKIT_BAD_ARGUMENT(params, nullptr);
238 LIBABCKIT_BAD_ARGUMENT(params->ai, nullptr);
239
240 LIBABCKIT_INTERNAL_ERROR(klass->core, nullptr);
241 LIBABCKIT_INTERNAL_ERROR(params->ai->core, nullptr);
242
243 auto kt = klass->core->owningModule->target;
244 auto at = params->ai->core->owningModule->target;
245
246 LIBABCKIT_CHECK_SAME_TARGET(kt, at);
247
248 switch (kt) {
249 case ABCKIT_TARGET_ARK_TS_V1:
250 return ClassAddAnnotationDynamic(klass->core, params);
251 case ABCKIT_TARGET_ARK_TS_V2:
252 statuses::SetLastError(ABCKIT_STATUS_UNSUPPORTED);
253 return nullptr;
254 default:
255 LIBABCKIT_UNREACHABLE;
256 }
257 }
258
ClassRemoveAnnotation(AbckitArktsClass * klass,AbckitArktsAnnotation * anno)259 extern "C" void ClassRemoveAnnotation(AbckitArktsClass *klass, AbckitArktsAnnotation *anno)
260 {
261 LIBABCKIT_CLEAR_LAST_ERROR;
262 LIBABCKIT_IMPLEMENTED;
263
264 LIBABCKIT_BAD_ARGUMENT_VOID(klass);
265 LIBABCKIT_BAD_ARGUMENT_VOID(anno);
266
267 LIBABCKIT_INTERNAL_ERROR_VOID(klass->core);
268 LIBABCKIT_INTERNAL_ERROR_VOID(anno->core);
269
270 auto kt = klass->core->owningModule->target;
271 auto at = anno->core->ai->owningModule->target;
272
273 LIBABCKIT_CHECK_SAME_TARGET_VOID(kt, at);
274
275 switch (kt) {
276 case ABCKIT_TARGET_ARK_TS_V1:
277 return ClassRemoveAnnotationDynamic(klass->core, anno->core);
278 case ABCKIT_TARGET_ARK_TS_V2:
279 statuses::SetLastError(ABCKIT_STATUS_UNSUPPORTED);
280 return;
281 default:
282 LIBABCKIT_UNREACHABLE;
283 }
284 }
285
286 // ========================================
287 // AnnotationInterface
288 // ========================================
289
AnnotationInterfaceAddField(AbckitArktsAnnotationInterface * ai,const AbckitArktsAnnotationInterfaceFieldCreateParams * params)290 extern "C" AbckitArktsAnnotationInterfaceField *AnnotationInterfaceAddField(
291 AbckitArktsAnnotationInterface *ai, const AbckitArktsAnnotationInterfaceFieldCreateParams *params)
292 {
293 LIBABCKIT_CLEAR_LAST_ERROR;
294 LIBABCKIT_IMPLEMENTED;
295
296 LIBABCKIT_BAD_ARGUMENT(ai, nullptr);
297
298 LIBABCKIT_BAD_ARGUMENT(params, nullptr);
299 LIBABCKIT_BAD_ARGUMENT(params->name, nullptr);
300 LIBABCKIT_BAD_ARGUMENT(params->type, nullptr);
301
302 LIBABCKIT_INTERNAL_ERROR(ai->core, nullptr);
303
304 switch (ai->core->owningModule->target) {
305 case ABCKIT_TARGET_ARK_TS_V1:
306 return AnnotationInterfaceAddFieldDynamic(ai->core, params);
307 case ABCKIT_TARGET_ARK_TS_V2:
308 statuses::SetLastError(ABCKIT_STATUS_UNSUPPORTED);
309 return nullptr;
310 default:
311 LIBABCKIT_UNREACHABLE;
312 }
313 }
314
AnnotationInterfaceRemoveField(AbckitArktsAnnotationInterface * ai,AbckitArktsAnnotationInterfaceField * field)315 extern "C" void AnnotationInterfaceRemoveField(AbckitArktsAnnotationInterface *ai,
316 AbckitArktsAnnotationInterfaceField *field)
317 {
318 LIBABCKIT_CLEAR_LAST_ERROR;
319 LIBABCKIT_IMPLEMENTED;
320
321 LIBABCKIT_BAD_ARGUMENT_VOID(ai);
322 LIBABCKIT_BAD_ARGUMENT_VOID(field);
323
324 LIBABCKIT_INTERNAL_ERROR_VOID(ai->core);
325 LIBABCKIT_INTERNAL_ERROR_VOID(field->core);
326
327 switch (ai->core->owningModule->target) {
328 case ABCKIT_TARGET_ARK_TS_V1:
329 return AnnotationInterfaceRemoveFieldDynamic(ai->core, field->core);
330 case ABCKIT_TARGET_ARK_TS_V2:
331 statuses::SetLastError(ABCKIT_STATUS_UNSUPPORTED);
332 return;
333 default:
334 LIBABCKIT_UNREACHABLE;
335 }
336 }
337
338 // ========================================
339 // Function
340 // ========================================
341
FunctionAddAnnotation(AbckitArktsFunction * function,const AbckitArktsAnnotationCreateParams * params)342 extern "C" AbckitArktsAnnotation *FunctionAddAnnotation(AbckitArktsFunction *function,
343 const AbckitArktsAnnotationCreateParams *params)
344 {
345 LIBABCKIT_CLEAR_LAST_ERROR;
346 LIBABCKIT_IMPLEMENTED;
347
348 LIBABCKIT_BAD_ARGUMENT(function, nullptr);
349 LIBABCKIT_BAD_ARGUMENT(params, nullptr);
350
351 LIBABCKIT_INTERNAL_ERROR(function->core, nullptr);
352 LIBABCKIT_INTERNAL_ERROR(params->ai->core, nullptr);
353
354 auto ft = function->core->owningModule->target;
355 auto at = params->ai->core->owningModule->target;
356
357 LIBABCKIT_CHECK_SAME_TARGET(ft, at);
358
359 switch (ft) {
360 case ABCKIT_TARGET_ARK_TS_V1:
361 return FunctionAddAnnotationDynamic(function->core, params);
362 case ABCKIT_TARGET_ARK_TS_V2:
363 statuses::SetLastError(ABCKIT_STATUS_UNSUPPORTED);
364 return nullptr;
365 default:
366 LIBABCKIT_UNREACHABLE;
367 }
368 }
369
FunctionRemoveAnnotation(AbckitArktsFunction * function,AbckitArktsAnnotation * anno)370 extern "C" void FunctionRemoveAnnotation(AbckitArktsFunction *function, AbckitArktsAnnotation *anno)
371 {
372 LIBABCKIT_CLEAR_LAST_ERROR;
373 LIBABCKIT_IMPLEMENTED;
374
375 LIBABCKIT_BAD_ARGUMENT_VOID(function);
376 LIBABCKIT_BAD_ARGUMENT_VOID(anno);
377
378 LIBABCKIT_INTERNAL_ERROR_VOID(function->core);
379 LIBABCKIT_INTERNAL_ERROR_VOID(anno->core);
380
381 auto ft = function->core->owningModule->target;
382 auto at = anno->core->ai->owningModule->target;
383
384 LIBABCKIT_CHECK_SAME_TARGET_VOID(ft, at);
385
386 switch (ft) {
387 case ABCKIT_TARGET_ARK_TS_V1:
388 return FunctionRemoveAnnotationDynamic(function->core, anno->core);
389 case ABCKIT_TARGET_ARK_TS_V2:
390 statuses::SetLastError(ABCKIT_STATUS_UNSUPPORTED);
391 return;
392 default:
393 LIBABCKIT_UNREACHABLE;
394 }
395 }
396
397 // ========================================
398 // Annotation
399 // ========================================
400
AnnotationAddAnnotationElement(AbckitArktsAnnotation * anno,AbckitArktsAnnotationElementCreateParams * params)401 extern "C" AbckitArktsAnnotationElement *AnnotationAddAnnotationElement(
402 AbckitArktsAnnotation *anno, AbckitArktsAnnotationElementCreateParams *params)
403 {
404 LIBABCKIT_CLEAR_LAST_ERROR;
405 LIBABCKIT_IMPLEMENTED;
406
407 LIBABCKIT_BAD_ARGUMENT(anno, nullptr);
408
409 LIBABCKIT_BAD_ARGUMENT(params, nullptr);
410 LIBABCKIT_BAD_ARGUMENT(params->name, nullptr);
411 LIBABCKIT_BAD_ARGUMENT(params->value, nullptr);
412
413 LIBABCKIT_INTERNAL_ERROR(anno->core, nullptr);
414 AbckitCoreModule *module = anno->core->ai->owningModule;
415
416 LIBABCKIT_INTERNAL_ERROR(module, nullptr);
417 LIBABCKIT_INTERNAL_ERROR(module->file, nullptr);
418
419 switch (module->target) {
420 case ABCKIT_TARGET_ARK_TS_V1:
421 return AnnotationAddAnnotationElementDynamic(anno->core, params);
422 case ABCKIT_TARGET_ARK_TS_V2:
423 statuses::SetLastError(ABCKIT_STATUS_UNSUPPORTED);
424 return nullptr;
425 default:
426 LIBABCKIT_UNREACHABLE;
427 }
428 }
429
AnnotationRemoveAnnotationElement(AbckitArktsAnnotation * anno,AbckitArktsAnnotationElement * elem)430 extern "C" void AnnotationRemoveAnnotationElement(AbckitArktsAnnotation *anno, AbckitArktsAnnotationElement *elem)
431 {
432 LIBABCKIT_CLEAR_LAST_ERROR;
433 LIBABCKIT_IMPLEMENTED;
434
435 LIBABCKIT_BAD_ARGUMENT_VOID(anno);
436 LIBABCKIT_BAD_ARGUMENT_VOID(elem);
437
438 LIBABCKIT_INTERNAL_ERROR_VOID(anno->core->ai);
439
440 AbckitCoreModule *module = anno->core->ai->owningModule;
441
442 LIBABCKIT_INTERNAL_ERROR_VOID(module);
443 LIBABCKIT_INTERNAL_ERROR_VOID(module->file);
444
445 switch (module->target) {
446 case ABCKIT_TARGET_ARK_TS_V1:
447 return AnnotationRemoveAnnotationElementDynamic(anno->core, elem->core);
448 case ABCKIT_TARGET_ARK_TS_V2:
449 statuses::SetLastError(ABCKIT_STATUS_UNSUPPORTED);
450 return;
451 default:
452 LIBABCKIT_UNREACHABLE;
453 }
454 }
455
456 // ========================================
457 // Type
458 // ========================================
459
460 // ========================================
461 // Value
462 // ========================================
463
464 // ========================================
465 // String
466 // ========================================
467
468 // ========================================
469 // LiteralArray
470 // ========================================
471
472 AbckitArktsModifyApi g_arktsModifyApiImpl = {
473
474 // ========================================
475 // File
476 // ========================================
477
478 FileAddExternalModuleArktsV1,
479
480 // ========================================
481 // Module
482 // ========================================
483
484 ModuleAddImportFromArktsV1ToArktsV1, ModuleRemoveImport, ModuleAddExportFromArktsV1ToArktsV1, ModuleRemoveExport,
485 ModuleAddAnnotationInterface,
486
487 // ========================================
488 // Class
489 // ========================================
490
491 ClassAddAnnotation, ClassRemoveAnnotation,
492
493 // ========================================
494 // AnnotationInterface
495 // ========================================
496
497 AnnotationInterfaceAddField, AnnotationInterfaceRemoveField,
498
499 // ========================================
500 // Function
501 // ========================================
502
503 FunctionAddAnnotation, FunctionRemoveAnnotation,
504
505 // ========================================
506 // Annotation
507 // ========================================
508
509 AnnotationAddAnnotationElement, AnnotationRemoveAnnotationElement,
510
511 // ========================================
512 // Type
513 // ========================================
514
515 // ========================================
516 // Value
517 // ========================================
518
519 // ========================================
520 // String
521 // ========================================
522
523 // ========================================
524 // LiteralArray
525 // ========================================
526
527 // ========================================
528 // LiteralArray
529 // ========================================
530 };
531
532 } // namespace libabckit
533
534 #ifdef ABCKIT_ENABLE_MOCK_IMPLEMENTATION
535 #include "./mock/abckit_mock.h"
536 #endif
537
AbckitGetArktsModifyApiImpl(AbckitApiVersion version)538 extern "C" AbckitArktsModifyApi const *AbckitGetArktsModifyApiImpl(AbckitApiVersion version)
539 {
540 #ifdef ABCKIT_ENABLE_MOCK_IMPLEMENTATION
541 return AbckitGetMockArktsModifyApiImpl(version);
542 #endif
543 switch (version) {
544 case ABCKIT_VERSION_RELEASE_1_0_0:
545 return &libabckit::g_arktsModifyApiImpl;
546 default:
547 libabckit::statuses::SetLastError(ABCKIT_STATUS_UNKNOWN_API_VERSION);
548 return nullptr;
549 }
550 }
551