@idlizer/arktscgen 2.1.10-arktscgen-5 → 2.1.10-arktscgen-7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/libarkts-copy/generator/options.json5 +24 -47
- package/build/libarkts-copy/native/meson.build +29 -13
- package/build/libarkts-copy/native/meson_options.txt +9 -3
- package/build/libarkts-copy/native/mingw.cross +2 -0
- package/build/libarkts-copy/native/src/{bridges.cc → bridges.cpp} +31 -92
- package/build/libarkts-copy/native/src/{common.cc → common.cpp} +240 -107
- package/build/libarkts-copy/native/src/common.h +22 -22
- package/build/libarkts-copy/native/src/{memoryTracker.cc → memoryTracker.cpp} +45 -32
- package/build/libarkts-copy/package.json +13 -11
- package/build/libarkts-copy/src/Es2pandaNativeModule.ts +10 -63
- package/build/libarkts-copy/src/arkts-api/AbstractVisitor.ts +9 -3
- package/build/libarkts-copy/src/arkts-api/ImportStorage.ts +10 -7
- package/build/libarkts-copy/src/arkts-api/ProgramProvider.ts +14 -5
- package/build/libarkts-copy/src/arkts-api/class-by-peer.ts +19 -1
- package/build/libarkts-copy/src/arkts-api/factory/nodeFactory.ts +4 -0
- package/build/libarkts-copy/src/arkts-api/index.ts +0 -2
- package/build/libarkts-copy/src/arkts-api/node-cache.ts +12 -3
- package/build/libarkts-copy/src/arkts-api/node-utilities/ObjectExpression.ts +1 -1
- package/build/libarkts-copy/src/arkts-api/node-utilities/OverloadDeclaration.ts +29 -0
- package/build/libarkts-copy/src/arkts-api/node-utilities/ScriptFunction.ts +4 -4
- package/build/libarkts-copy/src/arkts-api/peers/AstNode.ts +0 -16
- package/build/libarkts-copy/src/arkts-api/peers/Config.ts +1 -1
- package/build/libarkts-copy/src/arkts-api/peers/Context.ts +9 -9
- package/build/libarkts-copy/src/arkts-api/plugins.ts +113 -15
- package/build/libarkts-copy/src/arkts-api/static/global.ts +1 -4
- package/build/libarkts-copy/src/arkts-api/static/profiler.ts +5 -5
- package/build/libarkts-copy/src/arkts-api/utilities/performance.ts +2 -1
- package/build/libarkts-copy/src/arkts-api/utilities/private.ts +11 -43
- package/build/libarkts-copy/src/arkts-api/utilities/public.ts +41 -9
- package/build/libarkts-copy/src/arkts-api/visitor.ts +4 -25
- package/build/libarkts-copy/src/checkSdk.ts +1 -1
- package/build/libarkts-copy/src/index.ts +1 -2
- package/build/libarkts-copy/src/memo-node-cache.ts +143 -0
- package/build/libarkts-copy/src/plugin-utils.ts +72 -40
- package/build/libarkts-copy/src/reexport-for-generated.ts +3 -1
- package/build/libarkts-copy/src/tracer.ts +2 -2
- package/build/libarkts-copy/src/utils.ts +10 -14
- package/build/libarkts-copy/tsconfig.json +0 -3
- package/lib/index.js +5517 -10446
- package/package.json +9 -7
- package/templates/{bridges.cc → bridges.cpp} +1 -1
- package/build/libarkts-copy/src/arkts-api/node-utilities/Program.ts +0 -45
- package/build/libarkts-copy/src/arkts-api/peers/DiagnosticKind.ts +0 -23
- package/build/libarkts-copy/src/ts-api/factory/nodeFactory.ts +0 -1250
- package/build/libarkts-copy/src/ts-api/factory/nodeTests.ts +0 -125
- package/build/libarkts-copy/src/ts-api/index.ts +0 -27
- package/build/libarkts-copy/src/ts-api/static/enums.ts +0 -18
- package/build/libarkts-copy/src/ts-api/types.ts +0 -1075
- package/build/libarkts-copy/src/ts-api/utilities/private.ts +0 -292
- package/build/libarkts-copy/src/ts-api/utilities/public.ts +0 -55
- package/build/libarkts-copy/src/ts-api/visitor/visitor.ts +0 -139
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/*
|
|
2
|
-
* Copyright (c)
|
|
2
|
+
* Copyright (c) 2024-2025 Huawei Device Co., Ltd.
|
|
3
3
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
4
|
* you may not use this file except in compliance with the License.
|
|
5
5
|
* You may obtain a copy of the License at
|
|
@@ -15,30 +15,32 @@
|
|
|
15
15
|
|
|
16
16
|
#include <common.h>
|
|
17
17
|
#include <iterator>
|
|
18
|
-
#include <regex
|
|
18
|
+
#include <regex>
|
|
19
19
|
#include <sstream>
|
|
20
20
|
#include <utility>
|
|
21
21
|
#include <vector>
|
|
22
|
+
#include <bitset>
|
|
22
23
|
|
|
23
24
|
#include "interop-types.h"
|
|
24
25
|
|
|
25
26
|
using std::string, std::cout, std::endl, std::vector;
|
|
27
|
+
constexpr int AST_NODE_TYPE_LIMIT = 256;
|
|
26
28
|
|
|
27
29
|
es2panda_Impl* es2pandaImplementation = nullptr;
|
|
28
30
|
static thread_local StageArena currentArena;
|
|
29
31
|
|
|
30
|
-
StageArena* StageArena::
|
|
32
|
+
StageArena* StageArena::Instance()
|
|
31
33
|
{
|
|
32
34
|
return ¤tArena;
|
|
33
35
|
}
|
|
34
36
|
|
|
35
|
-
void StageArena::
|
|
37
|
+
void StageArena::Add(void* pointer)
|
|
36
38
|
{
|
|
37
39
|
if (pointer)
|
|
38
40
|
allocated.push_back(pointer);
|
|
39
41
|
}
|
|
40
42
|
|
|
41
|
-
void StageArena::
|
|
43
|
+
void StageArena::Cleanup()
|
|
42
44
|
{
|
|
43
45
|
if (totalSize > 0 && false)
|
|
44
46
|
printf("cleanup %d objects %d bytes\n", (int)allocated.size(), (int)totalSize);
|
|
@@ -56,26 +58,26 @@ StageArena::StageArena()
|
|
|
56
58
|
|
|
57
59
|
StageArena::~StageArena()
|
|
58
60
|
{
|
|
59
|
-
|
|
61
|
+
Cleanup();
|
|
60
62
|
}
|
|
61
63
|
|
|
62
|
-
char* StageArena::
|
|
64
|
+
char* StageArena::Strdup(const char* string)
|
|
63
65
|
{
|
|
64
|
-
auto* arena = StageArena::
|
|
66
|
+
auto* arena = StageArena::Instance();
|
|
65
67
|
auto size = strlen(string) + 1;
|
|
66
|
-
char* memory = (char*)arena->
|
|
68
|
+
char* memory = (char*)arena->Alloc(size);
|
|
67
69
|
interop_memcpy(memory, size, string, size);
|
|
68
70
|
return memory;
|
|
69
71
|
}
|
|
70
72
|
|
|
71
|
-
void* StageArena::
|
|
73
|
+
void* StageArena::Alloc(size_t size)
|
|
72
74
|
{
|
|
73
75
|
void* result = malloc(size);
|
|
74
76
|
if (!result) {
|
|
75
77
|
INTEROP_FATAL("Cannot allocate memory");
|
|
76
78
|
}
|
|
77
79
|
totalSize += size;
|
|
78
|
-
|
|
80
|
+
Add(result);
|
|
79
81
|
return result;
|
|
80
82
|
}
|
|
81
83
|
|
|
@@ -136,14 +138,14 @@ void impl_SetUpSoPath(KStringPtr& soPath)
|
|
|
136
138
|
}
|
|
137
139
|
KOALA_INTEROP_V1(SetUpSoPath, KStringPtr);
|
|
138
140
|
|
|
139
|
-
void* TryLibrary(const char* name)
|
|
141
|
+
void* TryLibrary(const char* name)
|
|
140
142
|
{
|
|
141
143
|
void* res = nullptr;
|
|
142
144
|
std::vector<std::string> pathArray;
|
|
143
145
|
|
|
144
146
|
// find by SetUpSoPath
|
|
145
147
|
if (!ES2PANDA_LIB_PATH.empty()) {
|
|
146
|
-
pathArray = {ES2PANDA_LIB_PATH, LIB_DIR, name};
|
|
148
|
+
pathArray = { ES2PANDA_LIB_PATH, LIB_DIR, name };
|
|
147
149
|
res = loadLibrary(joinPath(pathArray));
|
|
148
150
|
if (res) {
|
|
149
151
|
return res;
|
|
@@ -153,7 +155,7 @@ void* TryLibrary(const char* name)
|
|
|
153
155
|
// find by set PANDA_SDK_PATH
|
|
154
156
|
char* envValue = getenv("PANDA_SDK_PATH");
|
|
155
157
|
if (envValue) {
|
|
156
|
-
pathArray = {envValue, PLUGIN_DIR, LIB_DIR, name};
|
|
158
|
+
pathArray = { envValue, PLUGIN_DIR, LIB_DIR, name };
|
|
157
159
|
res = loadLibrary(joinPath(pathArray));
|
|
158
160
|
if (res) {
|
|
159
161
|
return res;
|
|
@@ -161,14 +163,14 @@ void* TryLibrary(const char* name)
|
|
|
161
163
|
}
|
|
162
164
|
|
|
163
165
|
// find by set LD_LIBRARY_PATH
|
|
164
|
-
pathArray = {name};
|
|
166
|
+
pathArray = { name };
|
|
165
167
|
res = loadLibrary(joinPath(pathArray));
|
|
166
168
|
if (res) {
|
|
167
169
|
return res;
|
|
168
170
|
}
|
|
169
171
|
|
|
170
172
|
// find by DEFAULT_SDK_PATH
|
|
171
|
-
pathArray = {DEFAULT_SDK_PATH, PLUGIN_DIR, LIB_DIR, name};
|
|
173
|
+
pathArray = { DEFAULT_SDK_PATH, PLUGIN_DIR, LIB_DIR, name };
|
|
172
174
|
res = loadLibrary(joinPath(pathArray));
|
|
173
175
|
if (res) {
|
|
174
176
|
return res;
|
|
@@ -177,9 +179,9 @@ void* TryLibrary(const char* name)
|
|
|
177
179
|
return nullptr;
|
|
178
180
|
}
|
|
179
181
|
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
void
|
|
182
|
+
void* FindLibrary()
|
|
183
|
+
{
|
|
184
|
+
void* res = nullptr;
|
|
183
185
|
|
|
184
186
|
res = TryLibrary(LIB_ES2PANDA_PUBLIC);
|
|
185
187
|
if (res) {
|
|
@@ -225,47 +227,60 @@ const char** getStringArray(KStringArray& ptr)
|
|
|
225
227
|
|
|
226
228
|
char* getStringCopy(KStringPtr& ptr)
|
|
227
229
|
{
|
|
228
|
-
return StageArena::
|
|
230
|
+
return StageArena::Strdup(ptr.c_str() ? ptr.c_str() : "");
|
|
229
231
|
}
|
|
230
232
|
|
|
231
|
-
|
|
233
|
+
void impl_DestroyConfig(KNativePointer config)
|
|
232
234
|
{
|
|
233
|
-
|
|
235
|
+
const auto _config = reinterpret_cast<es2panda_Config*>(config);
|
|
236
|
+
// panda prints diagnostics here and do not clone our strings
|
|
237
|
+
// so keep arena alive until this moment.
|
|
238
|
+
GetImpl()->DestroyConfig(_config);
|
|
239
|
+
StageArena::Instance()->Cleanup();
|
|
240
|
+
printf("[libarkts native] Arena cleaned up!\n");
|
|
234
241
|
}
|
|
235
|
-
|
|
242
|
+
KOALA_INTEROP_V1(DestroyConfig, KNativePointer)
|
|
236
243
|
|
|
237
|
-
|
|
238
|
-
{
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
return nullptr;
|
|
242
|
-
}
|
|
243
|
-
KOALA_INTEROP_1(DestroyConfig, KNativePointer, KNativePointer)
|
|
244
|
+
// ─── Helpers to lower function size/complexity ────────────────────────────────
|
|
245
|
+
namespace {
|
|
246
|
+
template <class T, class U>
|
|
247
|
+
inline T As(U v) { return reinterpret_cast<T>(v); }
|
|
244
248
|
|
|
245
|
-
|
|
249
|
+
struct CallExprArgs {
|
|
250
|
+
es2panda_Context* context;
|
|
251
|
+
es2panda_AstNode* node;
|
|
252
|
+
es2panda_AstNode* callee;
|
|
253
|
+
es2panda_AstNode** arguments;
|
|
254
|
+
KInt argumentsLen;
|
|
255
|
+
es2panda_AstNode* typeParams;
|
|
256
|
+
bool optional;
|
|
257
|
+
bool trailingComma;
|
|
258
|
+
};
|
|
259
|
+
|
|
260
|
+
inline KNativePointer DoUpdateCallExpression(const CallExprArgs& a)
|
|
246
261
|
{
|
|
247
|
-
auto
|
|
248
|
-
|
|
249
|
-
|
|
262
|
+
auto nn = GetImpl()->CreateCallExpression(
|
|
263
|
+
a.context, a.callee, a.arguments, a.argumentsLen, a.typeParams, a.optional, a.trailingComma);
|
|
264
|
+
GetImpl()->AstNodeSetOriginalNode(a.context, nn, a.node);
|
|
265
|
+
return nn;
|
|
250
266
|
}
|
|
251
|
-
|
|
267
|
+
} // namespace
|
|
252
268
|
|
|
253
269
|
KNativePointer impl_UpdateCallExpression(KNativePointer contextPtr, KNativePointer nodePtr, KNativePointer calleePtr,
|
|
254
270
|
KNativePointerArray argumentsPtr, KInt argumentsLen, KNativePointer typeParamsPtr, KBoolean optionalT,
|
|
255
271
|
KBoolean trailingCommaT)
|
|
256
272
|
{
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
return nn;
|
|
273
|
+
const CallExprArgs a{
|
|
274
|
+
As<es2panda_Context*>(contextPtr),
|
|
275
|
+
As<es2panda_AstNode*>(nodePtr),
|
|
276
|
+
As<es2panda_AstNode*>(calleePtr),
|
|
277
|
+
As<es2panda_AstNode**>(argumentsPtr),
|
|
278
|
+
argumentsLen,
|
|
279
|
+
As<es2panda_AstNode*>(typeParamsPtr),
|
|
280
|
+
static_cast<bool>(optionalT),
|
|
281
|
+
static_cast<bool>(trailingCommaT),
|
|
282
|
+
};
|
|
283
|
+
return DoUpdateCallExpression(a);
|
|
269
284
|
}
|
|
270
285
|
KOALA_INTEROP_8(UpdateCallExpression, KNativePointer, KNativePointer, KNativePointer, KNativePointer,
|
|
271
286
|
KNativePointerArray, KInt, KNativePointer, KBoolean, KBoolean)
|
|
@@ -376,7 +391,7 @@ KNativePointer impl_AstNodeChildren(KNativePointer contextPtr, KNativePointer no
|
|
|
376
391
|
cachedChildren.clear();
|
|
377
392
|
|
|
378
393
|
GetImpl()->AstNodeIterateConst(context, node, visitChild);
|
|
379
|
-
return StageArena::
|
|
394
|
+
return StageArena::Clone(cachedChildren);
|
|
380
395
|
}
|
|
381
396
|
KOALA_INTEROP_2(AstNodeChildren, KNativePointer, KNativePointer, KNativePointer);
|
|
382
397
|
|
|
@@ -385,72 +400,137 @@ struct Pattern {
|
|
|
385
400
|
std::string key;
|
|
386
401
|
std::string value;
|
|
387
402
|
es2panda_Impl* impl;
|
|
403
|
+
bool isWildcard = false;
|
|
404
|
+
std::regex regex;
|
|
405
|
+
|
|
406
|
+
Pattern(const Pattern&) = delete;
|
|
407
|
+
Pattern& operator=(const Pattern&) = default;
|
|
408
|
+
|
|
409
|
+
Pattern(Pattern&& other) noexcept
|
|
410
|
+
: context(other.context),
|
|
411
|
+
key(std::move(other.key)),
|
|
412
|
+
value(std::move(other.value)),
|
|
413
|
+
impl(other.impl),
|
|
414
|
+
isWildcard(other.isWildcard),
|
|
415
|
+
regex(other.regex)
|
|
416
|
+
{
|
|
417
|
+
other.isWildcard = false;
|
|
418
|
+
}
|
|
419
|
+
|
|
420
|
+
Pattern& operator=(Pattern&& other) noexcept
|
|
421
|
+
{
|
|
422
|
+
context = other.context;
|
|
423
|
+
key = std::move(other.key);
|
|
424
|
+
value = std::move(other.value);
|
|
425
|
+
impl = other.impl;
|
|
426
|
+
isWildcard = other.isWildcard;
|
|
427
|
+
regex = other.regex;
|
|
428
|
+
other.isWildcard = false;
|
|
429
|
+
return *this;
|
|
430
|
+
}
|
|
388
431
|
|
|
389
432
|
Pattern(es2panda_Context* context, const std::string& part) : context(context), impl(GetImpl())
|
|
390
433
|
{
|
|
391
434
|
std::istringstream stream(part);
|
|
392
435
|
std::getline(stream, key, '=');
|
|
393
436
|
std::getline(stream, value, '=');
|
|
437
|
+
isWildcard = value.find('*') != std::string::npos;
|
|
438
|
+
if (isWildcard) {
|
|
439
|
+
this->regex = std::regex(value);
|
|
440
|
+
}
|
|
394
441
|
}
|
|
395
|
-
|
|
442
|
+
|
|
443
|
+
~Pattern() = default;
|
|
444
|
+
|
|
445
|
+
bool match(es2panda_AstNode* node) const
|
|
396
446
|
{
|
|
397
447
|
if (key == "type") {
|
|
398
|
-
|
|
399
|
-
switch (type) {
|
|
400
|
-
case Es2pandaAstNodeType::AST_NODE_TYPE_METHOD_DEFINITION:
|
|
401
|
-
case Es2pandaAstNodeType::AST_NODE_TYPE_SCRIPT_FUNCTION:
|
|
402
|
-
|
|
403
|
-
return value == "method";
|
|
404
|
-
case Es2pandaAstNodeType::AST_NODE_TYPE_STRUCT_DECLARATION:
|
|
405
|
-
return value == "struct";
|
|
406
|
-
default:
|
|
407
|
-
return false;
|
|
408
|
-
}
|
|
448
|
+
return matchByType(node, impl->AstNodeTypeConst(context, node));
|
|
409
449
|
}
|
|
410
450
|
if (key == "annotation") {
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
451
|
+
return matchByAnnotation(node, impl->AstNodeTypeConst(context, node));
|
|
452
|
+
}
|
|
453
|
+
return false;
|
|
454
|
+
}
|
|
455
|
+
|
|
456
|
+
bool matchByType(es2panda_AstNode* node, Es2pandaAstNodeType type) const
|
|
457
|
+
{
|
|
458
|
+
switch (type) {
|
|
459
|
+
case Es2pandaAstNodeType::AST_NODE_TYPE_METHOD_DEFINITION:
|
|
460
|
+
return value == "method";
|
|
461
|
+
case Es2pandaAstNodeType::AST_NODE_TYPE_SCRIPT_FUNCTION:
|
|
462
|
+
return value == "function";
|
|
463
|
+
case Es2pandaAstNodeType::AST_NODE_TYPE_STRUCT_DECLARATION:
|
|
464
|
+
return value == "struct";
|
|
465
|
+
case Es2pandaAstNodeType::AST_NODE_TYPE_CALL_EXPRESSION:
|
|
466
|
+
return value == "call";
|
|
467
|
+
case Es2pandaAstNodeType::AST_NODE_TYPE_ASSIGNMENT_EXPRESSION:
|
|
468
|
+
return value == "assignment";
|
|
469
|
+
default:
|
|
470
|
+
return false;
|
|
471
|
+
}
|
|
472
|
+
}
|
|
473
|
+
|
|
474
|
+
bool matchByAnnotation(es2panda_AstNode* node, Es2pandaAstNodeType type) const
|
|
475
|
+
{
|
|
476
|
+
std::size_t length = 0;
|
|
477
|
+
es2panda_AstNode** result = nullptr;
|
|
478
|
+
switch (type) {
|
|
479
|
+
case Es2pandaAstNodeType::AST_NODE_TYPE_SCRIPT_FUNCTION: {
|
|
480
|
+
result = impl->ScriptFunctionAnnotations(context, node, &length);
|
|
481
|
+
break;
|
|
482
|
+
}
|
|
483
|
+
case Es2pandaAstNodeType::AST_NODE_TYPE_FUNCTION_DECLARATION: {
|
|
484
|
+
result = impl->FunctionDeclarationAnnotations(context, node, &length);
|
|
485
|
+
break;
|
|
486
|
+
}
|
|
487
|
+
case Es2pandaAstNodeType::AST_NODE_TYPE_ARROW_FUNCTION_EXPRESSION: {
|
|
488
|
+
result = impl->ArrowFunctionExpressionAnnotations(context, node, &length);
|
|
489
|
+
break;
|
|
490
|
+
}
|
|
491
|
+
case Es2pandaAstNodeType::AST_NODE_TYPE_ETS_FUNCTION_TYPE: {
|
|
492
|
+
result = impl->TypeNodeAnnotations(context, node, &length);
|
|
493
|
+
break;
|
|
433
494
|
}
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
const char* name = impl->IdentifierNameConst(context, ident);
|
|
438
|
-
found |= matchWildcard(value, name);
|
|
495
|
+
case Es2pandaAstNodeType::AST_NODE_TYPE_TS_TYPE_ALIAS_DECLARATION: {
|
|
496
|
+
result = impl->TSTypeAliasDeclarationAnnotations(context, node, &length);
|
|
497
|
+
break;
|
|
439
498
|
}
|
|
440
|
-
|
|
499
|
+
case Es2pandaAstNodeType::AST_NODE_TYPE_VARIABLE_DECLARATION: {
|
|
500
|
+
result = impl->VariableDeclarationAnnotations(context, node, &length);
|
|
501
|
+
break;
|
|
502
|
+
}
|
|
503
|
+
case Es2pandaAstNodeType::AST_NODE_TYPE_ETS_UNION_TYPE: {
|
|
504
|
+
result = impl->TypeNodeAnnotations(context, node, &length);
|
|
505
|
+
break;
|
|
506
|
+
}
|
|
507
|
+
case Es2pandaAstNodeType::AST_NODE_TYPE_CLASS_PROPERTY: {
|
|
508
|
+
result = impl->ClassPropertyAnnotations(context, node, &length);
|
|
509
|
+
break;
|
|
510
|
+
}
|
|
511
|
+
case Es2pandaAstNodeType::AST_NODE_TYPE_ETS_PARAMETER_EXPRESSION: {
|
|
512
|
+
result = impl->ETSParameterExpressionAnnotations(context, node, &length);
|
|
513
|
+
break;
|
|
514
|
+
}
|
|
515
|
+
default:
|
|
516
|
+
return false;
|
|
441
517
|
}
|
|
442
|
-
|
|
518
|
+
|
|
519
|
+
bool found = false;
|
|
520
|
+
for (std::size_t i = 0; i < length && result; i++) {
|
|
521
|
+
es2panda_AstNode* ident = impl->AnnotationUsageIrGetBaseNameConst(context, result[i]);
|
|
522
|
+
found |= MatchWildcard(value, impl->IdentifierNameConst(context, ident));
|
|
523
|
+
}
|
|
524
|
+
return found;
|
|
443
525
|
}
|
|
444
526
|
|
|
445
|
-
bool
|
|
527
|
+
bool MatchWildcard(const std::string& pattern, const char* foundValue) const
|
|
446
528
|
{
|
|
447
|
-
if (
|
|
448
|
-
return pattern ==
|
|
529
|
+
if (!isWildcard) {
|
|
530
|
+
return pattern == foundValue;
|
|
449
531
|
}
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
regcomp(®ex, pattern.c_str(), REG_NEWLINE);
|
|
453
|
-
return regexec(®ex, value, 1, match, 0) != REG_NOMATCH;
|
|
532
|
+
|
|
533
|
+
return std::regex_search(foundValue, this->regex);
|
|
454
534
|
}
|
|
455
535
|
};
|
|
456
536
|
|
|
@@ -464,24 +544,24 @@ struct Matcher {
|
|
|
464
544
|
std::istringstream stream(query);
|
|
465
545
|
std::string item;
|
|
466
546
|
while (std::getline(stream, item, ';')) {
|
|
467
|
-
patterns.emplace_back(Pattern(context, item));
|
|
547
|
+
patterns.emplace_back(std::forward<Pattern>(Pattern(context, item)));
|
|
468
548
|
}
|
|
469
549
|
}
|
|
470
550
|
bool match(es2panda_AstNode* node)
|
|
471
551
|
{
|
|
472
552
|
bool result = true;
|
|
473
|
-
for (auto pattern : patterns) {
|
|
553
|
+
for (const auto& pattern : patterns) {
|
|
474
554
|
result &= pattern.match(node);
|
|
475
555
|
}
|
|
476
556
|
return result;
|
|
477
557
|
}
|
|
478
558
|
};
|
|
479
559
|
|
|
480
|
-
KNativePointer
|
|
560
|
+
static KNativePointer DoFilterNodes(es2panda_Context* _context,
|
|
561
|
+
es2panda_AstNode* _node,
|
|
562
|
+
const char* _filters,
|
|
563
|
+
bool deeperAfterMatch)
|
|
481
564
|
{
|
|
482
|
-
auto _node = reinterpret_cast<es2panda_AstNode*>(node);
|
|
483
|
-
auto _context = reinterpret_cast<es2panda_Context*>(context);
|
|
484
|
-
const char* _filters = filters.c_str();
|
|
485
565
|
std::vector<es2panda_AstNode*> result;
|
|
486
566
|
es2panda_Impl* impl = GetImpl();
|
|
487
567
|
Matcher matcher(_context, _filters);
|
|
@@ -490,20 +570,73 @@ KNativePointer impl_FilterNodes(KNativePointer context, KNativePointer node, con
|
|
|
490
570
|
while (queue.size() > 0) {
|
|
491
571
|
auto* current = queue.back();
|
|
492
572
|
queue.pop_back();
|
|
493
|
-
|
|
573
|
+
bool isMatch = matcher.match(current);
|
|
574
|
+
if (isMatch) {
|
|
494
575
|
result.push_back(current);
|
|
495
|
-
}
|
|
576
|
+
}
|
|
577
|
+
if (!isMatch || deeperAfterMatch) {
|
|
496
578
|
impl->AstNodeIterateConst(_context, current, visitChild);
|
|
497
|
-
// We want to retain match order, so add children in reverse order.
|
|
498
579
|
for (auto it = cachedChildren.rbegin(); it != cachedChildren.rend(); ++it) {
|
|
499
580
|
queue.push_back(*it);
|
|
500
581
|
}
|
|
501
582
|
cachedChildren.clear();
|
|
502
583
|
}
|
|
503
584
|
}
|
|
504
|
-
return StageArena::
|
|
585
|
+
return StageArena::CloneVector(result.data(), result.size());
|
|
586
|
+
}
|
|
587
|
+
|
|
588
|
+
KNativePointer impl_FilterNodes(
|
|
589
|
+
KNativePointer context, KNativePointer node, const KStringPtr& filters, KBoolean deeperAfterMatch)
|
|
590
|
+
{
|
|
591
|
+
auto* _node = reinterpret_cast<es2panda_AstNode*>(node);
|
|
592
|
+
auto* _context = reinterpret_cast<es2panda_Context*>(context);
|
|
593
|
+
return DoFilterNodes(_context, _node, filters.c_str(), static_cast<bool>(deeperAfterMatch));
|
|
594
|
+
}
|
|
595
|
+
KOALA_INTEROP_4(FilterNodes, KNativePointer, KNativePointer, KNativePointer, KStringPtr, KBoolean)
|
|
596
|
+
|
|
597
|
+
struct FilterArgs {
|
|
598
|
+
es2panda_Impl *impl;
|
|
599
|
+
es2panda_Context *context;
|
|
600
|
+
std::bitset<AST_NODE_TYPE_LIMIT> *typesMask;
|
|
601
|
+
std::vector<es2panda_AstNode *> *result;
|
|
602
|
+
};
|
|
603
|
+
|
|
604
|
+
void filterByType(es2panda_AstNode *node, void *argsPointer)
|
|
605
|
+
{
|
|
606
|
+
FilterArgs *args = reinterpret_cast<FilterArgs *>(argsPointer);
|
|
607
|
+
auto type = args->impl->AstNodeTypeConst(args->context, node);
|
|
608
|
+
if ((*args->typesMask)[type]) {
|
|
609
|
+
args->result->push_back(node);
|
|
610
|
+
}
|
|
611
|
+
}
|
|
612
|
+
|
|
613
|
+
KNativePointer impl_FilterNodes2(KNativePointer context, KNativePointer node, KInt type)
|
|
614
|
+
{
|
|
615
|
+
auto _node = reinterpret_cast<es2panda_AstNode*>(node);
|
|
616
|
+
auto _context = reinterpret_cast<es2panda_Context*>(context);
|
|
617
|
+
std::bitset<AST_NODE_TYPE_LIMIT> typesMask;
|
|
618
|
+
typesMask.set(type);
|
|
619
|
+
std::vector<es2panda_AstNode *> result;
|
|
620
|
+
FilterArgs args = { GetImpl(), _context, &typesMask, &result };
|
|
621
|
+
GetImpl()->AstNodeForEach(_node, filterByType, &args);
|
|
622
|
+
return StageArena::CloneVector(result.data(), result.size());
|
|
623
|
+
}
|
|
624
|
+
KOALA_INTEROP_3(FilterNodes2, KNativePointer, KNativePointer, KNativePointer, KInt)
|
|
625
|
+
|
|
626
|
+
KNativePointer impl_FilterNodes3(KNativePointer context, KNativePointer node, KInt* types, KInt typesSize)
|
|
627
|
+
{
|
|
628
|
+
auto _node = reinterpret_cast<es2panda_AstNode*>(node);
|
|
629
|
+
auto _context = reinterpret_cast<es2panda_Context*>(context);
|
|
630
|
+
std::bitset<AST_NODE_TYPE_LIMIT> typesMask;
|
|
631
|
+
for (int i = 0; i < typesSize; i++) {
|
|
632
|
+
typesMask.set(types[i]);
|
|
633
|
+
}
|
|
634
|
+
std::vector<es2panda_AstNode *> result;
|
|
635
|
+
FilterArgs args = { GetImpl(), _context, &typesMask, &result };
|
|
636
|
+
GetImpl()->AstNodeForEach(_node, filterByType, &args);
|
|
637
|
+
return StageArena::CloneVector(result.data(), result.size());
|
|
505
638
|
}
|
|
506
|
-
|
|
639
|
+
KOALA_INTEROP_4(FilterNodes3, KNativePointer, KNativePointer, KNativePointer, KInt*, KInt)
|
|
507
640
|
|
|
508
641
|
/*
|
|
509
642
|
-----------------------------------------------------------------------------------------------------------------------------
|
|
@@ -82,52 +82,52 @@ class StageArena {
|
|
|
82
82
|
public:
|
|
83
83
|
StageArena();
|
|
84
84
|
~StageArena();
|
|
85
|
-
static StageArena*
|
|
85
|
+
static StageArena* Instance();
|
|
86
86
|
template<typename T>
|
|
87
|
-
static T*
|
|
87
|
+
static T* Alloc()
|
|
88
88
|
{
|
|
89
|
-
auto* arena = StageArena::
|
|
90
|
-
void* memory = arena->
|
|
89
|
+
auto* arena = StageArena::Instance();
|
|
90
|
+
void* memory = arena->Alloc(sizeof(T));
|
|
91
91
|
return new (memory) T();
|
|
92
92
|
}
|
|
93
93
|
template<class T, class T1>
|
|
94
|
-
static T*
|
|
94
|
+
static T* Alloc(T1 arg1)
|
|
95
95
|
{
|
|
96
|
-
auto* arena = StageArena::
|
|
97
|
-
void* memory = arena->
|
|
96
|
+
auto* arena = StageArena::Instance();
|
|
97
|
+
void* memory = arena->Alloc(sizeof(T));
|
|
98
98
|
return new (memory) T(std::forward(arg1));
|
|
99
99
|
}
|
|
100
100
|
template<class T, class T1, class T2>
|
|
101
|
-
static T*
|
|
101
|
+
static T* Alloc(T1 arg1, T2 arg2)
|
|
102
102
|
{
|
|
103
|
-
auto* arena = StageArena::
|
|
104
|
-
void* memory = arena->
|
|
103
|
+
auto* arena = StageArena::Instance();
|
|
104
|
+
void* memory = arena->Alloc(sizeof(T));
|
|
105
105
|
return new (memory) T(arg1, arg2);
|
|
106
106
|
}
|
|
107
107
|
template<typename T>
|
|
108
|
-
static T*
|
|
108
|
+
static T* AllocArray(size_t count)
|
|
109
109
|
{
|
|
110
|
-
auto* arena = StageArena::
|
|
110
|
+
auto* arena = StageArena::Instance();
|
|
111
111
|
// align?
|
|
112
|
-
void* memory = arena->
|
|
112
|
+
void* memory = arena->Alloc(sizeof(T) * count);
|
|
113
113
|
return new (memory) T();
|
|
114
114
|
}
|
|
115
115
|
template<class T>
|
|
116
|
-
static T*
|
|
116
|
+
static T* Clone(const T& arg)
|
|
117
117
|
{
|
|
118
|
-
auto* arena = StageArena::
|
|
119
|
-
void* memory = arena->
|
|
118
|
+
auto* arena = StageArena::Instance();
|
|
119
|
+
void* memory = arena->Alloc(sizeof(T));
|
|
120
120
|
return new (memory) T(arg);
|
|
121
121
|
}
|
|
122
122
|
template<class T>
|
|
123
|
-
static std::vector<const void*>*
|
|
123
|
+
static std::vector<const void*>* CloneVector(const T* arg, size_t count)
|
|
124
124
|
{
|
|
125
|
-
return
|
|
125
|
+
return Alloc<std::vector<const void*>, const T*, const T*>(arg, arg + count);
|
|
126
126
|
}
|
|
127
|
-
void*
|
|
128
|
-
static char*
|
|
129
|
-
void
|
|
130
|
-
void
|
|
127
|
+
void* Alloc(size_t size);
|
|
128
|
+
static char* Strdup(const char* original);
|
|
129
|
+
void Add(void* pointer);
|
|
130
|
+
void Cleanup();
|
|
131
131
|
};
|
|
132
132
|
|
|
133
133
|
#endif // COMMON_H
|