diff --git a/arkoala-arkts/arkui/src/sts/arkui.sts b/arkoala-arkts/arkui/src/sts/arkui.sts index 2998691be7d9b53aec26e3b82cc1ee6327ae00af..58a5b1b1a086011f649f6d5a61032d2240641850 100644 --- a/arkoala-arkts/arkui/src/sts/arkui.sts +++ b/arkoala-arkts/arkui/src/sts/arkui.sts @@ -29,9 +29,15 @@ export abstract class StructBase { console.log("Struct instantiate redirected") const instance = factory() if (builder !== undefined) builder(instance) - instance.build() + instance._build(builder, content, options) + } + build() { + throw new Error("The struct build() should never be executed directly") + } + + protected _build(style: ((instance: T)=>T)|undefined, content: (() => void)|undefined, options: OptionsT|undefined) { + throw new Error("The struct _build() must have a valid override") } - build() {} } export enum Color { @@ -141,7 +147,7 @@ export class Text extends CommonMethod { style(instance) //content() } - + fontColor(value: Color): this { console.log("\.fontColor(", Color[value], ")") return this diff --git a/arkoala-arkts/libarkts/plugins/src/struct-transformer.ts b/arkoala-arkts/libarkts/plugins/src/struct-transformer.ts index 0959ea80a44b256a68cdef96a11ab7867c6ced2b..1243e1c914829e87f3edf093cbf01365e32d411f 100644 --- a/arkoala-arkts/libarkts/plugins/src/struct-transformer.ts +++ b/arkoala-arkts/libarkts/plugins/src/struct-transformer.ts @@ -13,7 +13,7 @@ function isCustomComponentClass(node: arkts.ClassDeclaration): boolean { function isKnownMethodDefinition(method: arkts.MethodDefinition, name: string): boolean { if (!method || !arkts.isMethodDefinition(method)) return false; - // For now, we only considered matched method name. + // For now, we only considered matched method name. const isNameMatched: boolean = method.name?.name === name; return isNameMatched; } @@ -64,9 +64,14 @@ function createContentArgInBuildMethod(): arkts.ETSParameterExpression { arkts.Es2pandaScriptFunctionFlags.SCRIPT_FUNCTION_FLAGS_ARROW ); + const optionalContentLambda: arkts.ETSUnionType = arkts.factory.createUnionType([ + contentLambda, + arkts.factory.createUndefinedLiteral() + ]); + const contentParam: arkts.Identifier = arkts.factory.createIdentifier( 'content', - contentLambda + optionalContentLambda ); const param = arkts.factory.createParameterDeclaration(contentParam, undefined); @@ -82,7 +87,7 @@ function createInitializerArgInBuildMethod(className: string): arkts.ETSParamete arkts.factory.createTypeReferenceFromId( arkts.factory.createIdentifier(`__Options_${className}`) ) - ).setOptional(true), + ).setOptional(true), undefined ); } @@ -108,8 +113,8 @@ function transformBuildMethod( const params: arkts.ETSParameterExpression[] = prepareArgsInBuildMethod(className); const signature: arkts.FunctionSignature = arkts.FunctionSignature.create( - undefined, - params, + undefined, + params, undefined ); const updateScriptFunction = arkts.factory.createScriptFunction( @@ -146,7 +151,7 @@ function tranformClassMembers(node: arkts.ClassDeclaration): arkts.ClassDeclarat arkts.Es2pandaModifierFlags.MODIFIER_FLAGS_CONSTRUCTOR, false ); - } + } if (arkts.isMethodDefinition(member) && isKnownMethodDefinition(member, "build")) { return transformBuildMethod(member, className); }