diff --git a/arkoala-arkts/memo-plugin/src/FunctionTransformer.ts b/arkoala-arkts/memo-plugin/src/FunctionTransformer.ts index 6f8a2488be9e28f327d3ff984dad58a3c9e45218..2e724bc92b34f6a8875d215110d466ce63645593 100644 --- a/arkoala-arkts/memo-plugin/src/FunctionTransformer.ts +++ b/arkoala-arkts/memo-plugin/src/FunctionTransformer.ts @@ -46,16 +46,7 @@ function updateFunctionBody( stableThis ? arkts.factory.createPrimitiveType(arkts.Es2pandaPrimitiveType.PRIMITIVE_TYPE_VOID) : returnTypeAnnotation, hash, parameters.length ) - const memoParameters = parameters.map((name, id) => { return factory.createMemoParameterDeclarator(id, name.identifier.name) }) - const memoParametersDeclaration = memoParameters.length - ? [ - arkts.factory.createVariableDeclaration( - 0, - arkts.Es2pandaVariableDeclarationKind.VARIABLE_DECLARATION_KIND_CONST, - memoParameters, - ) - ] - : [] + const memoParametersDeclaration = parameters.length ? factory.createMemoParameterDeclaration(parameters) : undefined const syntheticReturnStatement = factory.createSyntheticReturnStatement(stableThis) const unchangedCheck = factory.createIfStatementWithSyntheticReturnStatement(syntheticReturnStatement) return [ @@ -63,13 +54,13 @@ function updateFunctionBody( node, [ scopeDeclaration, - ...memoParametersDeclaration, + ...(memoParametersDeclaration ? [memoParametersDeclaration] : []), unchangedCheck, ...node.statements, ...(mayAddLastReturn(node) ? [arkts.factory.createReturnStatement()] : []), ] ), - memoParametersDeclaration.length ? memoParametersDeclaration[0] : undefined, + memoParametersDeclaration, syntheticReturnStatement, ] } diff --git a/arkoala-arkts/memo-plugin/src/MemoFactory.ts b/arkoala-arkts/memo-plugin/src/MemoFactory.ts index d26fbb67dad036991940fabc350d7feab3f8d57f..50747a9bb2a516ff37032033a3a5a3702a224207 100644 --- a/arkoala-arkts/memo-plugin/src/MemoFactory.ts +++ b/arkoala-arkts/memo-plugin/src/MemoFactory.ts @@ -120,6 +120,13 @@ export class factory { ) ) } + static createMemoParameterDeclaration(parameters: arkts.ETSParameterExpression[]): arkts.VariableDeclaration { + return arkts.factory.createVariableDeclaration( + 0, + arkts.Es2pandaVariableDeclarationKind.VARIABLE_DECLARATION_KIND_CONST, + parameters.map((name, id) => { return factory.createMemoParameterDeclarator(id, name.identifier.name) }), + ) + } static createMemoParameterAccess(name: string): arkts.MemberExpression { return arkts.factory.createMemberExpression( factory.createMemoParameterIdentifier(name), diff --git a/arkoala-arkts/memo-plugin/src/utils.ts b/arkoala-arkts/memo-plugin/src/utils.ts index a43d108516095ec96e40d6d65b05d584740d9e13..99c4638894711c1ede0dc482b737cdcf227f40dc 100644 --- a/arkoala-arkts/memo-plugin/src/utils.ts +++ b/arkoala-arkts/memo-plugin/src/utils.ts @@ -102,7 +102,9 @@ export function hasMemoStableAnnotation(node: arkts.ClassDefinition) { } /** - * TODO: + * Checks that node was obtained from MemoFactory.createSyntheticReturnStatement + * + * TODO: remove when node updates are done in place * @deprecated */ export function isSyntheticReturnStatement(node: arkts.AstNode) { @@ -113,11 +115,24 @@ export function isSyntheticReturnStatement(node: arkts.AstNode) { node.argument.object.name === RuntimeNames.SCOPE && arkts.isIdentifier(node.argument.property) && node.argument.property.name === RuntimeNames.INTERNAL_VALUE - ) || arkts.isBlockStatement(node) + ) || ( + arkts.isBlockStatement(node) && + node.statements.length === 2 && + arkts.isMemberExpression(node.statements[0]) && + arkts.isIdentifier(node.statements[0].object) && + node.statements[0].object.name === RuntimeNames.SCOPE && + arkts.isIdentifier(node.statements[0].property) && + node.statements[0].property.name === RuntimeNames.INTERNAL_VALUE && + arkts.isReturnStatement(node.statements[1]) && + node.statements[1].argument && + arkts.isThisExpression(node.statements[1].argument) + ) } /** - * TODO: + * Checks that node was obtained from MemoFactory.createMemoParameterDeclaration + * + * TODO: remove when node updates are done in place * @deprecated */ export function isMemoParametersDeclaration(node: arkts.AstNode) {