From 05f3ec4a90a1220d705f4e8f43be1b2c4fc0eb1c Mon Sep 17 00:00:00 2001 From: Alexander Gorshenev Date: Wed, 19 Feb 2025 21:35:27 +0300 Subject: [PATCH 1/4] Don't expose FunctionSignature object to the user Signed-off-by: Alexander Gorshenev --- arkoala-arkts/libarkts/src/arkts-api/types.ts | 8 ++++---- arkoala-arkts/libarkts/src/arkts-api/visitor.ts | 15 ++++++--------- .../memo-plugin/src/function-transformer.ts | 4 ++-- 3 files changed, 12 insertions(+), 15 deletions(-) diff --git a/arkoala-arkts/libarkts/src/arkts-api/types.ts b/arkoala-arkts/libarkts/src/arkts-api/types.ts index d1136c3fe..4d555986a 100644 --- a/arkoala-arkts/libarkts/src/arkts-api/types.ts +++ b/arkoala-arkts/libarkts/src/arkts-api/types.ts @@ -508,18 +508,18 @@ export class ScriptFunction extends AstNode { static create( body: AstNode | undefined, - signature: FunctionSignature | undefined, functionFlags: Es2pandaScriptFunctionFlags, modifierFlags: Es2pandaModifierFlags, declare: boolean, ident: Identifier | undefined, - parameters?: ETSParameterExpression[], + parameters: ETSParameterExpression[]|undefined, + typeParamsDecl: TSTypeParameterDeclaration|undefined ): ScriptFunction { const peer = global.generatedEs2panda._CreateScriptFunction( global.context, passNode(body), - signature?.peer ?? FunctionSignature.create( - undefined, + FunctionSignature.create( + typeParamsDecl, parameters!, undefined ).peer, diff --git a/arkoala-arkts/libarkts/src/arkts-api/visitor.ts b/arkoala-arkts/libarkts/src/arkts-api/visitor.ts index e52994391..826340bce 100644 --- a/arkoala-arkts/libarkts/src/arkts-api/visitor.ts +++ b/arkoala-arkts/libarkts/src/arkts-api/visitor.ts @@ -175,16 +175,13 @@ export function visitEachChild( factory.updateScriptFunction( node.scriptFunction, nodeVisitor(node.scriptFunction.body, visitor), - FunctionSignature.create( - node.scriptFunction.typeParamsDecl, - node.scriptFunction.parameters, - // TODO: fix return type - nullptr - ), 0, node.modifiers | Es2pandaModifierFlags.MODIFIER_FLAGS_PUBLIC || Es2pandaModifierFlags.MODIFIER_FLAGS_STATIC, false, - node.name + node.name, + node.scriptFunction.parameters, + node.scriptFunction.typeParamsDecl, + // TODO: return type ) ), node.modifiers, @@ -195,12 +192,12 @@ export function visitEachChild( return factory.updateScriptFunction( node, nodeVisitor(node.body, visitor), - nullptr, node.scriptFunctionFlags, Es2pandaModifierFlags.MODIFIER_FLAGS_NONE, false, nodeVisitor(node.ident, visitor), - nodesVisitor(node.parameters, visitor) + nodesVisitor(node.parameters, visitor), + nodeVisitor(node.typeParamsDecl, visitor) ) } if (node instanceof EtsImportDeclaration) { diff --git a/arkoala-arkts/memo-plugin/src/function-transformer.ts b/arkoala-arkts/memo-plugin/src/function-transformer.ts index b42df68bd..847d6e32d 100644 --- a/arkoala-arkts/memo-plugin/src/function-transformer.ts +++ b/arkoala-arkts/memo-plugin/src/function-transformer.ts @@ -130,12 +130,12 @@ export class FunctionTransformer extends AbstractVisitor { arkts.factory.updateScriptFunction( node.scriptFunction, updateFunctionBody(node.scriptFunction.body, this.positionalIdTracker.id(node.name.name)), - undefined, node.scriptFunction.scriptFunctionFlags, node.scriptFunction.modifiers, false, node.scriptFunction.ident, - [...createHiddenParameters(), ...node.scriptFunction.parameters] + [...createHiddenParameters(), ...node.scriptFunction.parameters], + node.scriptFunction.typeParamsDecl, ), ), node.modifiers, -- Gitee From b3b75a015fc45233616c90a1b11c596c07fed9ea Mon Sep 17 00:00:00 2001 From: Alexander Gorshenev Date: Wed, 19 Feb 2025 23:38:42 +0300 Subject: [PATCH 2/4] Use enum instead of a constant Signed-off-by: Alexander Gorshenev --- arkoala-arkts/memo-plugin/src/function-transformer.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/arkoala-arkts/memo-plugin/src/function-transformer.ts b/arkoala-arkts/memo-plugin/src/function-transformer.ts index 847d6e32d..b3f299de2 100644 --- a/arkoala-arkts/memo-plugin/src/function-transformer.ts +++ b/arkoala-arkts/memo-plugin/src/function-transformer.ts @@ -124,7 +124,7 @@ export class FunctionTransformer extends AbstractVisitor { // TODO: fix return arkts.factory.updateMethodDefinition( node, - 2, + arkts.Es2pandaMethodDefinitionKind.METHOD_DEFINITION_KIND_METHOD, node.name, arkts.factory.createFunctionExpression( arkts.factory.updateScriptFunction( -- Gitee From ed99499807a440ac818aaaf9cb9f22d28eebe445 Mon Sep 17 00:00:00 2001 From: Alexander Gorshenev Date: Thu, 20 Feb 2025 00:27:56 +0300 Subject: [PATCH 3/4] more Signed-off-by: Alexander Gorshenev --- arkoala-arkts/arkui/src/sts/arkui.sts | 9 +--- .../plugins/src/builder-lambda-transformer.ts | 42 +++++++++---------- .../plugins/src/struct-transformer.ts | 9 ++-- arkoala-arkts/libarkts/src/arkts-api/types.ts | 11 +++-- .../libarkts/src/arkts-api/visitor.ts | 5 ++- .../memo-plugin/src/function-transformer.ts | 1 + 6 files changed, 35 insertions(+), 42 deletions(-) diff --git a/arkoala-arkts/arkui/src/sts/arkui.sts b/arkoala-arkts/arkui/src/sts/arkui.sts index 58a5b1b1a..8a0ade1b5 100644 --- a/arkoala-arkts/arkui/src/sts/arkui.sts +++ b/arkoala-arkts/arkui/src/sts/arkui.sts @@ -100,9 +100,7 @@ export class Button extends CommonMethod { options?: ButtonOptions|string, //content?: () => void ): Button { - //throw new Error("This method should only be called through a @BuilderLambda redirect") - console.log("Button") - return factory() + throw new Error("This method should only be called through a @BuilderLambda redirect") } static instantiateImpl( @@ -129,10 +127,7 @@ export class Text extends CommonMethod { options?: TextOptions|string, //content?: () => void ): Text { - //throw new Error("This method should only be called through a @BuilderLambda redirect") - - console.log("Text") - return factory() + throw new Error("This method should only be called through a @BuilderLambda redirect") } // TODO: the second argument will be gone after hte plugin is improved diff --git a/arkoala-arkts/libarkts/plugins/src/builder-lambda-transformer.ts b/arkoala-arkts/libarkts/plugins/src/builder-lambda-transformer.ts index ab1fc833e..0a11eb781 100644 --- a/arkoala-arkts/libarkts/plugins/src/builder-lambda-transformer.ts +++ b/arkoala-arkts/libarkts/plugins/src/builder-lambda-transformer.ts @@ -40,10 +40,14 @@ function getLambdaArg(lambdaBody: arkts.AstNode, typeName: string|undefined): ar undefined ) - const signature = arkts.FunctionSignature.create(undefined, - [ - param - ], + const func = arkts.factory.createScriptFunction( + body, + arkts.Es2pandaScriptFunctionFlags.SCRIPT_FUNCTION_FLAGS_ARROW, + arkts.Es2pandaModifierFlags.MODIFIER_FLAGS_PUBLIC | arkts.Es2pandaModifierFlags.MODIFIER_FLAGS_STATIC, + false, + undefined, + [ param ], + undefined, // TODO: it should be the return type of the function annotated with the @BuilderLambda typeName ? arkts.factory.createTypeReferenceFromId( arkts.factory.createIdentifier( @@ -52,15 +56,6 @@ function getLambdaArg(lambdaBody: arkts.AstNode, typeName: string|undefined): ar ) : undefined ) - const func = arkts.factory.createScriptFunction( - body, - signature, - arkts.Es2pandaScriptFunctionFlags.SCRIPT_FUNCTION_FLAGS_ARROW, - arkts.Es2pandaModifierFlags.MODIFIER_FLAGS_PUBLIC | arkts.Es2pandaModifierFlags.MODIFIER_FLAGS_STATIC, - false, - undefined - ) - return arkts.factory.createArrowFunction( func ) @@ -201,24 +196,25 @@ function builderLambdaBodyRewrite(node: arkts.AstNode): arkts.AstNode { const body: arkts.BlockStatement = scriptFunc.body; const statements: arkts.AstNode[] = body.statements.map((statement: arkts.AstNode) => { if ( - arkts.isExpressionStatement(statement) - && statement.expression + arkts.isExpressionStatement(statement) + && statement.expression && arkts.isCallExpression(statement.expression) ) { return transformBuilderLambda(statement.expression); } return statement; - }); + }); const updateBody = arkts.factory.updateBlock(body, statements); - const signature: arkts.FunctionSignature = arkts.FunctionSignature.create(undefined, [], undefined); const updateFunc: arkts.ScriptFunction = arkts.factory.updateScriptFunction( - scriptFunc, - updateBody, - signature, // TODO: Cannot get signature from original ScriptFunction node + scriptFunc, + updateBody, scriptFunc.scriptFunctionFlags, scriptFunc.modifiers, false, + undefined, + undefined, + undefined, undefined ); @@ -271,11 +267,11 @@ function transformBuilderLambda(node: arkts.CallExpression): arkts.AstNode { const typeName = builderLambdaTypeName(leaf) const lambdaArg = getLambdaArg(lambdaBody, typeName) - let args: arkts.AstNode[] = leaf.arguments.length < 3 + let args: arkts.AstNode[] = leaf.arguments.length < 3 ? leaf.arguments as arkts.AstNode[] : [ - ...leaf.arguments.slice(0, 2), - builderLambdaBodyRewrite(leaf.arguments.at(2)!), + ...leaf.arguments.slice(0, 2), + builderLambdaBodyRewrite(leaf.arguments.at(2)!), ...leaf.arguments.slice(3) // Currently, this is never reached since the maximum length of arguments is 3 ]; diff --git a/arkoala-arkts/libarkts/plugins/src/struct-transformer.ts b/arkoala-arkts/libarkts/plugins/src/struct-transformer.ts index 1243e1c91..826e0b193 100644 --- a/arkoala-arkts/libarkts/plugins/src/struct-transformer.ts +++ b/arkoala-arkts/libarkts/plugins/src/struct-transformer.ts @@ -112,17 +112,14 @@ function transformBuildMethod( const params: arkts.ETSParameterExpression[] = prepareArgsInBuildMethod(className); - const signature: arkts.FunctionSignature = arkts.FunctionSignature.create( - undefined, - params, - undefined - ); const updateScriptFunction = arkts.factory.createScriptFunction( scriptFunction.body, - signature, scriptFunction.scriptFunctionFlags, scriptFunction.modifiers, false, + undefined, + params, + undefined, undefined ); diff --git a/arkoala-arkts/libarkts/src/arkts-api/types.ts b/arkoala-arkts/libarkts/src/arkts-api/types.ts index 4d555986a..ce18131e8 100644 --- a/arkoala-arkts/libarkts/src/arkts-api/types.ts +++ b/arkoala-arkts/libarkts/src/arkts-api/types.ts @@ -472,7 +472,7 @@ export class FunctionSignature extends ArktsObject { static create( typeParamsDecl: TSTypeParameterDeclaration | undefined, - params: readonly AstNode[], + params: readonly AstNode[] | undefined, returnTypeAnnotation: AstNode | undefined, ): FunctionSignature { return new FunctionSignature( @@ -480,7 +480,7 @@ export class FunctionSignature extends ArktsObject { global.context, passNode(typeParamsDecl), passNodeArray(params), - params.length, + params?.length ?? 0, passNode(returnTypeAnnotation), false ) @@ -498,6 +498,7 @@ export class ScriptFunction extends AstNode { super(peer) this.parameters = unpackNodeArray(global.generatedEs2panda._ScriptFunctionParams(global.context, this.peer)) this.typeParamsDecl = unpackNode(global.generatedEs2panda._ScriptFunctionTypeParams(global.context, this.peer)) + this.returnTypeAnnotation = unpackNode(global.generatedEs2panda._ScriptFunctionReturnTypeAnnotation(global.context, this.peer)) this.body = unpackNode(global.generatedEs2panda._ScriptFunctionBody(global.context, this.peer)) // this.signature = unpackNode(global.generatedEs2panda._ScriptFunctionSignature(global.context, this.peer)) // this.declare = global.generatedEs2panda._ScriptFunctionDeclareConst(global.context, this.peer) @@ -513,7 +514,8 @@ export class ScriptFunction extends AstNode { declare: boolean, ident: Identifier | undefined, parameters: ETSParameterExpression[]|undefined, - typeParamsDecl: TSTypeParameterDeclaration|undefined + typeParamsDecl: TSTypeParameterDeclaration|undefined, + returnTypeAnnotation: AstNode|undefined ): ScriptFunction { const peer = global.generatedEs2panda._CreateScriptFunction( global.context, @@ -521,7 +523,7 @@ export class ScriptFunction extends AstNode { FunctionSignature.create( typeParamsDecl, parameters!, - undefined + returnTypeAnnotation ).peer, functionFlags, modifierFlags @@ -576,6 +578,7 @@ export class ScriptFunction extends AstNode { readonly parameters: ETSParameterExpression[] readonly typeParamsDecl?: TSTypeParameterDeclaration + readonly returnTypeAnnotation: AstNode | undefined readonly body?: BlockStatement // readonly signature: FunctionSignature readonly scriptFunctionFlags: KInt diff --git a/arkoala-arkts/libarkts/src/arkts-api/visitor.ts b/arkoala-arkts/libarkts/src/arkts-api/visitor.ts index 826340bce..2b000c8e0 100644 --- a/arkoala-arkts/libarkts/src/arkts-api/visitor.ts +++ b/arkoala-arkts/libarkts/src/arkts-api/visitor.ts @@ -181,7 +181,7 @@ export function visitEachChild( node.name, node.scriptFunction.parameters, node.scriptFunction.typeParamsDecl, - // TODO: return type + node.scriptFunction.returnTypeAnnotation ) ), node.modifiers, @@ -197,7 +197,8 @@ export function visitEachChild( false, nodeVisitor(node.ident, visitor), nodesVisitor(node.parameters, visitor), - nodeVisitor(node.typeParamsDecl, visitor) + nodeVisitor(node.typeParamsDecl, visitor), + nodeVisitor(node.returnTypeAnnotation, visitor) ) } if (node instanceof EtsImportDeclaration) { diff --git a/arkoala-arkts/memo-plugin/src/function-transformer.ts b/arkoala-arkts/memo-plugin/src/function-transformer.ts index b3f299de2..1aed94b37 100644 --- a/arkoala-arkts/memo-plugin/src/function-transformer.ts +++ b/arkoala-arkts/memo-plugin/src/function-transformer.ts @@ -136,6 +136,7 @@ export class FunctionTransformer extends AbstractVisitor { node.scriptFunction.ident, [...createHiddenParameters(), ...node.scriptFunction.parameters], node.scriptFunction.typeParamsDecl, + node.scriptFunction.returnTypeAnnotation ), ), node.modifiers, -- Gitee From 17c9174d1cddf34a5be618b7ba5d6a1786031eaf Mon Sep 17 00:00:00 2001 From: Alexander Gorshenev Date: Thu, 20 Feb 2025 01:11:54 +0300 Subject: [PATCH 4/4] more Signed-off-by: Alexander Gorshenev --- .../test/arkts-api/functions/create.test.ts | 67 +++++++++---------- .../arkts-api/import-export/import.test.ts | 10 ++- 2 files changed, 36 insertions(+), 41 deletions(-) diff --git a/arkoala-arkts/libarkts/test/arkts-api/functions/create.test.ts b/arkoala-arkts/libarkts/test/arkts-api/functions/create.test.ts index 10a452f91..928e92ccc 100644 --- a/arkoala-arkts/libarkts/test/arkts-api/functions/create.test.ts +++ b/arkoala-arkts/libarkts/test/arkts-api/functions/create.test.ts @@ -50,17 +50,15 @@ suite(util.basename(__filename), () => { ) ] ), - arkts.FunctionSignature.create( - undefined, - [], - undefined - ), arkts.Es2pandaScriptFunctionFlags.SCRIPT_FUNCTION_FLAGS_NONE, arkts.Es2pandaModifierFlags.MODIFIER_FLAGS_PUBLIC | arkts.Es2pandaModifierFlags.MODIFIER_FLAGS_STATIC, false, arkts.factory.createIdentifier( 'foo' - ) + ), + [], + undefined, + undefined ), false ), @@ -152,40 +150,39 @@ suite(util.basename(__filename), () => { ) ] ), - arkts.FunctionSignature.create( - undefined, - [ - arkts.factory.createParameterDeclaration( - arkts.factory.createIdentifier( - 'x', - arkts.factory.createPrimitiveType( - arkts.Es2pandaPrimitiveType.PRIMITIVE_TYPE_INT - ) - ), - undefined - ), - arkts.factory.createParameterDeclaration( - arkts.factory.createIdentifier( - 'y', - arkts.factory.createTypeReferenceFromId( - arkts.factory.createIdentifier( - 'string' - ) - ) - ), - arkts.factory.createStringLiteral( - 'bbb' - ) - ) - ], - undefined - ), + arkts.Es2pandaScriptFunctionFlags.SCRIPT_FUNCTION_FLAGS_NONE, arkts.Es2pandaModifierFlags.MODIFIER_FLAGS_PUBLIC | arkts.Es2pandaModifierFlags.MODIFIER_FLAGS_STATIC, false, arkts.factory.createIdentifier( 'foo' - ) + ), + [ + arkts.factory.createParameterDeclaration( + arkts.factory.createIdentifier( + 'x', + arkts.factory.createPrimitiveType( + arkts.Es2pandaPrimitiveType.PRIMITIVE_TYPE_INT + ) + ), + undefined + ), + arkts.factory.createParameterDeclaration( + arkts.factory.createIdentifier( + 'y', + arkts.factory.createTypeReferenceFromId( + arkts.factory.createIdentifier( + 'string' + ) + ) + ), + arkts.factory.createStringLiteral( + 'bbb' + ) + ) + ], + undefined, + undefined ), false ), diff --git a/arkoala-arkts/libarkts/test/arkts-api/import-export/import.test.ts b/arkoala-arkts/libarkts/test/arkts-api/import-export/import.test.ts index d7d254f9c..fe8649ed6 100644 --- a/arkoala-arkts/libarkts/test/arkts-api/import-export/import.test.ts +++ b/arkoala-arkts/libarkts/test/arkts-api/import-export/import.test.ts @@ -167,15 +167,13 @@ suite(util.basename(__filename), () => { ) ] ), - arkts.FunctionSignature.create( - undefined, - [], - undefined - ), scriptFunction.scriptFunctionFlags, scriptFunction.modifiers, false, - scriptFunction.ident + scriptFunction.ident, + [], + undefined, + undefined ), false ) -- Gitee