diff --git a/libarkts/native/src/common.cc b/libarkts/native/src/common.cc index cb8b16b383c13b88db6c12599edabe357552e031..eb62a55c793fa0e256f4e17e3b5c3224beef5fe3 100644 --- a/libarkts/native/src/common.cc +++ b/libarkts/native/src/common.cc @@ -549,6 +549,32 @@ KNativePointer impl_FilterNodes(KNativePointer context, KNativePointer node, con } KOALA_INTEROP_4(FilterNodes, KNativePointer, KNativePointer, KNativePointer, KStringPtr, KBoolean) +struct FilterArgs { + es2panda_Impl *impl; + es2panda_Context *context; + int type; + std::vector *result; +}; + +void filterByType(es2panda_AstNode *node, void *argsPointer) +{ + FilterArgs *args = reinterpret_cast(argsPointer); + if (args->impl->AstNodeTypeConst(args->context, node) == args->type) { + args->result->push_back(node); + } +} + +KNativePointer impl_FilterNodes2(KNativePointer context, KNativePointer node, KInt type) +{ + auto _node = reinterpret_cast(node); + auto _context = reinterpret_cast(context); + std::vector result; + FilterArgs args = { GetImpl(), _context, type, &result }; + GetImpl()->AstNodeForEach(_node, filterByType, &args); + return StageArena::cloneVector(result.data(), result.size()); +} +KOALA_INTEROP_3(FilterNodes2, KNativePointer, KNativePointer, KNativePointer, KInt) + /* ----------------------------------------------------------------------------------------------------------------------------- */ diff --git a/libarkts/src/Es2pandaNativeModule.ts b/libarkts/src/Es2pandaNativeModule.ts index d2949f37533a71e814a6c15a5e2398ecb97faf3d..4eb70f8546869552c1f2f9d7ac33cf6d3eddd31a 100644 --- a/libarkts/src/Es2pandaNativeModule.ts +++ b/libarkts/src/Es2pandaNativeModule.ts @@ -226,6 +226,9 @@ export class Es2pandaNativeModule { _FilterNodes(context: KNativePointer, root: KNativePointer, filters: KStringPtr, deeperAfterMatch: KBoolean): KNativePointer { throw new Error('Not implemented'); } + _FilterNodes2(context: KNativePointer, root: KNativePointer, type: KInt): KNativePointer { + throw new Error('Not implemented'); + } // From koala-wrapper _ClassVariableDeclaration(context: KNativePointer, classInstance: KNativePointer): KNativePointer { diff --git a/libarkts/src/arkts-api/utilities/public.ts b/libarkts/src/arkts-api/utilities/public.ts index 73719884a77650abde402ff3c3b8d7cb0d269034..612388595bd7dca2dae1e3b7c0d238ce79005dcf 100644 --- a/libarkts/src/arkts-api/utilities/public.ts +++ b/libarkts/src/arkts-api/utilities/public.ts @@ -496,3 +496,7 @@ export function logDiagnosticWithSuggestion(diagnosticInfo: DiagnosticInfo, sugg export function filterNodes(node: AstNode, filter: string, deeperAfterMatch: boolean): AstNode[] { return unpackNodeArray(global.es2panda._FilterNodes(global.context, passNode(node), filter, deeperAfterMatch)); } + +export function filterNodesByType(node: AstNode, type: Es2pandaAstNodeType): T[] { + return unpackNodeArray(global.es2panda._FilterNodes2(global.context, passNode(node), type), type); +} diff --git a/ui2abc/memo-plugin-ng/src/analysis/AnalysisVisitor.ts b/ui2abc/memo-plugin-ng/src/analysis/AnalysisVisitor.ts index 7551a4ded3e9f88ef52c355b613fb5470d01b120..518135a5e70cc7cf8064c0c7a04fd8743a9d7bfb 100644 --- a/ui2abc/memo-plugin-ng/src/analysis/AnalysisVisitor.ts +++ b/ui2abc/memo-plugin-ng/src/analysis/AnalysisVisitor.ts @@ -85,14 +85,14 @@ class AnalysisVisitor extends arkts.AbstractVisitor { useFilterNodes = true processCalls(node: arkts.AstNode) { - const calls = arkts.filterNodes(node, "type=call", true) as arkts.CallExpression[] + const calls = arkts.filterNodesByType(node, arkts.Es2pandaAstNodeType.AST_NODE_TYPE_CALL_EXPRESSION) calls.forEach(it => { this.memoPluginContext.registerUnmarkedCallExpression(it) }) } processAssignments(node: arkts.AstNode) { - const assignments = arkts.filterNodes(node, "type=assignment", true) as arkts.AssignmentExpression[] + const assignments = arkts.filterNodesByType(node, arkts.Es2pandaAstNodeType.AST_NODE_TYPE_ASSIGNMENT_EXPRESSION) assignments.forEach(it => { if (arkts.isArrowFunctionExpression(it.right)) { this.memoPluginContext.registerUnmarkedAssignmentExpression(it) @@ -101,7 +101,7 @@ class AnalysisVisitor extends arkts.AbstractVisitor { } processScriptFunctions(node: arkts.AstNode) { - const functions = arkts.filterNodes(node, "type=function", true) as arkts.ScriptFunction[] + const functions = arkts.filterNodesByType(node, arkts.Es2pandaAstNodeType.AST_NODE_TYPE_SCRIPT_FUNCTION) functions.forEach(it => { const params = it.getParamsCasted() const implicitThis = computeImplicitThis(it)