From d40fcb5187f154f3ff42d1d1ec7ab99faebbd653 Mon Sep 17 00:00:00 2001 From: Igor Loginov Date: Fri, 21 Feb 2025 15:50:35 +0300 Subject: [PATCH 1/2] fixed return comparation + rewrite parameters --- arkoala-arkts/libarkts/src/arkts-api/types.ts | 4 +- arkoala-arkts/memo-plugin/demo/demo.sts | 14 +++ arkoala-arkts/memo-plugin/demo/demo.ts | 13 +++ .../memo-plugin/src/FunctionTransformer.ts | 106 ++++++++---------- arkoala-arkts/memo-plugin/src/MemoFactory.ts | 59 ++++++++-- .../memo-plugin/src/MemoTransformer.ts | 4 +- .../memo-plugin/src/ParameterTransformer.ts | 51 +++++++++ .../memo-plugin/src/ReturnTranformer.ts | 8 +- arkoala-arkts/memo-plugin/src/utils.ts | 24 ++++ 9 files changed, 212 insertions(+), 71 deletions(-) create mode 100644 arkoala-arkts/memo-plugin/src/ParameterTransformer.ts diff --git a/arkoala-arkts/libarkts/src/arkts-api/types.ts b/arkoala-arkts/libarkts/src/arkts-api/types.ts index e48a86cc5..2b48b844d 100644 --- a/arkoala-arkts/libarkts/src/arkts-api/types.ts +++ b/arkoala-arkts/libarkts/src/arkts-api/types.ts @@ -1031,7 +1031,7 @@ export class ClassProperty extends ClassElement { constructor(peer: KPtr) { assertValidPeer(peer, Es2pandaAstNodeType.AST_NODE_TYPE_CLASS_PROPERTY) super(peer) - this.typeAnnotation = unpackNonNullableNode(global.generatedEs2panda._ClassPropertyTypeAnnotationConst(global.context, this.peer)); + this.typeAnnotation = unpackNode(global.generatedEs2panda._ClassPropertyTypeAnnotationConst(global.context, this.peer)); } static create( @@ -1072,7 +1072,7 @@ export class ClassProperty extends ClassElement { ); } - readonly typeAnnotation: ETSTypeReference; + readonly typeAnnotation?: ETSTypeReference } export class VariableDeclaration extends AstNode { diff --git a/arkoala-arkts/memo-plugin/demo/demo.sts b/arkoala-arkts/memo-plugin/demo/demo.sts index 74bb5f28f..ff8338112 100644 --- a/arkoala-arkts/memo-plugin/demo/demo.sts +++ b/arkoala-arkts/memo-plugin/demo/demo.sts @@ -1,8 +1,22 @@ import { GlobalStateManager, memoEntry, StateContext, memo } from "@koalaui/runtime" import { memo_foo } from "./stub" +@memo +function f(s: string) { + console.log(s) + let x = () => { + console.log(s) + } + x() + let y = (s: string) => { + console.log(s) + } + y("she") +} + @memo function foo_wrapper() { + ETSGLOBAL.f("he") memo_foo("hello") } diff --git a/arkoala-arkts/memo-plugin/demo/demo.ts b/arkoala-arkts/memo-plugin/demo/demo.ts index 989a003bf..1d5af0733 100644 --- a/arkoala-arkts/memo-plugin/demo/demo.ts +++ b/arkoala-arkts/memo-plugin/demo/demo.ts @@ -4,8 +4,21 @@ import { GlobalStateManager, memoEntry, StateContext } from "@koalaui/runtime" import { memo_foo } from "./stub" +/** @memo */ +function f(s: string) { + let x = () => { + console.log(s) + } + x() + let y = (s: string) => { + console.log(s) + } + y("she") +} + /** @memo */ function foo_wrapper() { + f("he") memo_foo("hello") } diff --git a/arkoala-arkts/memo-plugin/src/FunctionTransformer.ts b/arkoala-arkts/memo-plugin/src/FunctionTransformer.ts index 537869375..811922a9d 100644 --- a/arkoala-arkts/memo-plugin/src/FunctionTransformer.ts +++ b/arkoala-arkts/memo-plugin/src/FunctionTransformer.ts @@ -20,6 +20,7 @@ import { PositionalIdTracker, RuntimeNames } from "./utils" +import { ParameterTransformer } from "./ParameterTransformer" import { ReturnTransformer } from "./ReturnTranformer" function hasMemoAnnotation(node: arkts.ScriptFunction) { @@ -29,60 +30,40 @@ function hasMemoAnnotation(node: arkts.ScriptFunction) { } function updateFunctionBody( - node: arkts.BlockStatement | undefined, + node: arkts.BlockStatement, parameters: arkts.ETSParameterExpression[], returnTypeAnnotation: arkts.AstNode | undefined, hash: arkts.NumberLiteral | arkts.StringLiteral -): [arkts.BlockStatement | undefined, arkts.ReturnStatement | undefined] { - if (node === undefined) - return [node, undefined] - const scopeDeclaration = arkts.factory.createVariableDeclaration( - 0, - arkts.Es2pandaVariableDeclarationKind.VARIABLE_DECLARATION_KIND_CONST, - [ - arkts.factory.createVariableDeclarator( - arkts.Es2pandaVariableDeclaratorFlag.VARIABLE_DECLARATOR_FLAG_CONST, - arkts.factory.createIdentifier(RuntimeNames.SCOPE), - arkts.factory.createCallExpression( - arkts.factory.createMemberExpression( - arkts.factory.createIdentifier(RuntimeNames.CONTEXT), - arkts.factory.createIdentifier(RuntimeNames.INTERNAL_SCOPE), - arkts.Es2pandaMemberExpressionKind.MEMBER_EXPRESSION_KIND_PROPERTY_ACCESS, - false, - false - ), - returnTypeAnnotation ? [returnTypeAnnotation] : [arkts.factory.createPrimitiveType(arkts.Es2pandaPrimitiveType.PRIMITIVE_TYPE_VOID)], - [ - factory.createIdArgument(hash), - arkts.factory.createNumericLiteral(parameters.length) - ], - ) +): [ + arkts.BlockStatement, + arkts.VariableDeclaration | undefined, + arkts.ReturnStatement | undefined, +] { + const scopeDeclaration = factory.createScopeDeclaration(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 memoParameters = parameters.map((name, id) => { return factory.createMemoParameterDeclaration(id, name.identifier.name) }) + : [] const syntheticReturnStatement = factory.createSyntheticReturnStatement() - const unchangedCheck = arkts.factory.createIfStatement( - arkts.factory.createMemberExpression( - arkts.factory.createIdentifier(RuntimeNames.SCOPE), - arkts.factory.createIdentifier(RuntimeNames.INTERNAL_VALUE_OK), - arkts.Es2pandaMemberExpressionKind.MEMBER_EXPRESSION_KIND_NONE, - false, - false, - ), - syntheticReturnStatement, - ) + const unchangedCheck = factory.createIfStatementWithSyntheticReturnStatement(syntheticReturnStatement) if (node.statements.length && node.statements[node.statements.length - 1] instanceof arkts.ReturnStatement) { return [ arkts.factory.updateBlock( node, [ scopeDeclaration, - ...memoParameters, + ...memoParametersDeclaration, unchangedCheck, ...node.statements, ] ), + memoParametersDeclaration.length ? memoParametersDeclaration[0] : undefined, syntheticReturnStatement, ] } else { @@ -91,19 +72,24 @@ function updateFunctionBody( node, [ scopeDeclaration, - ...memoParameters, + ...memoParametersDeclaration, unchangedCheck, ...node.statements, arkts.factory.createReturnStatement(), ] ), + memoParametersDeclaration.length ? memoParametersDeclaration[0] : undefined, syntheticReturnStatement, ] } } export class FunctionTransformer extends AbstractVisitor { - constructor(private positionalIdTracker: PositionalIdTracker, private returnTransformer: ReturnTransformer) { + constructor( + private positionalIdTracker: PositionalIdTracker, + private parameterTransformer: ParameterTransformer, + private returnTransformer: ReturnTransformer + ) { super() } @@ -113,33 +99,37 @@ export class FunctionTransformer extends AbstractVisitor { beforeChildren instanceof arkts.MethodDefinition && hasMemoAnnotation(beforeChildren.scriptFunction) const node = this.visitEachChild(beforeChildren) - if (node instanceof arkts.MethodDefinition) { + if (node instanceof arkts.MethodDefinition && node.scriptFunction.body) { if (methodDefinitionHasMemoAnnotation) { - // TODO: fix - const [body, syntheticReturnStatement] = updateFunctionBody( + const [body, memoParametersDeclaration, syntheticReturnStatement] = updateFunctionBody( node.scriptFunction.body, node.scriptFunction.parameters, node.scriptFunction.returnTypeAnnotation, this.positionalIdTracker.id(node.name.name), ) + const afterParameterTransformer = this.parameterTransformer + .withParameters(node.scriptFunction.parameters) + .skip(memoParametersDeclaration) + .visitor(body) + const afterReturnTransformer = this.returnTransformer + .skip(syntheticReturnStatement) + .visitor(afterParameterTransformer) return arkts.factory.updateMethodDefinition( node, arkts.Es2pandaMethodDefinitionKind.METHOD_DEFINITION_KIND_METHOD, node.name, arkts.factory.createFunctionExpression( - this.returnTransformer.skip(syntheticReturnStatement).visitEachChild( - arkts.factory.updateScriptFunction( - node.scriptFunction, - body, - node.scriptFunction.scriptFunctionFlags, - node.scriptFunction.modifiers, - false, - node.scriptFunction.ident, - [...factory.createHiddenParameters(), ...node.scriptFunction.parameters], - node.scriptFunction.typeParamsDecl, - node.scriptFunction.returnTypeAnnotation - ), - ) as arkts.ScriptFunction, + arkts.factory.updateScriptFunction( + node.scriptFunction, + afterReturnTransformer, + node.scriptFunction.scriptFunctionFlags, + node.scriptFunction.modifiers, + false, + node.scriptFunction.ident, + [...factory.createHiddenParameters(), ...node.scriptFunction.parameters], + node.scriptFunction.typeParamsDecl, + node.scriptFunction.returnTypeAnnotation + ) ), node.modifiers, false @@ -148,7 +138,9 @@ export class FunctionTransformer extends AbstractVisitor { } if (node instanceof arkts.CallExpression) { const expr = node.expression - const decl = arkts.getDecl(expr) + const decl = expr instanceof arkts.MemberExpression + ? arkts.getDecl(expr.property) + : arkts.getDecl(expr) if (decl instanceof arkts.MethodDefinition && hasMemoAnnotation(decl.scriptFunction)) { return arkts.factory.updateCallExpression( node, diff --git a/arkoala-arkts/memo-plugin/src/MemoFactory.ts b/arkoala-arkts/memo-plugin/src/MemoFactory.ts index 986c7d2c2..e4760ac18 100644 --- a/arkoala-arkts/memo-plugin/src/MemoFactory.ts +++ b/arkoala-arkts/memo-plugin/src/MemoFactory.ts @@ -79,34 +79,63 @@ export class factory { static createMemoParameterIdentifier(name: string): arkts.Identifier { return arkts.factory.createIdentifier(`${RuntimeNames.PARAMETER}_${name}`) } - static createMemoParameterDeclaration(id: number, name: string): arkts.AstNode { + static createMemoParameterDeclarator(id: number, name: string): arkts.VariableDeclarator { + return arkts.factory.createVariableDeclarator( + arkts.Es2pandaVariableDeclaratorFlag.VARIABLE_DECLARATOR_FLAG_CONST, + factory.createMemoParameterIdentifier(name), + arkts.factory.createCallExpression( + arkts.factory.createMemberExpression( + arkts.factory.createIdentifier(RuntimeNames.SCOPE), + arkts.factory.createIdentifier(RuntimeNames.INTERNAL_PARAMETER_STATE), + arkts.Es2pandaMemberExpressionKind.MEMBER_EXPRESSION_KIND_PROPERTY_ACCESS, + false, + false + ), + undefined, + [ + arkts.factory.createNumericLiteral(id), + arkts.factory.createIdentifier(name), + ], + ) + ) + } + static createMemoParameterAccess(name: string): arkts.MemberExpression { + return arkts.factory.createMemberExpression( + factory.createMemoParameterIdentifier(name), + arkts.factory.createIdentifier(RuntimeNames.VALUE), + arkts.Es2pandaMemberExpressionKind.MEMBER_EXPRESSION_KIND_GETTER, + false, + false, + ) + } + + // Recache + static createScopeDeclaration(returnTypeAnnotation: arkts.AstNode | undefined, hash: arkts.NumberLiteral | arkts.StringLiteral, cnt: number): arkts.VariableDeclaration { return arkts.factory.createVariableDeclaration( 0, arkts.Es2pandaVariableDeclarationKind.VARIABLE_DECLARATION_KIND_CONST, [ arkts.factory.createVariableDeclarator( arkts.Es2pandaVariableDeclaratorFlag.VARIABLE_DECLARATOR_FLAG_CONST, - this.createMemoParameterIdentifier(name), + arkts.factory.createIdentifier(RuntimeNames.SCOPE), arkts.factory.createCallExpression( arkts.factory.createMemberExpression( - arkts.factory.createIdentifier(RuntimeNames.SCOPE), - arkts.factory.createIdentifier(RuntimeNames.INTERNAL_PARAMETER_STATE), + arkts.factory.createIdentifier(RuntimeNames.CONTEXT), + arkts.factory.createIdentifier(RuntimeNames.INTERNAL_SCOPE), arkts.Es2pandaMemberExpressionKind.MEMBER_EXPRESSION_KIND_PROPERTY_ACCESS, false, false ), - undefined, + returnTypeAnnotation ? [returnTypeAnnotation] : [arkts.factory.createPrimitiveType(arkts.Es2pandaPrimitiveType.PRIMITIVE_TYPE_VOID)], [ - arkts.factory.createNumericLiteral(id), - arkts.factory.createIdentifier(name), + factory.createIdArgument(hash), + arkts.factory.createNumericLiteral(cnt) ], ) ) ] ) } - - // Recache static createRecacheCall(arg?: arkts.AstNode): arkts.CallExpression { return arkts.factory.createCallExpression( arkts.factory.createMemberExpression( @@ -131,4 +160,16 @@ export class factory { ), ) } + static createIfStatementWithSyntheticReturnStatement(syntheticReturnStatement: arkts.ReturnStatement): arkts.IfStatement { + return arkts.factory.createIfStatement( + arkts.factory.createMemberExpression( + arkts.factory.createIdentifier(RuntimeNames.SCOPE), + arkts.factory.createIdentifier(RuntimeNames.INTERNAL_VALUE_OK), + arkts.Es2pandaMemberExpressionKind.MEMBER_EXPRESSION_KIND_NONE, + false, + false, + ), + syntheticReturnStatement, + ) + } } diff --git a/arkoala-arkts/memo-plugin/src/MemoTransformer.ts b/arkoala-arkts/memo-plugin/src/MemoTransformer.ts index a4b7df728..8ac6ee906 100644 --- a/arkoala-arkts/memo-plugin/src/MemoTransformer.ts +++ b/arkoala-arkts/memo-plugin/src/MemoTransformer.ts @@ -17,6 +17,7 @@ import * as arkts from "@koalaui/libarkts" import { factory } from "./MemoFactory" import { FunctionTransformer } from "./FunctionTransformer" import { PositionalIdTracker } from "./utils" +import { ParameterTransformer } from "./ParameterTransformer" import { ReturnTransformer } from "./ReturnTranformer" export interface TransformerOptions { @@ -28,8 +29,9 @@ export default function memoTransformer( ) { return (node: arkts.EtsScript) => { const positionalIdTracker = new PositionalIdTracker(arkts.getFileName(), false) + const parameterTransformer = new ParameterTransformer() const returnTransformer = new ReturnTransformer() - const functionTransformer = new FunctionTransformer(positionalIdTracker, returnTransformer) + const functionTransformer = new FunctionTransformer(positionalIdTracker, parameterTransformer, returnTransformer) return functionTransformer.visitor( arkts.factory.updateEtsScript( node, diff --git a/arkoala-arkts/memo-plugin/src/ParameterTransformer.ts b/arkoala-arkts/memo-plugin/src/ParameterTransformer.ts new file mode 100644 index 000000000..0fb3a3c3c --- /dev/null +++ b/arkoala-arkts/memo-plugin/src/ParameterTransformer.ts @@ -0,0 +1,51 @@ +/* + * Copyright (c) 2022-2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import * as arkts from "@koalaui/libarkts" +import { factory } from "./MemoFactory" +import { AbstractVisitor } from "./AbstractVisitor" +import { KPointer } from "@koalaui/interop" +import { isMemoParametersDeclaration } from "./utils" + +export class ParameterTransformer extends AbstractVisitor { + _rewrites?: Map arkts.MemberExpression> + _skip?: arkts.VariableDeclaration + + withParameters(parameters: arkts.ETSParameterExpression[]): ParameterTransformer { + this._rewrites = new Map(parameters.map((it) => { + return [it.peer, () => { return factory.createMemoParameterAccess(it.identifier.name) }] + })) + return this + } + + skip(memoParametersDeclaration?: arkts.VariableDeclaration): ParameterTransformer { + this._skip = memoParametersDeclaration + return this + } + + visitor(beforeChildren: arkts.AstNode): arkts.AstNode { + if (/* beforeChildren === this._skip */ isMemoParametersDeclaration(beforeChildren)) { + return beforeChildren + } + const node = this.visitEachChild(beforeChildren) + if (node instanceof arkts.Identifier) { + const decl = arkts.getDecl(node) + if (decl instanceof arkts.ETSParameterExpression && this._rewrites?.get(decl.peer)) { + return this._rewrites.get(decl.peer)?.() ?? node + } + } + return node + } +} diff --git a/arkoala-arkts/memo-plugin/src/ReturnTranformer.ts b/arkoala-arkts/memo-plugin/src/ReturnTranformer.ts index 02573e05f..6ab243749 100644 --- a/arkoala-arkts/memo-plugin/src/ReturnTranformer.ts +++ b/arkoala-arkts/memo-plugin/src/ReturnTranformer.ts @@ -16,21 +16,25 @@ import * as arkts from "@koalaui/libarkts" import { factory } from "./MemoFactory" import { AbstractVisitor } from "./AbstractVisitor" -import { RuntimeNames } from "./utils" +import { isSyntheticReturnStatement } from "./utils" export class ReturnTransformer extends AbstractVisitor { _skip?: arkts.ReturnStatement + skip(syntheticReturnStatement?: arkts.ReturnStatement): ReturnTransformer { this._skip = syntheticReturnStatement return this } visitor(beforeChildren: arkts.AstNode): arkts.AstNode { + if (/* beforeChildren === this._skip */ isSyntheticReturnStatement(beforeChildren)) { + return beforeChildren + } if (beforeChildren instanceof arkts.ScriptFunction) { return beforeChildren } const node = this.visitEachChild(beforeChildren) - if (node instanceof arkts.ReturnStatement && !(node.peer == this._skip?.peer)) { + if (node instanceof arkts.ReturnStatement) { return arkts.factory.updateReturnStatement(node, factory.createRecacheCall(node.argument)) } return node diff --git a/arkoala-arkts/memo-plugin/src/utils.ts b/arkoala-arkts/memo-plugin/src/utils.ts index a15f05b32..df04fd822 100644 --- a/arkoala-arkts/memo-plugin/src/utils.ts +++ b/arkoala-arkts/memo-plugin/src/utils.ts @@ -79,3 +79,27 @@ export class PositionalIdTracker { : arkts.factory.createNumericLiteral(parseInt(positionId, 16)) } } + +/** + * TODO: + * @deprecated + */ +export function isSyntheticReturnStatement(node: arkts.AstNode) { + return node instanceof arkts.ReturnStatement && + node.argument instanceof arkts.MemberExpression && + node.argument.object instanceof arkts.Identifier && + node.argument.object.name === RuntimeNames.SCOPE && + node.argument.property instanceof arkts.Identifier && + node.argument.property.name === RuntimeNames.INTERNAL_VALUE +} + +/** + * TODO: + * @deprecated + */ +export function isMemoParametersDeclaration(node: arkts.AstNode) { + return node instanceof arkts.VariableDeclaration && + node.declarators.every((it) => { + it.name.name.startsWith(RuntimeNames.PARAMETER) + }) +} -- Gitee From ea3b43a35a43091558023f7250a427839bdf15ac Mon Sep 17 00:00:00 2001 From: Igor Loginov Date: Fri, 21 Feb 2025 15:50:35 +0300 Subject: [PATCH 2/2] fix --- .../libarkts/src/arkts-api/utilities/public.ts | 4 ++++ .../src/generated/peers/TypedAstNode.ts | 2 +- .../memo-plugin/src/FunctionTransformer.ts | 4 +--- .../memo-plugin/src/ParameterTransformer.ts | 18 ++++++++++-------- .../memo-plugin/src/ReturnTranformer.ts | 8 +++++--- arkoala-arkts/memo-plugin/src/utils.ts | 4 +--- 6 files changed, 22 insertions(+), 18 deletions(-) diff --git a/arkoala-arkts/libarkts/src/arkts-api/utilities/public.ts b/arkoala-arkts/libarkts/src/arkts-api/utilities/public.ts index de723054e..8d648d4da 100644 --- a/arkoala-arkts/libarkts/src/arkts-api/utilities/public.ts +++ b/arkoala-arkts/libarkts/src/arkts-api/utilities/public.ts @@ -21,6 +21,7 @@ import { isClassDefinition, isFunctionDeclaration, isScriptFunction } from "../f import { Es2pandaContextState } from "../../generated/Es2pandaEnums" import type { AstNode } from "../peers/AstNode" import type { AnnotationUsage } from "../../generated" +import { MemberExpression } from "../to-be-generated/MemberExpression" export function proceedToState(state: Es2pandaContextState): void { if (state <= global.es2panda._ContextState(global.context)) { @@ -60,6 +61,9 @@ export function rebindSubtree(node: AstNode): void { } export function getDecl(node: AstNode): AstNode | undefined { + if (node instanceof MemberExpression) { + return getDecl(node.property) + } const decl = global.es2panda._DeclarationFromIdentifier(global.context, passNode(node)) if (decl === nullptr) { return undefined diff --git a/arkoala-arkts/libarkts/src/generated/peers/TypedAstNode.ts b/arkoala-arkts/libarkts/src/generated/peers/TypedAstNode.ts index 2e9212727..1cd3e1248 100644 --- a/arkoala-arkts/libarkts/src/generated/peers/TypedAstNode.ts +++ b/arkoala-arkts/libarkts/src/generated/peers/TypedAstNode.ts @@ -30,7 +30,7 @@ import { export abstract class TypedAstNode extends AstNode { constructor(pointer: KNativePointer) { super(pointer) - console.warn("Warning: stub node TypedAstNode") + // console.warn("Warning: stub node TypedAstNode") } } export function isTypedAstNode(node: AstNode): node is TypedAstNode { diff --git a/arkoala-arkts/memo-plugin/src/FunctionTransformer.ts b/arkoala-arkts/memo-plugin/src/FunctionTransformer.ts index 811922a9d..47e8ad344 100644 --- a/arkoala-arkts/memo-plugin/src/FunctionTransformer.ts +++ b/arkoala-arkts/memo-plugin/src/FunctionTransformer.ts @@ -138,9 +138,7 @@ export class FunctionTransformer extends AbstractVisitor { } if (node instanceof arkts.CallExpression) { const expr = node.expression - const decl = expr instanceof arkts.MemberExpression - ? arkts.getDecl(expr.property) - : arkts.getDecl(expr) + const decl = arkts.getDecl(expr) if (decl instanceof arkts.MethodDefinition && hasMemoAnnotation(decl.scriptFunction)) { return arkts.factory.updateCallExpression( node, diff --git a/arkoala-arkts/memo-plugin/src/ParameterTransformer.ts b/arkoala-arkts/memo-plugin/src/ParameterTransformer.ts index 0fb3a3c3c..cf4d874e3 100644 --- a/arkoala-arkts/memo-plugin/src/ParameterTransformer.ts +++ b/arkoala-arkts/memo-plugin/src/ParameterTransformer.ts @@ -20,30 +20,32 @@ import { KPointer } from "@koalaui/interop" import { isMemoParametersDeclaration } from "./utils" export class ParameterTransformer extends AbstractVisitor { - _rewrites?: Map arkts.MemberExpression> - _skip?: arkts.VariableDeclaration + private rewrites?: Map arkts.MemberExpression> + private skipNode?: arkts.VariableDeclaration withParameters(parameters: arkts.ETSParameterExpression[]): ParameterTransformer { - this._rewrites = new Map(parameters.map((it) => { - return [it.peer, () => { return factory.createMemoParameterAccess(it.identifier.name) }] + this.rewrites = new Map(parameters.map((it) => { + return [it.peer, () => factory.createMemoParameterAccess(it.identifier.name)] })) return this } skip(memoParametersDeclaration?: arkts.VariableDeclaration): ParameterTransformer { - this._skip = memoParametersDeclaration + this.skipNode = memoParametersDeclaration return this } visitor(beforeChildren: arkts.AstNode): arkts.AstNode { - if (/* beforeChildren === this._skip */ isMemoParametersDeclaration(beforeChildren)) { + // TODO: temporary checking skip nodes by comparison with expected skip nodes + // Should be fixed when update procedure implemented properly + if (/* beforeChildren === this.skipNode */ isMemoParametersDeclaration(beforeChildren)) { return beforeChildren } const node = this.visitEachChild(beforeChildren) if (node instanceof arkts.Identifier) { const decl = arkts.getDecl(node) - if (decl instanceof arkts.ETSParameterExpression && this._rewrites?.get(decl.peer)) { - return this._rewrites.get(decl.peer)?.() ?? node + if (decl instanceof arkts.ETSParameterExpression && this.rewrites?.get(decl.peer)) { + return this.rewrites.get(decl.peer)?.() ?? node } } return node diff --git a/arkoala-arkts/memo-plugin/src/ReturnTranformer.ts b/arkoala-arkts/memo-plugin/src/ReturnTranformer.ts index 6ab243749..c7361eea5 100644 --- a/arkoala-arkts/memo-plugin/src/ReturnTranformer.ts +++ b/arkoala-arkts/memo-plugin/src/ReturnTranformer.ts @@ -19,15 +19,17 @@ import { AbstractVisitor } from "./AbstractVisitor" import { isSyntheticReturnStatement } from "./utils" export class ReturnTransformer extends AbstractVisitor { - _skip?: arkts.ReturnStatement + private skipNode?: arkts.ReturnStatement skip(syntheticReturnStatement?: arkts.ReturnStatement): ReturnTransformer { - this._skip = syntheticReturnStatement + this.skipNode = syntheticReturnStatement return this } visitor(beforeChildren: arkts.AstNode): arkts.AstNode { - if (/* beforeChildren === this._skip */ isSyntheticReturnStatement(beforeChildren)) { + // TODO: temporary checking skip nodes by comparison with expected skip nodes + // Should be fixed when update procedure implemented properly + if (/* beforeChildren === this.skipNode */ isSyntheticReturnStatement(beforeChildren)) { return beforeChildren } if (beforeChildren instanceof arkts.ScriptFunction) { diff --git a/arkoala-arkts/memo-plugin/src/utils.ts b/arkoala-arkts/memo-plugin/src/utils.ts index df04fd822..96d5befb4 100644 --- a/arkoala-arkts/memo-plugin/src/utils.ts +++ b/arkoala-arkts/memo-plugin/src/utils.ts @@ -99,7 +99,5 @@ export function isSyntheticReturnStatement(node: arkts.AstNode) { */ export function isMemoParametersDeclaration(node: arkts.AstNode) { return node instanceof arkts.VariableDeclaration && - node.declarators.every((it) => { - it.name.name.startsWith(RuntimeNames.PARAMETER) - }) + node.declarators.every((it) => it.name.name.startsWith(RuntimeNames.PARAMETER)) } -- Gitee