@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.
Files changed (51) hide show
  1. package/build/libarkts-copy/generator/options.json5 +24 -47
  2. package/build/libarkts-copy/native/meson.build +29 -13
  3. package/build/libarkts-copy/native/meson_options.txt +9 -3
  4. package/build/libarkts-copy/native/mingw.cross +2 -0
  5. package/build/libarkts-copy/native/src/{bridges.cc → bridges.cpp} +31 -92
  6. package/build/libarkts-copy/native/src/{common.cc → common.cpp} +240 -107
  7. package/build/libarkts-copy/native/src/common.h +22 -22
  8. package/build/libarkts-copy/native/src/{memoryTracker.cc → memoryTracker.cpp} +45 -32
  9. package/build/libarkts-copy/package.json +13 -11
  10. package/build/libarkts-copy/src/Es2pandaNativeModule.ts +10 -63
  11. package/build/libarkts-copy/src/arkts-api/AbstractVisitor.ts +9 -3
  12. package/build/libarkts-copy/src/arkts-api/ImportStorage.ts +10 -7
  13. package/build/libarkts-copy/src/arkts-api/ProgramProvider.ts +14 -5
  14. package/build/libarkts-copy/src/arkts-api/class-by-peer.ts +19 -1
  15. package/build/libarkts-copy/src/arkts-api/factory/nodeFactory.ts +4 -0
  16. package/build/libarkts-copy/src/arkts-api/index.ts +0 -2
  17. package/build/libarkts-copy/src/arkts-api/node-cache.ts +12 -3
  18. package/build/libarkts-copy/src/arkts-api/node-utilities/ObjectExpression.ts +1 -1
  19. package/build/libarkts-copy/src/arkts-api/node-utilities/OverloadDeclaration.ts +29 -0
  20. package/build/libarkts-copy/src/arkts-api/node-utilities/ScriptFunction.ts +4 -4
  21. package/build/libarkts-copy/src/arkts-api/peers/AstNode.ts +0 -16
  22. package/build/libarkts-copy/src/arkts-api/peers/Config.ts +1 -1
  23. package/build/libarkts-copy/src/arkts-api/peers/Context.ts +9 -9
  24. package/build/libarkts-copy/src/arkts-api/plugins.ts +113 -15
  25. package/build/libarkts-copy/src/arkts-api/static/global.ts +1 -4
  26. package/build/libarkts-copy/src/arkts-api/static/profiler.ts +5 -5
  27. package/build/libarkts-copy/src/arkts-api/utilities/performance.ts +2 -1
  28. package/build/libarkts-copy/src/arkts-api/utilities/private.ts +11 -43
  29. package/build/libarkts-copy/src/arkts-api/utilities/public.ts +41 -9
  30. package/build/libarkts-copy/src/arkts-api/visitor.ts +4 -25
  31. package/build/libarkts-copy/src/checkSdk.ts +1 -1
  32. package/build/libarkts-copy/src/index.ts +1 -2
  33. package/build/libarkts-copy/src/memo-node-cache.ts +143 -0
  34. package/build/libarkts-copy/src/plugin-utils.ts +72 -40
  35. package/build/libarkts-copy/src/reexport-for-generated.ts +3 -1
  36. package/build/libarkts-copy/src/tracer.ts +2 -2
  37. package/build/libarkts-copy/src/utils.ts +10 -14
  38. package/build/libarkts-copy/tsconfig.json +0 -3
  39. package/lib/index.js +5517 -10446
  40. package/package.json +9 -7
  41. package/templates/{bridges.cc → bridges.cpp} +1 -1
  42. package/build/libarkts-copy/src/arkts-api/node-utilities/Program.ts +0 -45
  43. package/build/libarkts-copy/src/arkts-api/peers/DiagnosticKind.ts +0 -23
  44. package/build/libarkts-copy/src/ts-api/factory/nodeFactory.ts +0 -1250
  45. package/build/libarkts-copy/src/ts-api/factory/nodeTests.ts +0 -125
  46. package/build/libarkts-copy/src/ts-api/index.ts +0 -27
  47. package/build/libarkts-copy/src/ts-api/static/enums.ts +0 -18
  48. package/build/libarkts-copy/src/ts-api/types.ts +0 -1075
  49. package/build/libarkts-copy/src/ts-api/utilities/private.ts +0 -292
  50. package/build/libarkts-copy/src/ts-api/utilities/public.ts +0 -55
  51. package/build/libarkts-copy/src/ts-api/visitor/visitor.ts +0 -139
