diff --git a/arkoala-arkts/arkui/src/sts/arkui.sts b/arkoala-arkts/arkui/src/sts/arkui.sts index 58a5b1b1a086011f649f6d5a61032d2240641850..8a0ade1b50ab69685bcfa90020e1ecfe2e76fb7e 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 ab1fc833e15da862ebd1b65b6494c80751940253..0a11eb781c98ea7f6d2b11fda71f33f5fe1781c2 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 1243e1c914829e87f3edf093cbf01365e32d411f..826e0b1938e42a065889ecc93b6e93ef45dd6e64 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 d1136c3febe546b4edfe3ea6312772f1c8d23aa2..ce18131e8f162eed716acf86324d225b60fe8bce 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) @@ -508,20 +509,21 @@ 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, + returnTypeAnnotation: AstNode|undefined ): ScriptFunction { const peer = global.generatedEs2panda._CreateScriptFunction( global.context, passNode(body), - signature?.peer ?? FunctionSignature.create( - undefined, + 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 e52994391dc6c40dde2e7f263d681d75084bff71..2b000c8e0c5b45370f6e1c5fd2cf8ed6b24a6191 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, + node.scriptFunction.returnTypeAnnotation ) ), node.modifiers, @@ -195,12 +192,13 @@ 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), + nodeVisitor(node.returnTypeAnnotation, visitor) ) } if (node instanceof EtsImportDeclaration) { 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 10a452f91175de7732c51425e562f6f4fe7dc736..928e92ccc638c291d4d0fb40c8d667aa93078170 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 d7d254f9c08bb700b8d7b43b05e65e62cce0f878..fe8649ed6a1b6fe03d4378070d519e9e52bc1261 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 ) diff --git a/arkoala-arkts/memo-plugin/src/function-transformer.ts b/arkoala-arkts/memo-plugin/src/function-transformer.ts index b42df68bd2c52440cad22cbf299fd0629e380c63..1aed94b3752008223c06ac58c5e176a0ce497cf9 100644 --- a/arkoala-arkts/memo-plugin/src/function-transformer.ts +++ b/arkoala-arkts/memo-plugin/src/function-transformer.ts @@ -124,18 +124,19 @@ 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( 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.scriptFunction.returnTypeAnnotation ), ), node.modifiers,