@@ -1,5 +1,5 @@
1
1
  /*
2
- * Copyright (c) 2022-2023 Huawei Device Co., Ltd.
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.h>
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::instance()
32
+ StageArena* StageArena::Instance()
31
33
  {
32
34
  return &currentArena;
33
35
  }
34
36
 
35
- void StageArena::add(void* pointer)
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::cleanup()
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
- cleanup();
61
+ Cleanup();
60
62
  }
61
63
 
62
- char* StageArena::strdup(const char* string)
64
+ char* StageArena::Strdup(const char* string)
63
65
  {
64
- auto* arena = StageArena::instance();
66
+ auto* arena = StageArena::Instance();
65
67
  auto size = strlen(string) + 1;
66
- char* memory = (char*)arena->alloc(size);
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::alloc(size_t size)
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
- add(result);
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
- // TODO: @panda/sdk will be changed to match ohos-sdk
181
- void* FindLibrary() {
182
- void *res = nullptr;
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::strdup(ptr.c_str() ? ptr.c_str() : "");
230
+ return StageArena::Strdup(ptr.c_str() ? ptr.c_str() : "");
229
231
  }
230
232
 
231
- KNativePointer impl_CreateConfig(KInt argc, KStringArray& argvPtr)
233
+ void impl_DestroyConfig(KNativePointer config)
232
234
  {
233
- return GetImpl()->CreateConfig(argc, getStringArray(argvPtr));
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
- KOALA_INTEROP_2(CreateConfig, KNativePointer, KInt, KStringArray)
242
+ KOALA_INTEROP_V1(DestroyConfig, KNativePointer)
236
243
 
237
- KNativePointer impl_DestroyConfig(KNativePointer configPtr)
238
- {
239
- auto config = reinterpret_cast<es2panda_Config*>(configPtr);
240
- GetImpl()->DestroyConfig(config);
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
- void impl_DestroyContext(KNativePointer contextPtr)
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 context = reinterpret_cast<es2panda_Context*>(contextPtr);
248
- GetImpl()->DestroyContext(context);
249
- StageArena::instance()->cleanup();
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
- KOALA_INTEROP_V1(DestroyContext, KNativePointer)
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
- auto node = reinterpret_cast<es2panda_AstNode*>(nodePtr);
258
- auto context = reinterpret_cast<es2panda_Context*>(contextPtr);
259
- auto callee = reinterpret_cast<es2panda_AstNode*>(calleePtr);
260
- auto arguments = reinterpret_cast<es2panda_AstNode**>(argumentsPtr);
261
- auto typeParams = reinterpret_cast<es2panda_AstNode*>(typeParamsPtr);
262
- auto optional = static_cast<bool>(optionalT);
263
- auto trailingComma = static_cast<bool>(trailingCommaT);
264
-
265
- auto nn =
266
- GetImpl()->CreateCallExpression(context, callee, arguments, argumentsLen, typeParams, optional, trailingComma);
267
- GetImpl()->AstNodeSetOriginalNode(context, nn, node);
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::clone(cachedChildren);
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
- bool match(es2panda_AstNode* node)
442
+
443
+ ~Pattern() = default;
444
+
445
+ bool match(es2panda_AstNode* node) const
396
446
  {
397
447
  if (key == "type") {
398
- auto type = impl->AstNodeTypeConst(context, node);
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
- std::size_t length = 0;
412
- Es2pandaAstNodeType type = impl->AstNodeTypeConst(context, node);
413
- es2panda_AstNode** result = nullptr;
414
- switch (type) {
415
- case Es2pandaAstNodeType::AST_NODE_TYPE_METHOD_DEFINITION: {
416
- auto function = impl->MethodDefinitionFunction(context, node);
417
- result = impl->FunctionDeclarationAnnotations(context, function, &length);
418
- break;
419
- }
420
- case Es2pandaAstNodeType::AST_NODE_TYPE_FUNCTION_DECLARATION:
421
- result = impl->FunctionDeclarationAnnotations(context, node, &length);
422
- break;
423
- case AST_NODE_TYPE_ARROW_FUNCTION_EXPRESSION: {
424
- auto function = impl->ArrowFunctionExpressionFunction(context, node);
425
- result = impl->FunctionDeclarationAnnotations(context, function, &length);
426
- break;
427
- }
428
- case Es2pandaAstNodeType::AST_NODE_TYPE_CLASS_PROPERTY:
429
- result = impl->ClassPropertyAnnotations(context, node, &length);
430
- break;
431
- default:
432
- return false;
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
- bool found = false;
435
- for (std::size_t i = 0; i < length && result; i++) {
436
- es2panda_AstNode* ident = impl->AnnotationUsageIrGetBaseNameConst(context, result[i]);
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
- return found;
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
- return false;
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 matchWildcard(const std::string& pattern, const char* value)
527
+ bool MatchWildcard(const std::string& pattern, const char* foundValue) const
446
528
  {
447
- if (pattern.find('*') == std::string::npos) {
448
- return pattern == value;
529
+ if (!isWildcard) {
530
+ return pattern == foundValue;
449
531
  }
450
- regex_t regex;
451
- regmatch_t match[1];
452
- regcomp(&regex, pattern.c_str(), REG_NEWLINE);
453
- return regexec(&regex, 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 impl_FilterNodes(KNativePointer context, KNativePointer node, const KStringPtr& filters)
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
- if (matcher.match(current)) {
573
+ bool isMatch = matcher.match(current);
574
+ if (isMatch) {
494
575
  result.push_back(current);
495
- } else {
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::cloneVector(result.data(), result.size());
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
- KOALA_INTEROP_3(FilterNodes, KNativePointer, KNativePointer, KNativePointer, KStringPtr)
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* instance();
85
+ static StageArena* Instance();
86
86
  template<typename T>
87
- static T* alloc()
87
+ static T* Alloc()
88
88
  {
89
- auto* arena = StageArena::instance();
90
- void* memory = arena->alloc(sizeof(T));
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* alloc(T1 arg1)
94
+ static T* Alloc(T1 arg1)
95
95
  {
96
- auto* arena = StageArena::instance();
97
- void* memory = arena->alloc(sizeof(T));
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* alloc(T1 arg1, T2 arg2)
101
+ static T* Alloc(T1 arg1, T2 arg2)
102
102
  {
103
- auto* arena = StageArena::instance();
104
- void* memory = arena->alloc(sizeof(T));
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* allocArray(size_t count)
108
+ static T* AllocArray(size_t count)
109
109
  {
110
- auto* arena = StageArena::instance();
110
+ auto* arena = StageArena::Instance();
111
111
  // align?
112
- void* memory = arena->alloc(sizeof(T) * count);
112
+ void* memory = arena->Alloc(sizeof(T) * count);
113
113
  return new (memory) T();
114
114
  }
115
115
  template<class T>
116
- static T* clone(const T& arg)
116
+ static T* Clone(const T& arg)
117
117
  {
118
- auto* arena = StageArena::instance();
119
- void* memory = arena->alloc(sizeof(T));
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*>* cloneVector(const T* arg, size_t count)
123
+ static std::vector<const void*>* CloneVector(const T* arg, size_t count)
124
124
  {
125
- return alloc<std::vector<const void*>, const T*, const T*>(arg, arg + count);
125
+ return Alloc<std::vector<const void*>, const T*, const T*>(arg, arg + count);
126
126
  }
127
- void* alloc(size_t size);
128
- static char* strdup(const char* original);
129
- void add(void* pointer);
130
- void cleanup();
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