From ea8e701037a4117ff6dfa6e179fd05f3c181b9b2 Mon Sep 17 00:00:00 2001 From: VictorS67 Date: Tue, 1 Jul 2025 22:25:46 +0800 Subject: [PATCH] modify component set option methods in attribute interface Signed-off-by: VictorS67 Change-Id: Id01bf58156a75320e9fe2cf1a74fa37f69684751 --- .../collectors/utils/collect-types.ts | 264 +++++++++++++ arkui-plugins/common/safe-types.ts | 6 +- .../animation/animatable-extend-basic.test.ts | 18 +- .../animation/animation-basic.test.ts | 18 +- .../else-if-in-content.test.ts | 103 ++++- .../if-break-in-nested-content.test.ts | 122 +++++- .../if-else-in-content.test.ts | 160 +++++++- .../if-in-switch-in-content.test.ts | 103 ++++- .../switch-case-in-content.test.ts | 160 +++++++- .../switch-in-if-in-content.test.ts | 46 ++- .../condition-scope/with-builder.test.ts | 160 +++++++- .../custom-component-call.test.ts | 27 +- .../builder-lambda/simple-component.test.ts | 23 +- .../style-with-receiver.test.ts | 22 +- .../ut/ui-plugins/component/for-each.test.ts | 33 +- .../builder-param-passing.test.ts | 69 +++- .../optional-builder-param.test.ts | 88 ++++- .../decorators/builder/global-builder.test.ts | 27 +- .../decorators/builder/local-builder.test.ts | 21 +- .../computed/computed-in-struct.test.ts | 62 ++- .../custom-dialog/base-custom-dialog.test.ts | 40 +- .../builder-dialog-options.test.ts | 14 +- .../custom-dialog/controller-in-build.test.ts | 33 +- .../extends-dialog-controller.test.ts | 24 +- .../decorators/event/event-initialize.test.ts | 24 +- .../link/link-to-link-prop-state.test.ts | 30 +- .../decorators/link/state-to-link.test.ts | 78 ++-- .../monitor-in-observedv2-class.test.ts | 43 +- .../monitor/monitor-in-struct.test.ts | 19 +- .../objectlink/objectlink-observed.test.ts | 40 +- .../decorators/once/once-with-require.test.ts | 50 ++- .../param/param-with-require.test.ts | 48 ++- .../prop-ref/state-to-propref.test.ts | 59 ++- .../decorators/prop/state-to-prop.test.ts | 59 ++- .../provide-to-consume.test.ts | 38 +- .../provider-to-consumer.test.ts | 68 ++-- .../resource/resource-in-build.test.ts | 97 +++-- .../resource/resource-in-property.test.ts | 26 +- .../reusable/reusable-complex.test.ts | 37 +- .../decorators/state/state-to-state.test.ts | 16 +- .../storagelink-appstorage.test.ts | 24 +- .../storageprop-appstorage.test.ts | 27 +- .../decorators/watch/watch-basic.test.ts | 9 +- .../double-dollar-griditem.test.ts | 52 ++- .../double-dollar-toggle.test.ts | 78 ++-- .../ui-plugins/imports/import-struct.test.ts | 9 +- .../ut/ui-plugins/imports/kit-import.test.ts | 25 +- .../wrap-builder/builder-in-generic.test.ts | 40 +- .../wrap-builder/init-with-builder.test.ts | 40 +- .../wrap-builder-in-generic.test.ts | 64 +-- .../wrap-builder/wrap-builder-in-ui.test.ts | 55 ++- .../wrap-builder-with-lambda.test.ts | 93 ++++- .../builder-lambda-translators/factory.ts | 370 +++++++++++++++--- .../style-internals-visitor.ts | 51 +++ .../builder-lambda-translators/utils.ts | 174 +++++++- .../ui-plugins/checked-transformer.ts | 12 +- .../ui-plugins/struct-translators/factory.ts | 29 +- .../ui-plugins/type-translators/factory.ts | 216 ++++++++++ arkui-plugins/ui-plugins/ui-factory.ts | 15 +- arkui-plugins/ui-plugins/utils.ts | 2 + .../src/arkts-api/factory/nodeFactory.ts | 32 ++ koala-wrapper/src/arkts-api/index.ts | 1 + .../arkts-api/node-utilities/ETSNullType.ts | 26 ++ .../arkts-api/node-utilities/TSArrayType.ts | 32 ++ .../node-utilities/TSQualifiedName.ts | 31 ++ .../arkts-api/node-utilities/TSThisType.ts | 26 ++ koala-wrapper/src/arkts-api/types.ts | 2 +- 67 files changed, 3291 insertions(+), 619 deletions(-) create mode 100644 arkui-plugins/collectors/utils/collect-types.ts create mode 100644 arkui-plugins/ui-plugins/builder-lambda-translators/style-internals-visitor.ts create mode 100644 arkui-plugins/ui-plugins/type-translators/factory.ts create mode 100644 koala-wrapper/src/arkts-api/node-utilities/ETSNullType.ts create mode 100644 koala-wrapper/src/arkts-api/node-utilities/TSArrayType.ts create mode 100644 koala-wrapper/src/arkts-api/node-utilities/TSQualifiedName.ts create mode 100644 koala-wrapper/src/arkts-api/node-utilities/TSThisType.ts diff --git a/arkui-plugins/collectors/utils/collect-types.ts b/arkui-plugins/collectors/utils/collect-types.ts new file mode 100644 index 000000000..50240f9a3 --- /dev/null +++ b/arkui-plugins/collectors/utils/collect-types.ts @@ -0,0 +1,264 @@ +/* + * Copyright (c) 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 { coerceToAstNode } from '../../common/arkts-utils'; + +export enum TypeRecordTypes { + PRIMITIVE, + FUNCTION, + UNION, + UNDEFINED, + NULL, + TYPE_REFERENCE, + TYPE_PARAMETER, + THIS, + ARRAY, +} + +export interface ThisTypeRecord { + type: TypeRecordTypes.THIS; +} + +export interface ArrayTypeRecord { + type: TypeRecordTypes.ARRAY; + elementType?: TypeRecord; +} + +export interface UndefinedTypeRecord { + type: TypeRecordTypes.UNDEFINED; +} + +export interface NullTypeRecord { + type: TypeRecordTypes.NULL; +} + +export interface TypeReferenceTypeRecord { + type: TypeRecordTypes.TYPE_REFERENCE; + typeName: string | string[]; + annotations: readonly arkts.AnnotationUsage[]; + typeParams?: TypeRecord[]; +} + +export interface PrimitiveTypeRecord { + type: TypeRecordTypes.PRIMITIVE; + typeName: string; +} + +export interface FunctionTypeRecord { + type: TypeRecordTypes.FUNCTION; + params: ParameterRecord[]; + returnType: TypeRecord; + annotations: readonly arkts.AnnotationUsage[]; + typeParams?: TypeParameterTypeRecord[]; +} + +export interface UnionTypeRecord { + type: TypeRecordTypes.UNION; + types: TypeRecord[]; +} + +export interface TypeParameterTypeRecord { + type: TypeRecordTypes.TYPE_PARAMETER; + annotations: readonly arkts.AnnotationUsage[]; + typeName?: string; + constraint?: TypeRecord; + defaultType?: TypeRecord; +} + +export type TypeRecord = + | ArrayTypeRecord + | ThisTypeRecord + | UndefinedTypeRecord + | NullTypeRecord + | TypeReferenceTypeRecord + | PrimitiveTypeRecord + | FunctionTypeRecord + | UnionTypeRecord; + +export interface ParameterRecord { + name: string; + typeRecord: TypeRecord; + annotations: readonly arkts.AnnotationUsage[]; + isOptional: boolean; +} + +export function collectTypeRecordFromTypeParameterInstatiation( + typeParams: arkts.TSTypeParameterInstantiation | undefined +): TypeRecord[] | undefined { + if (!typeParams) { + return undefined; + } + return typeParams.params.map((p) => collectTypeRecordFromType(p)!); +} + +export function collectTypeRecordFromTypeParameterDeclaration( + typeParams: arkts.TSTypeParameterDeclaration | undefined +): TypeParameterTypeRecord[] | undefined { + if (!typeParams) { + return undefined; + } + return typeParams.params.map((p) => collectTypeRecordFromTypeParameter(p)); +} + +export function collectTypeRecordFromTypeParameter( + typeParameter: T +): TypeParameterTypeRecord { + const _typeParameter = coerceToAstNode(typeParameter); + const type = TypeRecordTypes.TYPE_PARAMETER; + const typeName = _typeParameter.name?.name; + const annotations = _typeParameter.annotations; + const constraint = collectTypeRecordFromType(_typeParameter.constraint); + const defaultType = collectTypeRecordFromType(_typeParameter.defaultType); + return { type, typeName, annotations, constraint, defaultType }; +} + +export function collectTypeRecordFromUnionType( + unionType: T +): UnionTypeRecord { + const _unionType = coerceToAstNode(unionType); + const type = TypeRecordTypes.UNION; + const types = _unionType.types.map((t) => collectTypeRecordFromType(t)!); + return { type, types }; +} + +export function collectTypeRecordFromFunctionType( + funcType: T +): FunctionTypeRecord { + const _funcType = coerceToAstNode(funcType); + const type = TypeRecordTypes.FUNCTION; + const params = _funcType.params.map((p) => collectTypeRecordFromParameter(p as arkts.ETSParameterExpression)); + const returnType = collectTypeRecordFromType(_funcType.returnType)!; + const annotations = _funcType.annotations; + const typeParams = collectTypeRecordFromTypeParameterDeclaration(_funcType.typeParams); + return { type, params, returnType, annotations, typeParams }; +} + +export function collectTypeRecordFromParameter( + param: T +): ParameterRecord { + const _param = coerceToAstNode(param); + const name = _param.identifier.name; + const typeRecord = collectTypeRecordFromType(_param.type)!; + const annotations = _param.annotations; + const isOptional = _param.optional; + return { name, typeRecord, annotations, isOptional }; +} + +function coerceTypeNameToArray(name: string | string[] | undefined): string[] { + if (Array.isArray(name)) { + return name; + } + if (!!name) { + return [name]; + } + return []; +} + +function getTypeNameFromTypeReferencePartName(name: arkts.Expression | undefined): string | string[] | undefined { + if (!name) { + return undefined; + } + if (arkts.isIdentifier(name)) { + return name.name; + } + if (arkts.isTSQualifiedName(name)) { + const leftName: string | string[] | undefined = getTypeNameFromTypeReferencePartName(name.left); + const rightName: string | string[] | undefined = getTypeNameFromTypeReferencePartName(name.right); + const nameArr: string[] = [...coerceTypeNameToArray(leftName), ...coerceTypeNameToArray(rightName)]; + if (nameArr.length === 0) { + return undefined; + } + return nameArr; + } + return undefined; +} + +export function collectTypeRecordFromTypeReference( + node: T +): TypeReferenceTypeRecord | undefined { + const _node = coerceToAstNode(node); + if (!_node.part || !arkts.isETSTypeReferencePart(_node.part)) { + return undefined; + } + if (!_node.part.name) { + return undefined; + } + const typeName = getTypeNameFromTypeReferencePartName(_node.part.name); + if (!typeName) { + return undefined; + } + const type = TypeRecordTypes.TYPE_REFERENCE; + const annotations = _node.annotations; + const typeParams = collectTypeRecordFromTypeParameterInstatiation(_node.part.typeParams); + return { type, typeName, annotations, typeParams }; +} + +export function collectTypeRecordFromUndefinedType( + node: T +): UndefinedTypeRecord { + const type = TypeRecordTypes.UNDEFINED; + return { type }; +} + +export function collectTypeRecordFromNullType(node: T): NullTypeRecord { + const type = TypeRecordTypes.NULL; + return { type }; +} + +export function collectTypeRecordFromThisType(node: T): ThisTypeRecord { + const type = TypeRecordTypes.THIS; + return { type }; +} + +export function collectTypeRecordFromArrayType(node: T): ArrayTypeRecord { + const _node = coerceToAstNode(node); + const type = TypeRecordTypes.ARRAY; + const elementType = collectTypeRecordFromType(_node.elementType); + return { type, elementType }; +} + +export function collectTypeRecordFromPrimitiveType( + node: T +): PrimitiveTypeRecord { + const _node = coerceToAstNode(node); + const type = TypeRecordTypes.PRIMITIVE; + const typeName: string = _node.dumpSrc(); + return { type, typeName }; +} + +export function collectTypeRecordFromType(node: arkts.AstNode | undefined): TypeRecord | undefined { + if (!node) { + return undefined; + } + const type = arkts.nodeType(node); + if (collectTypeRecordByType.has(type)) { + return collectTypeRecordByType.get(type)!(node); + } + return undefined; +} + +type TypeRecordCollectFunction = (node: T) => TypeRecord | undefined; + +const collectTypeRecordByType = new Map([ + [arkts.Es2pandaAstNodeType.AST_NODE_TYPE_ETS_TYPE_REFERENCE, collectTypeRecordFromTypeReference], + [arkts.Es2pandaAstNodeType.AST_NODE_TYPE_ETS_FUNCTION_TYPE, collectTypeRecordFromFunctionType], + [arkts.Es2pandaAstNodeType.AST_NODE_TYPE_ETS_UNDEFINED_TYPE, collectTypeRecordFromUndefinedType], + [arkts.Es2pandaAstNodeType.AST_NODE_TYPE_ETS_PRIMITIVE_TYPE, collectTypeRecordFromPrimitiveType], + [arkts.Es2pandaAstNodeType.AST_NODE_TYPE_ETS_NULL_TYPE, collectTypeRecordFromNullType], + [arkts.Es2pandaAstNodeType.AST_NODE_TYPE_ETS_UNION_TYPE, collectTypeRecordFromUnionType], + [arkts.Es2pandaAstNodeType.AST_NODE_TYPE_TS_THIS_TYPE, collectTypeRecordFromThisType], + [arkts.Es2pandaAstNodeType.AST_NODE_TYPE_TS_ARRAY_TYPE, collectTypeRecordFromArrayType], +]); diff --git a/arkui-plugins/common/safe-types.ts b/arkui-plugins/common/safe-types.ts index 87345cf19..09ccd9092 100644 --- a/arkui-plugins/common/safe-types.ts +++ b/arkui-plugins/common/safe-types.ts @@ -34,12 +34,12 @@ export type PartialNested = { type NestedKey = { [P in keyof T]: P extends K ? T[P] : T[P] extends object ? NestedKey : T[P]; - }; - +}; + export type PickNested = { [P in keyof T]: P extends K ? T[P] : T[P] extends object ? NestedKey : T[P]; }; export type PartialNestedExcept = PartialNested> & PickNested; -export type AstNodePointer = arkts.AstNode['peer']; \ No newline at end of file +export type AstNodePointer = arkts.AstNode['peer']; diff --git a/arkui-plugins/test/ut/ui-plugins/animation/animatable-extend-basic.test.ts b/arkui-plugins/test/ut/ui-plugins/animation/animatable-extend-basic.test.ts index e1ab7ae03..178e8e2da 100644 --- a/arkui-plugins/test/ut/ui-plugins/animation/animatable-extend-basic.test.ts +++ b/arkui-plugins/test/ut/ui-plugins/animation/animatable-extend-basic.test.ts @@ -39,11 +39,16 @@ const animatableExtendTransform: Plugins = { const pluginTester = new PluginTester('test basic animatableExtend transform', buildConfig); const expectedScript: string = ` +import { ColumnAttribute as ColumnAttribute } from "arkui.component.column"; import { memo as memo } from "arkui.stateManagement.runtime"; import { TextAttribute as TextAttribute } from "arkui.component.text"; +import { TextImpl as TextImpl } from "arkui.component.text"; + +import { ColumnImpl as ColumnImpl } from "arkui.component.column"; + import { NavInterface as NavInterface } from "arkui.UserView"; import { PageLifeCycle as PageLifeCycle } from "arkui.component.customComponent"; @@ -73,9 +78,12 @@ __EntryWrapper.RegisterNamedRouter("", new __EntryWrapper(), ({ public __updateStruct(initializers: (__Options_AnimatablePropertyExample | undefined)): void {} @memo() public build() { - Column(undefined, undefined, @memo() (() => { - Text(@memo() ((instance: TextAttribute): void => { - instance.animationStart({ + ColumnImpl(@memo() ((instance: ColumnAttribute): void => { + instance.setColumnOptions(undefined).applyAttributesFinish(); + return; + }), @memo() (() => { + TextImpl(@memo() ((instance: TextAttribute): void => { + instance.setTextOptions("AnimatableProperty", undefined).animationStart({ duration: 2000, curve: Curve.Ease, }).backgroundColor(Color.Red).animationStop({ @@ -87,9 +95,9 @@ __EntryWrapper.RegisterNamedRouter("", new __EntryWrapper(), ({ }).fontSize(20).animationStop({ duration: 2000, curve: Curve.Ease, - }).width("100%"); + }).width("100%").applyAttributesFinish(); return; - }), "AnimatableProperty", undefined, undefined); + }), undefined); })); } diff --git a/arkui-plugins/test/ut/ui-plugins/animation/animation-basic.test.ts b/arkui-plugins/test/ut/ui-plugins/animation/animation-basic.test.ts index 9eeeb0fd7..e7fa71969 100644 --- a/arkui-plugins/test/ut/ui-plugins/animation/animation-basic.test.ts +++ b/arkui-plugins/test/ut/ui-plugins/animation/animation-basic.test.ts @@ -38,11 +38,16 @@ const animationTransform: Plugins = { const pluginTester = new PluginTester('test basic animation transform', buildConfig); const expectedScript: string = ` +import { ColumnAttribute as ColumnAttribute } from "arkui.component.column"; import { memo as memo } from "arkui.stateManagement.runtime"; import { TextAttribute as TextAttribute } from "arkui.component.text"; +import { TextImpl as TextImpl } from "arkui.component.text"; + +import { ColumnImpl as ColumnImpl } from "arkui.component.column"; + import { NavInterface as NavInterface } from "arkui.UserView"; import { PageLifeCycle as PageLifeCycle } from "arkui.component.customComponent"; @@ -72,9 +77,12 @@ __EntryWrapper.RegisterNamedRouter("", new __EntryWrapper(), ({ public __updateStruct(initializers: (__Options_AnimatablePropertyExample | undefined)): void {} @memo() public build() { - Column(undefined, undefined, @memo() (() => { - Text(@memo() ((instance: TextAttribute): void => { - instance.animationStart({ + ColumnImpl(@memo() ((instance: ColumnAttribute): void => { + instance.setColumnOptions(undefined).applyAttributesFinish(); + return; + }), @memo() (() => { + TextImpl(@memo() ((instance: TextAttribute): void => { + instance.setTextOptions("AnimatableProperty", undefined).animationStart({ duration: 2000, curve: Curve.Ease, }).backgroundColor(Color.Red).animationStop({ @@ -86,9 +94,9 @@ __EntryWrapper.RegisterNamedRouter("", new __EntryWrapper(), ({ }).fontSize(20).animationStop({ duration: 2000, curve: Curve.Ease, - }).width("100%"); + }).width("100%").applyAttributesFinish(); return; - }), "AnimatableProperty", undefined, undefined); + }), undefined); })); } diff --git a/arkui-plugins/test/ut/ui-plugins/builder-lambda/condition-scope/else-if-in-content.test.ts b/arkui-plugins/test/ut/ui-plugins/builder-lambda/condition-scope/else-if-in-content.test.ts index efab34496..793dafafe 100644 --- a/arkui-plugins/test/ut/ui-plugins/builder-lambda/condition-scope/else-if-in-content.test.ts +++ b/arkui-plugins/test/ut/ui-plugins/builder-lambda/condition-scope/else-if-in-content.test.ts @@ -39,9 +39,13 @@ const parsedTransform: Plugins = { }; const expectedUIScript: string = ` +import { ColumnAttribute as ColumnAttribute } from "arkui.component.column"; import { ConditionScope as ConditionScope } from \"arkui.component.builder\"; import { ConditionBranch as ConditionBranch } from \"arkui.component.builder\"; import { memo as memo } from \"arkui.stateManagement.runtime\"; +import { TextAttribute as TextAttribute } from "arkui.component.text"; +import { TextImpl as TextImpl } from "arkui.component.text"; +import { ColumnImpl as ColumnImpl } from "arkui.component.column"; import { CustomComponent as CustomComponent } from \"arkui.component.customComponent\"; import { Text as Text, Column as Column, Component as Component } from \"@ohos.arkui.component\"; function main() {} @@ -49,18 +53,27 @@ function main() {} public __initializeStruct(initializers: (__Options_ElseIf | undefined), @memo() content: ((()=> void) | undefined)): void {} public __updateStruct(initializers: (__Options_ElseIf | undefined)): void {} @memo() public build() { - Column(undefined, undefined, @memo() (() => { + ColumnImpl(@memo() ((instance: ColumnAttribute): void => { + instance.setColumnOptions(undefined).applyAttributesFinish(); + return; + }), @memo() (() => { ConditionScope(@memo() (() => { if (true) { ConditionBranch(@memo() (() => {})); } else { if (false) { ConditionBranch(@memo() (() => { - Text(undefined, \"elseIf 1\", undefined, undefined); + TextImpl(@memo() ((instance: TextAttribute): void => { + instance.setTextOptions("elseIf 1", undefined).applyAttributesFinish(); + return; + }), undefined); })); } else { ConditionBranch(@memo() (() => { - Text(undefined, \"else 1\", undefined, undefined); + TextImpl(@memo() ((instance: TextAttribute): void => { + instance.setTextOptions("else 1", undefined).applyAttributesFinish(); + return; + }), undefined); })); } } @@ -73,11 +86,17 @@ function main() {} ConditionScope(@memo() (() => { if (false) { ConditionBranch(@memo() (() => { - Text(undefined, \"elseIf 2\", undefined, undefined); + TextImpl(@memo() ((instance: TextAttribute): void => { + instance.setTextOptions("elseIf 2", undefined).applyAttributesFinish(); + return; + }), undefined); })); } else { ConditionBranch(@memo() (() => { - Text(undefined, \"else 2\", undefined, undefined); + TextImpl(@memo() ((instance: TextAttribute): void => { + instance.setTextOptions("else 2", undefined).applyAttributesFinish(); + return; + }), undefined); })); } })); @@ -98,9 +117,13 @@ function testUITransformer(this: PluginTestContext): void { const expectedMemoScript: string = ` import { __memo_context_type as __memo_context_type, __memo_id_type as __memo_id_type } from \"arkui.stateManagement.runtime\"; +import { ColumnAttribute as ColumnAttribute } from "arkui.component.column"; import { ConditionScope as ConditionScope } from \"arkui.component.builder\"; import { ConditionBranch as ConditionBranch } from \"arkui.component.builder\"; import { memo as memo } from \"arkui.stateManagement.runtime\"; +import { TextAttribute as TextAttribute } from "arkui.component.text"; +import { TextImpl as TextImpl } from "arkui.component.text"; +import { ColumnImpl as ColumnImpl } from "arkui.component.column"; import { CustomComponent as CustomComponent } from \"arkui.component.customComponent\"; import { Text as Text, Column as Column, Component as Component } from \"@ohos.arkui.component\"; function main() {} @@ -113,7 +136,19 @@ function main() {} __memo_scope.cached; return; } - Column(__memo_context, ((__memo_id) + ()), undefined, undefined, @memo() ((__memo_context: __memo_context_type, __memo_id: __memo_id_type) => { + ColumnImpl(__memo_context, ((__memo_id) + ()), @memo() ((__memo_context: __memo_context_type, __memo_id: __memo_id_type, instance: ColumnAttribute): void => { + const __memo_scope = __memo_context.scope(((__memo_id) + ()), 1); + const __memo_parameter_instance = __memo_scope.param(0, instance); + if (__memo_scope.unchanged) { + __memo_scope.cached; + return; + } + __memo_parameter_instance.value.setColumnOptions(undefined).applyAttributesFinish(); + { + __memo_scope.recache(); + return; + } + }), @memo() ((__memo_context: __memo_context_type, __memo_id: __memo_id_type) => { const __memo_scope = __memo_context.scope(((__memo_id) + ()), 0); if (__memo_scope.unchanged) { __memo_scope.cached; @@ -145,7 +180,19 @@ function main() {} __memo_scope.cached; return; } - Text(__memo_context, ((__memo_id) + ()), undefined, \"elseIf 1\", undefined, undefined); + TextImpl(__memo_context, ((__memo_id) + ()), @memo() ((__memo_context: __memo_context_type, __memo_id: __memo_id_type, instance: TextAttribute): void => { + const __memo_scope = __memo_context.scope(((__memo_id) + ()), 1); + const __memo_parameter_instance = __memo_scope.param(0, instance); + if (__memo_scope.unchanged) { + __memo_scope.cached; + return; + } + __memo_parameter_instance.value.setTextOptions("elseIf 1", undefined).applyAttributesFinish(); + { + __memo_scope.recache(); + return; + } + }), undefined); { __memo_scope.recache(); return; @@ -158,7 +205,19 @@ function main() {} __memo_scope.cached; return; } - Text(__memo_context, ((__memo_id) + ()), undefined, \"else 1\", undefined, undefined); + TextImpl(__memo_context, ((__memo_id) + ()), @memo() ((__memo_context: __memo_context_type, __memo_id: __memo_id_type, instance: TextAttribute): void => { + const __memo_scope = __memo_context.scope(((__memo_id) + ()), 1); + const __memo_parameter_instance = __memo_scope.param(0, instance); + if (__memo_scope.unchanged) { + __memo_scope.cached; + return; + } + __memo_parameter_instance.value.setTextOptions("else 1", undefined).applyAttributesFinish(); + { + __memo_scope.recache(); + return; + } + }), undefined); { __memo_scope.recache(); return; @@ -209,7 +268,19 @@ function main() {} __memo_scope.cached; return; } - Text(__memo_context, ((__memo_id) + ()), undefined, \"elseIf 2\", undefined, undefined); + TextImpl(__memo_context, ((__memo_id) + ()), @memo() ((__memo_context: __memo_context_type, __memo_id: __memo_id_type, instance: TextAttribute): void => { + const __memo_scope = __memo_context.scope(((__memo_id) + ()), 1); + const __memo_parameter_instance = __memo_scope.param(0, instance); + if (__memo_scope.unchanged) { + __memo_scope.cached; + return; + } + __memo_parameter_instance.value.setTextOptions("elseIf 2", undefined).applyAttributesFinish(); + { + __memo_scope.recache(); + return; + } + }), undefined); { __memo_scope.recache(); return; @@ -222,7 +293,19 @@ function main() {} __memo_scope.cached; return; } - Text(__memo_context, ((__memo_id) + ()), undefined, \"else 2\", undefined, undefined); + TextImpl(__memo_context, ((__memo_id) + ()), @memo() ((__memo_context: __memo_context_type, __memo_id: __memo_id_type, instance: TextAttribute): void => { + const __memo_scope = __memo_context.scope(((__memo_id) + ()), 1); + const __memo_parameter_instance = __memo_scope.param(0, instance); + if (__memo_scope.unchanged) { + __memo_scope.cached; + return; + } + __memo_parameter_instance.value.setTextOptions("else 2", undefined).applyAttributesFinish(); + { + __memo_scope.recache(); + return; + } + }), undefined); { __memo_scope.recache(); return; diff --git a/arkui-plugins/test/ut/ui-plugins/builder-lambda/condition-scope/if-break-in-nested-content.test.ts b/arkui-plugins/test/ut/ui-plugins/builder-lambda/condition-scope/if-break-in-nested-content.test.ts index bea4b4bbd..619ad4be9 100644 --- a/arkui-plugins/test/ut/ui-plugins/builder-lambda/condition-scope/if-break-in-nested-content.test.ts +++ b/arkui-plugins/test/ut/ui-plugins/builder-lambda/condition-scope/if-break-in-nested-content.test.ts @@ -38,9 +38,13 @@ const parsedTransform: Plugins = { }; const expectedUIScript: string = ` +import { ColumnAttribute as ColumnAttribute } from "arkui.component.column"; import { ConditionScope as ConditionScope } from \"arkui.component.builder\"; import { ConditionBranch as ConditionBranch } from \"arkui.component.builder\"; import { memo as memo } from \"arkui.stateManagement.runtime\"; +import { TextAttribute as TextAttribute } from "arkui.component.text"; +import { TextImpl as TextImpl } from "arkui.component.text"; +import { ColumnImpl as ColumnImpl } from "arkui.component.column"; import { CustomComponent as CustomComponent } from \"arkui.component.customComponent\"; import { Component as Component, Column as Column, Text as Text } from \"@ohos.arkui.component\"; import hilog from \"@ohos.hilog\"; @@ -49,17 +53,32 @@ function main() {} public __initializeStruct(initializers: (__Options_A | undefined), @memo() content: ((()=> void) | undefined)): void {} public __updateStruct(initializers: (__Options_A | undefined)): void {} @memo() public build() { - Column(undefined, undefined, @memo() (() => { - Column(undefined, undefined, @memo() (() => { - Column(undefined, undefined, @memo() (() => { - Column(undefined, undefined, @memo() (() => { + ColumnImpl(@memo() ((instance: ColumnAttribute): void => { + instance.setColumnOptions(undefined).applyAttributesFinish(); + return; + }), @memo() (() => { + ColumnImpl(@memo() ((instance: ColumnAttribute): void => { + instance.setColumnOptions(undefined).applyAttributesFinish(); + return; + }), @memo() (() => { + ColumnImpl(@memo() ((instance: ColumnAttribute): void => { + instance.setColumnOptions(undefined).applyAttributesFinish(); + return; + }), @memo() (() => { + ColumnImpl(@memo() ((instance: ColumnAttribute): void => { + instance.setColumnOptions(undefined).applyAttributesFinish(); + return; + }), @memo() (() => { ConditionScope(@memo() (() => { if (false) { ConditionBranch(@memo() (() => { hilog.info(0x0000, \"very inside\", \"1\"); })); return; - Text(undefined, \"1\", undefined, undefined); + TextImpl(@memo() ((instance: TextAttribute): void => { + instance.setTextOptions("1", undefined).applyAttributesFinish(); + return; + }), undefined); } })); })); @@ -69,7 +88,10 @@ function main() {} if (true) { ConditionBranch(@memo() (() => { hilog.info(0x0000, \"outside column\", \"2\"); - Text(undefined, \"1\", undefined, undefined); + TextImpl(@memo() ((instance: TextAttribute): void => { + instance.setTextOptions("1", undefined).applyAttributesFinish(); + return; + }), undefined); })); } })); @@ -87,9 +109,13 @@ function testUITransformer(this: PluginTestContext): void { const expectedMemoScript: string = ` import { __memo_context_type as __memo_context_type, __memo_id_type as __memo_id_type } from \"arkui.stateManagement.runtime\"; +import { ColumnAttribute as ColumnAttribute } from "arkui.component.column"; import { ConditionScope as ConditionScope } from \"arkui.component.builder\"; import { ConditionBranch as ConditionBranch } from \"arkui.component.builder\"; import { memo as memo } from \"arkui.stateManagement.runtime\"; +import { TextAttribute as TextAttribute } from "arkui.component.text"; +import { TextImpl as TextImpl } from "arkui.component.text"; +import { ColumnImpl as ColumnImpl } from "arkui.component.column"; import { CustomComponent as CustomComponent } from \"arkui.component.customComponent\"; import { Component as Component, Column as Column, Text as Text } from \"@ohos.arkui.component\"; import hilog from \"@ohos.hilog\"; @@ -103,25 +129,73 @@ function main() {} __memo_scope.cached; return; } - Column(__memo_context, ((__memo_id) + ()), undefined, undefined, @memo() ((__memo_context: __memo_context_type, __memo_id: __memo_id_type) => { + ColumnImpl(__memo_context, ((__memo_id) + ()), @memo() ((__memo_context: __memo_context_type, __memo_id: __memo_id_type, instance: ColumnAttribute): void => { + const __memo_scope = __memo_context.scope(((__memo_id) + ()), 1); + const __memo_parameter_instance = __memo_scope.param(0, instance); + if (__memo_scope.unchanged) { + __memo_scope.cached; + return; + } + __memo_parameter_instance.value.setColumnOptions(undefined).applyAttributesFinish(); + { + __memo_scope.recache(); + return; + } + }), @memo() ((__memo_context: __memo_context_type, __memo_id: __memo_id_type) => { const __memo_scope = __memo_context.scope(((__memo_id) + ()), 0); if (__memo_scope.unchanged) { __memo_scope.cached; return; } - Column(__memo_context, ((__memo_id) + ()), undefined, undefined, @memo() ((__memo_context: __memo_context_type, __memo_id: __memo_id_type) => { + ColumnImpl(__memo_context, ((__memo_id) + ()), @memo() ((__memo_context: __memo_context_type, __memo_id: __memo_id_type, instance: ColumnAttribute): void => { + const __memo_scope = __memo_context.scope(((__memo_id) + ()), 1); + const __memo_parameter_instance = __memo_scope.param(0, instance); + if (__memo_scope.unchanged) { + __memo_scope.cached; + return; + } + __memo_parameter_instance.value.setColumnOptions(undefined).applyAttributesFinish(); + { + __memo_scope.recache(); + return; + } + }), @memo() ((__memo_context: __memo_context_type, __memo_id: __memo_id_type) => { const __memo_scope = __memo_context.scope(((__memo_id) + ()), 0); if (__memo_scope.unchanged) { __memo_scope.cached; return; } - Column(__memo_context, ((__memo_id) + ()), undefined, undefined, @memo() ((__memo_context: __memo_context_type, __memo_id: __memo_id_type) => { + ColumnImpl(__memo_context, ((__memo_id) + ()), @memo() ((__memo_context: __memo_context_type, __memo_id: __memo_id_type, instance: ColumnAttribute): void => { + const __memo_scope = __memo_context.scope(((__memo_id) + ()), 1); + const __memo_parameter_instance = __memo_scope.param(0, instance); + if (__memo_scope.unchanged) { + __memo_scope.cached; + return; + } + __memo_parameter_instance.value.setColumnOptions(undefined).applyAttributesFinish(); + { + __memo_scope.recache(); + return; + } + }), @memo() ((__memo_context: __memo_context_type, __memo_id: __memo_id_type) => { const __memo_scope = __memo_context.scope(((__memo_id) + ()), 0); if (__memo_scope.unchanged) { __memo_scope.cached; return; } - Column(__memo_context, ((__memo_id) + ()), undefined, undefined, @memo() ((__memo_context: __memo_context_type, __memo_id: __memo_id_type) => { + ColumnImpl(__memo_context, ((__memo_id) + ()), @memo() ((__memo_context: __memo_context_type, __memo_id: __memo_id_type, instance: ColumnAttribute): void => { + const __memo_scope = __memo_context.scope(((__memo_id) + ()), 1); + const __memo_parameter_instance = __memo_scope.param(0, instance); + if (__memo_scope.unchanged) { + __memo_scope.cached; + return; + } + __memo_parameter_instance.value.setColumnOptions(undefined).applyAttributesFinish(); + { + __memo_scope.recache(); + return; + } + }), @memo() ((__memo_context: __memo_context_type, __memo_id: __memo_id_type) => { const __memo_scope = __memo_context.scope(((__memo_id) + ()), 0); if (__memo_scope.unchanged) { __memo_scope.cached; @@ -147,7 +221,19 @@ function main() {} } })); return; - Text(__memo_context, ((__memo_id) + ()), undefined, \"1\", undefined, undefined); + TextImpl(__memo_context, ((__memo_id) + ()), @memo() ((__memo_context: __memo_context_type, __memo_id: __memo_id_type, instance: TextAttribute): void => { + const __memo_scope = __memo_context.scope(((__memo_id) + ()), 1); + const __memo_parameter_instance = __memo_scope.param(0, instance); + if (__memo_scope.unchanged) { + __memo_scope.cached; + return; + } + __memo_parameter_instance.value.setTextOptions("1", undefined).applyAttributesFinish(); + { + __memo_scope.recache(); + return; + } + }), undefined); } { __memo_scope.recache(); @@ -183,7 +269,19 @@ function main() {} return; } hilog.info(0x0000, \"outside column\", \"2\"); - Text(__memo_context, ((__memo_id) + ()), undefined, \"1\", undefined, undefined); + TextImpl(__memo_context, ((__memo_id) + ()), @memo() ((__memo_context: __memo_context_type, __memo_id: __memo_id_type, instance: TextAttribute): void => { + const __memo_scope = __memo_context.scope(((__memo_id) + ()), 1); + const __memo_parameter_instance = __memo_scope.param(0, instance); + if (__memo_scope.unchanged) { + __memo_scope.cached; + return; + } + __memo_parameter_instance.value.setTextOptions("1", undefined).applyAttributesFinish(); + { + __memo_scope.recache(); + return; + } + }), undefined); { __memo_scope.recache(); return; diff --git a/arkui-plugins/test/ut/ui-plugins/builder-lambda/condition-scope/if-else-in-content.test.ts b/arkui-plugins/test/ut/ui-plugins/builder-lambda/condition-scope/if-else-in-content.test.ts index 876f9abd6..25eeeca1a 100644 --- a/arkui-plugins/test/ut/ui-plugins/builder-lambda/condition-scope/if-else-in-content.test.ts +++ b/arkui-plugins/test/ut/ui-plugins/builder-lambda/condition-scope/if-else-in-content.test.ts @@ -38,9 +38,13 @@ const parsedTransform: Plugins = { }; const expectedUIScript: string = ` +import { ColumnAttribute as ColumnAttribute } from "arkui.component.column"; import { ConditionScope as ConditionScope } from \"arkui.component.builder\"; import { ConditionBranch as ConditionBranch } from \"arkui.component.builder\"; import { memo as memo } from \"arkui.stateManagement.runtime\"; +import { TextAttribute as TextAttribute } from "arkui.component.text"; +import { TextImpl as TextImpl } from "arkui.component.text"; +import { ColumnImpl as ColumnImpl } from "arkui.component.column"; import { CustomComponent as CustomComponent } from \"arkui.component.customComponent\"; import { Text as Text, Column as Column, Component as Component } from \"@ohos.arkui.component\"; function main() {} @@ -48,23 +52,35 @@ function main() {} public __initializeStruct(initializers: (__Options_IfElse | undefined), @memo() content: ((()=> void) | undefined)): void {} public __updateStruct(initializers: (__Options_IfElse | undefined)): void {} @memo() public build() { - Column(undefined, undefined, @memo() (() => { + ColumnImpl(@memo() ((instance: ColumnAttribute): void => { + instance.setColumnOptions(undefined).applyAttributesFinish(); + return; + }), @memo() (() => { ConditionScope(@memo() (() => { if (true) { ConditionBranch(@memo() (() => { ConditionScope(@memo() (() => { if (false) { ConditionBranch(@memo() (() => { - Text(undefined, \"if-if\", undefined, undefined); + TextImpl(@memo() ((instance: TextAttribute): void => { + instance.setTextOptions("if-if", undefined).applyAttributesFinish(); + return; + }), undefined); })); } else { if (true) { ConditionBranch(@memo() (() => { - Text(undefined, \"if-elseIf\", undefined, undefined); + TextImpl(@memo() ((instance: TextAttribute): void => { + instance.setTextOptions("if-elseIf", undefined).applyAttributesFinish(); + return; + }), undefined); })); } else { ConditionBranch(@memo() (() => { - Text(undefined, \"if-else\", undefined, undefined); + TextImpl(@memo() ((instance: TextAttribute): void => { + instance.setTextOptions("if-else", undefined).applyAttributesFinish(); + return; + }), undefined); })); } } @@ -73,18 +89,30 @@ function main() {} } else { if (false) { ConditionBranch(@memo() (() => { - Text(undefined, \"elseIf\", undefined, undefined); + TextImpl(@memo() ((instance: TextAttribute): void => { + instance.setTextOptions("elseIf", undefined).applyAttributesFinish(); + return; + }), undefined); })); } else { ConditionBranch(@memo() (() => { - Text(undefined, \"else\", undefined, undefined); + TextImpl(@memo() ((instance: TextAttribute): void => { + instance.setTextOptions("else", undefined).applyAttributesFinish(); + return; + }), undefined); })); return; - Text(undefined, \"after-return\", undefined, undefined); + TextImpl(@memo() ((instance: TextAttribute): void => { + instance.setTextOptions("after-return", undefined).applyAttributesFinish(); + return; + }), undefined); } } })); - Text(undefined, \"hello world\", undefined, undefined); + TextImpl(@memo() ((instance: TextAttribute): void => { + instance.setTextOptions("hello world", undefined).applyAttributesFinish(); + return; + }), undefined); })); } private constructor() {} @@ -99,9 +127,13 @@ function testUITransformer(this: PluginTestContext): void { const expectedMemoScript: string = ` import { __memo_context_type as __memo_context_type, __memo_id_type as __memo_id_type } from \"arkui.stateManagement.runtime\"; +import { ColumnAttribute as ColumnAttribute } from "arkui.component.column"; import { ConditionScope as ConditionScope } from \"arkui.component.builder\"; import { ConditionBranch as ConditionBranch } from \"arkui.component.builder\"; import { memo as memo } from \"arkui.stateManagement.runtime\"; +import { TextAttribute as TextAttribute } from "arkui.component.text"; +import { TextImpl as TextImpl } from "arkui.component.text"; +import { ColumnImpl as ColumnImpl } from "arkui.component.column"; import { CustomComponent as CustomComponent } from \"arkui.component.customComponent\"; import { Text as Text, Column as Column, Component as Component } from \"@ohos.arkui.component\"; function main() {} @@ -114,7 +146,19 @@ function main() {} __memo_scope.cached; return; } - Column(__memo_context, ((__memo_id) + ()), undefined, undefined, @memo() ((__memo_context: __memo_context_type, __memo_id: __memo_id_type) => { + ColumnImpl(__memo_context, ((__memo_id) + ()), @memo() ((__memo_context: __memo_context_type, __memo_id: __memo_id_type, instance: ColumnAttribute): void => { + const __memo_scope = __memo_context.scope(((__memo_id) + ()), 1); + const __memo_parameter_instance = __memo_scope.param(0, instance); + if (__memo_scope.unchanged) { + __memo_scope.cached; + return; + } + __memo_parameter_instance.value.setColumnOptions(undefined).applyAttributesFinish(); + { + __memo_scope.recache(); + return; + } + }), @memo() ((__memo_context: __memo_context_type, __memo_id: __memo_id_type) => { const __memo_scope = __memo_context.scope(((__memo_id) + ()), 0); if (__memo_scope.unchanged) { __memo_scope.cached; @@ -146,7 +190,19 @@ function main() {} __memo_scope.cached; return; } - Text(__memo_context, ((__memo_id) + ()), undefined, \"if-if\", undefined, undefined); + TextImpl(__memo_context, ((__memo_id) + ()), @memo() ((__memo_context: __memo_context_type, __memo_id: __memo_id_type, instance: TextAttribute): void => { + const __memo_scope = __memo_context.scope(((__memo_id) + ()), 1); + const __memo_parameter_instance = __memo_scope.param(0, instance); + if (__memo_scope.unchanged) { + __memo_scope.cached; + return; + } + __memo_parameter_instance.value.setTextOptions("if-if", undefined).applyAttributesFinish(); + { + __memo_scope.recache(); + return; + } + }), undefined); { __memo_scope.recache(); return; @@ -160,7 +216,19 @@ function main() {} __memo_scope.cached; return; } - Text(__memo_context, ((__memo_id) + ()), undefined, \"if-elseIf\", undefined, undefined); + TextImpl(__memo_context, ((__memo_id) + ()), @memo() ((__memo_context: __memo_context_type, __memo_id: __memo_id_type, instance: TextAttribute): void => { + const __memo_scope = __memo_context.scope(((__memo_id) + ()), 1); + const __memo_parameter_instance = __memo_scope.param(0, instance); + if (__memo_scope.unchanged) { + __memo_scope.cached; + return; + } + __memo_parameter_instance.value.setTextOptions("if-elseIf", undefined).applyAttributesFinish(); + { + __memo_scope.recache(); + return; + } + }), undefined); { __memo_scope.recache(); return; @@ -173,7 +241,19 @@ function main() {} __memo_scope.cached; return; } - Text(__memo_context, ((__memo_id) + ()), undefined, \"if-else\", undefined, undefined); + TextImpl(__memo_context, ((__memo_id) + ()), @memo() ((__memo_context: __memo_context_type, __memo_id: __memo_id_type, instance: TextAttribute): void => { + const __memo_scope = __memo_context.scope(((__memo_id) + ()), 1); + const __memo_parameter_instance = __memo_scope.param(0, instance); + if (__memo_scope.unchanged) { + __memo_scope.cached; + return; + } + __memo_parameter_instance.value.setTextOptions("if-else", undefined).applyAttributesFinish(); + { + __memo_scope.recache(); + return; + } + }), undefined); { __memo_scope.recache(); return; @@ -199,7 +279,19 @@ function main() {} __memo_scope.cached; return; } - Text(__memo_context, ((__memo_id) + ()), undefined, \"elseIf\", undefined, undefined); + TextImpl(__memo_context, ((__memo_id) + ()), @memo() ((__memo_context: __memo_context_type, __memo_id: __memo_id_type, instance: TextAttribute): void => { + const __memo_scope = __memo_context.scope(((__memo_id) + ()), 1); + const __memo_parameter_instance = __memo_scope.param(0, instance); + if (__memo_scope.unchanged) { + __memo_scope.cached; + return; + } + __memo_parameter_instance.value.setTextOptions("elseIf", undefined).applyAttributesFinish(); + { + __memo_scope.recache(); + return; + } + }), undefined); { __memo_scope.recache(); return; @@ -212,14 +304,38 @@ function main() {} __memo_scope.cached; return; } - Text(__memo_context, ((__memo_id) + ()), undefined, \"else\", undefined, undefined); + TextImpl(__memo_context, ((__memo_id) + ()), @memo() ((__memo_context: __memo_context_type, __memo_id: __memo_id_type, instance: TextAttribute): void => { + const __memo_scope = __memo_context.scope(((__memo_id) + ()), 1); + const __memo_parameter_instance = __memo_scope.param(0, instance); + if (__memo_scope.unchanged) { + __memo_scope.cached; + return; + } + __memo_parameter_instance.value.setTextOptions("else", undefined).applyAttributesFinish(); + { + __memo_scope.recache(); + return; + } + }), undefined); { __memo_scope.recache(); return; } })); return; - Text(__memo_context, ((__memo_id) + ()), undefined, \"after-return\", undefined, undefined); + TextImpl(__memo_context, ((__memo_id) + ()), @memo() ((__memo_context: __memo_context_type, __memo_id: __memo_id_type, instance: TextAttribute): void => { + const __memo_scope = __memo_context.scope(((__memo_id) + ()), 1); + const __memo_parameter_instance = __memo_scope.param(0, instance); + if (__memo_scope.unchanged) { + __memo_scope.cached; + return; + } + __memo_parameter_instance.value.setTextOptions("after-return", undefined).applyAttributesFinish(); + { + __memo_scope.recache(); + return; + } + }), undefined); } } { @@ -227,7 +343,19 @@ function main() {} return; } })); - Text(__memo_context, ((__memo_id) + ()), undefined, \"hello world\", undefined, undefined); + TextImpl(__memo_context, ((__memo_id) + ()), @memo() ((__memo_context: __memo_context_type, __memo_id: __memo_id_type, instance: TextAttribute): void => { + const __memo_scope = __memo_context.scope(((__memo_id) + ()), 1); + const __memo_parameter_instance = __memo_scope.param(0, instance); + if (__memo_scope.unchanged) { + __memo_scope.cached; + return; + } + __memo_parameter_instance.value.setTextOptions("hello world", undefined).applyAttributesFinish(); + { + __memo_scope.recache(); + return; + } + }), undefined); { __memo_scope.recache(); return; diff --git a/arkui-plugins/test/ut/ui-plugins/builder-lambda/condition-scope/if-in-switch-in-content.test.ts b/arkui-plugins/test/ut/ui-plugins/builder-lambda/condition-scope/if-in-switch-in-content.test.ts index 60d388a47..e92b02254 100644 --- a/arkui-plugins/test/ut/ui-plugins/builder-lambda/condition-scope/if-in-switch-in-content.test.ts +++ b/arkui-plugins/test/ut/ui-plugins/builder-lambda/condition-scope/if-in-switch-in-content.test.ts @@ -39,9 +39,13 @@ const parsedTransform: Plugins = { }; const expectedUIScript: string = ` +import { ColumnAttribute as ColumnAttribute } from "arkui.component.column"; import { ConditionScope as ConditionScope } from \"arkui.component.builder\"; import { ConditionBranch as ConditionBranch } from \"arkui.component.builder\"; import { memo as memo } from \"arkui.stateManagement.runtime\"; +import { TextAttribute as TextAttribute } from "arkui.component.text"; +import { TextImpl as TextImpl } from "arkui.component.text"; +import { ColumnImpl as ColumnImpl } from "arkui.component.column"; import { CustomComponent as CustomComponent } from \"arkui.component.customComponent\"; import { Text as Text, Column as Column, Component as Component } from \"@ohos.arkui.component\"; function main() {} @@ -59,7 +63,10 @@ function main() {} this.__backing_num = value; } @memo() public build() { - Column(undefined, undefined, @memo() (() => { + ColumnImpl(@memo() ((instance: ColumnAttribute): void => { + instance.setColumnOptions(undefined).applyAttributesFinish(); + return; + }), @memo() (() => { ConditionScope(@memo() (() => { switch (this.num) { case \"-1\": { @@ -68,16 +75,25 @@ function main() {} ConditionScope(@memo() (() => { if (true) { ConditionBranch(@memo() (() => { - Text(undefined, \"case 1\", undefined, undefined); + TextImpl(@memo() ((instance: TextAttribute): void => { + instance.setTextOptions("case 1", undefined).applyAttributesFinish(); + return; + }), undefined); })); } else { if (false) { ConditionBranch(@memo() (() => { - Text(undefined, \"case 2\", undefined, undefined); + TextImpl(@memo() ((instance: TextAttribute): void => { + instance.setTextOptions("case 2", undefined).applyAttributesFinish(); + return; + }), undefined); })); } else { ConditionBranch(@memo() (() => { - Text(undefined, \"case 3\", undefined, undefined); + TextImpl(@memo() ((instance: TextAttribute): void => { + instance.setTextOptions("case 3", undefined).applyAttributesFinish(); + return; + }), undefined); })); } } @@ -90,7 +106,10 @@ function main() {} ConditionScope(@memo() (() => { if (true) { ConditionBranch(@memo() (() => { - Text(undefined, \"case 4\", undefined, undefined); + TextImpl(@memo() ((instance: TextAttribute): void => { + instance.setTextOptions("case 4", undefined).applyAttributesFinish(); + return; + }), undefined); })); } })); @@ -114,9 +133,13 @@ function testUITransformer(this: PluginTestContext): void { const expectedMemoScript: string = ` import { __memo_context_type as __memo_context_type, __memo_id_type as __memo_id_type } from \"arkui.stateManagement.runtime\"; +import { ColumnAttribute as ColumnAttribute } from "arkui.component.column"; import { ConditionScope as ConditionScope } from \"arkui.component.builder\"; import { ConditionBranch as ConditionBranch } from \"arkui.component.builder\"; import { memo as memo } from \"arkui.stateManagement.runtime\"; +import { TextAttribute as TextAttribute } from "arkui.component.text"; +import { TextImpl as TextImpl } from "arkui.component.text"; +import { ColumnImpl as ColumnImpl } from "arkui.component.column"; import { CustomComponent as CustomComponent } from \"arkui.component.customComponent\"; import { Text as Text, Column as Column, Component as Component } from \"@ohos.arkui.component\"; function main() {} @@ -139,7 +162,19 @@ function main() {} __memo_scope.cached; return; } - Column(__memo_context, ((__memo_id) + ()), undefined, undefined, @memo() ((__memo_context: __memo_context_type, __memo_id: __memo_id_type) => { + ColumnImpl(__memo_context, ((__memo_id) + ()), @memo() ((__memo_context: __memo_context_type, __memo_id: __memo_id_type, instance: ColumnAttribute): void => { + const __memo_scope = __memo_context.scope(((__memo_id) + ()), 1); + const __memo_parameter_instance = __memo_scope.param(0, instance); + if (__memo_scope.unchanged) { + __memo_scope.cached; + return; + } + __memo_parameter_instance.value.setColumnOptions(undefined).applyAttributesFinish(); + { + __memo_scope.recache(); + return; + } + }), @memo() ((__memo_context: __memo_context_type, __memo_id: __memo_id_type) => { const __memo_scope = __memo_context.scope(((__memo_id) + ()), 0); if (__memo_scope.unchanged) { __memo_scope.cached; @@ -173,7 +208,19 @@ function main() {} __memo_scope.cached; return; } - Text(__memo_context, ((__memo_id) + ()), undefined, \"case 1\", undefined, undefined); + TextImpl(__memo_context, ((__memo_id) + ()), @memo() ((__memo_context: __memo_context_type, __memo_id: __memo_id_type, instance: TextAttribute): void => { + const __memo_scope = __memo_context.scope(((__memo_id) + ()), 1); + const __memo_parameter_instance = __memo_scope.param(0, instance); + if (__memo_scope.unchanged) { + __memo_scope.cached; + return; + } + __memo_parameter_instance.value.setTextOptions("case 1", undefined).applyAttributesFinish(); + { + __memo_scope.recache(); + return; + } + }), undefined); { __memo_scope.recache(); return; @@ -187,7 +234,19 @@ function main() {} __memo_scope.cached; return; } - Text(__memo_context, ((__memo_id) + ()), undefined, \"case 2\", undefined, undefined); + TextImpl(__memo_context, ((__memo_id) + ()), @memo() ((__memo_context: __memo_context_type, __memo_id: __memo_id_type, instance: TextAttribute): void => { + const __memo_scope = __memo_context.scope(((__memo_id) + ()), 1); + const __memo_parameter_instance = __memo_scope.param(0, instance); + if (__memo_scope.unchanged) { + __memo_scope.cached; + return; + } + __memo_parameter_instance.value.setTextOptions("case 2", undefined).applyAttributesFinish(); + { + __memo_scope.recache(); + return; + } + }), undefined); { __memo_scope.recache(); return; @@ -200,7 +259,19 @@ function main() {} __memo_scope.cached; return; } - Text(__memo_context, ((__memo_id) + ()), undefined, \"case 3\", undefined, undefined); + TextImpl(__memo_context, ((__memo_id) + ()), @memo() ((__memo_context: __memo_context_type, __memo_id: __memo_id_type, instance: TextAttribute): void => { + const __memo_scope = __memo_context.scope(((__memo_id) + ()), 1); + const __memo_parameter_instance = __memo_scope.param(0, instance); + if (__memo_scope.unchanged) { + __memo_scope.cached; + return; + } + __memo_parameter_instance.value.setTextOptions("case 3", undefined).applyAttributesFinish(); + { + __memo_scope.recache(); + return; + } + }), undefined); { __memo_scope.recache(); return; @@ -240,7 +311,19 @@ function main() {} __memo_scope.cached; return; } - Text(__memo_context, ((__memo_id) + ()), undefined, \"case 4\", undefined, undefined); + TextImpl(__memo_context, ((__memo_id) + ()), @memo() ((__memo_context: __memo_context_type, __memo_id: __memo_id_type, instance: TextAttribute): void => { + const __memo_scope = __memo_context.scope(((__memo_id) + ()), 1); + const __memo_parameter_instance = __memo_scope.param(0, instance); + if (__memo_scope.unchanged) { + __memo_scope.cached; + return; + } + __memo_parameter_instance.value.setTextOptions("case 4", undefined).applyAttributesFinish(); + { + __memo_scope.recache(); + return; + } + }), undefined); { __memo_scope.recache(); return; diff --git a/arkui-plugins/test/ut/ui-plugins/builder-lambda/condition-scope/switch-case-in-content.test.ts b/arkui-plugins/test/ut/ui-plugins/builder-lambda/condition-scope/switch-case-in-content.test.ts index 3960f4795..d2b7f9ae7 100644 --- a/arkui-plugins/test/ut/ui-plugins/builder-lambda/condition-scope/switch-case-in-content.test.ts +++ b/arkui-plugins/test/ut/ui-plugins/builder-lambda/condition-scope/switch-case-in-content.test.ts @@ -38,9 +38,13 @@ const parsedTransform: Plugins = { }; const expectedUIScript: string = ` +import { ColumnAttribute as ColumnAttribute } from "arkui.component.column"; import { ConditionScope as ConditionScope } from \"arkui.component.builder\"; import { ConditionBranch as ConditionBranch } from \"arkui.component.builder\"; import { memo as memo } from \"arkui.stateManagement.runtime\"; +import { TextAttribute as TextAttribute } from "arkui.component.text"; +import { TextImpl as TextImpl } from "arkui.component.text"; +import { ColumnImpl as ColumnImpl } from "arkui.component.column"; import { CustomComponent as CustomComponent } from \"arkui.component.customComponent\"; import { Text as Text, Column as Column, Component as Component } from \"@ohos.arkui.component\"; function main() {} @@ -58,36 +62,60 @@ function main() {} this.__backing_num = value; } @memo() public build() { - Column(undefined, undefined, @memo() (() => { + ColumnImpl(@memo() ((instance: ColumnAttribute): void => { + instance.setColumnOptions(undefined).applyAttributesFinish(); + return; + }), @memo() (() => { ConditionScope(@memo() (() => { switch (this.num) { case \"0\": { ConditionBranch(@memo() (() => { - Text(undefined, \"case 0\", undefined, undefined); + TextImpl(@memo() ((instance: TextAttribute): void => { + instance.setTextOptions("case 0", undefined).applyAttributesFinish(); + return; + }), undefined); })); } case \"1\": { ConditionBranch(@memo() (() => { - Text(undefined, \"case 1\", undefined, undefined); + TextImpl(@memo() ((instance: TextAttribute): void => { + instance.setTextOptions("case 1", undefined).applyAttributesFinish(); + return; + }), undefined); })); break; - Text(undefined, \"after break\", undefined, undefined); + TextImpl(@memo() ((instance: TextAttribute): void => { + instance.setTextOptions("after break", undefined).applyAttributesFinish(); + return; + }), undefined); } case \"2\": { ConditionBranch(@memo() (() => { - Text(undefined, \"case 2\", undefined, undefined); + TextImpl(@memo() ((instance: TextAttribute): void => { + instance.setTextOptions("case 2", undefined).applyAttributesFinish(); + return; + }), undefined); })); return; - Text(undefined, \"after return\", undefined, undefined); + TextImpl(@memo() ((instance: TextAttribute): void => { + instance.setTextOptions("after return", undefined).applyAttributesFinish(); + return; + }), undefined); } default: { ConditionBranch(@memo() (() => { - Text(undefined, \"default\", undefined, undefined); + TextImpl(@memo() ((instance: TextAttribute): void => { + instance.setTextOptions("default", undefined).applyAttributesFinish(); + return; + }), undefined); })); } } })); - Text(undefined, \"hello world\", undefined, undefined); + TextImpl(@memo() ((instance: TextAttribute): void => { + instance.setTextOptions("hello world", undefined).applyAttributesFinish(); + return; + }), undefined); })); } private constructor() {} @@ -104,9 +132,13 @@ function testUITransformer(this: PluginTestContext): void { const expectedMemoScript: string = ` import { __memo_context_type as __memo_context_type, __memo_id_type as __memo_id_type } from \"arkui.stateManagement.runtime\"; +import { ColumnAttribute as ColumnAttribute } from "arkui.component.column"; import { ConditionScope as ConditionScope } from \"arkui.component.builder\"; import { ConditionBranch as ConditionBranch } from \"arkui.component.builder\"; import { memo as memo } from \"arkui.stateManagement.runtime\"; +import { TextAttribute as TextAttribute } from "arkui.component.text"; +import { TextImpl as TextImpl } from "arkui.component.text"; +import { ColumnImpl as ColumnImpl } from "arkui.component.column"; import { CustomComponent as CustomComponent } from \"arkui.component.customComponent\"; import { Text as Text, Column as Column, Component as Component } from \"@ohos.arkui.component\"; function main() {} @@ -129,7 +161,19 @@ function main() {} __memo_scope.cached; return; } - Column(__memo_context, ((__memo_id) + ()), undefined, undefined, @memo() ((__memo_context: __memo_context_type, __memo_id: __memo_id_type) => { + ColumnImpl(__memo_context, ((__memo_id) + ()), @memo() ((__memo_context: __memo_context_type, __memo_id: __memo_id_type, instance: ColumnAttribute): void => { + const __memo_scope = __memo_context.scope(((__memo_id) + ()), 1); + const __memo_parameter_instance = __memo_scope.param(0, instance); + if (__memo_scope.unchanged) { + __memo_scope.cached; + return; + } + __memo_parameter_instance.value.setColumnOptions(undefined).applyAttributesFinish(); + { + __memo_scope.recache(); + return; + } + }), @memo() ((__memo_context: __memo_context_type, __memo_id: __memo_id_type) => { const __memo_scope = __memo_context.scope(((__memo_id) + ()), 0); if (__memo_scope.unchanged) { __memo_scope.cached; @@ -149,7 +193,19 @@ function main() {} __memo_scope.cached; return; } - Text(__memo_context, ((__memo_id) + ()), undefined, \"case 0\", undefined, undefined); + TextImpl(__memo_context, ((__memo_id) + ()), @memo() ((__memo_context: __memo_context_type, __memo_id: __memo_id_type, instance: TextAttribute): void => { + const __memo_scope = __memo_context.scope(((__memo_id) + ()), 1); + const __memo_parameter_instance = __memo_scope.param(0, instance); + if (__memo_scope.unchanged) { + __memo_scope.cached; + return; + } + __memo_parameter_instance.value.setTextOptions("case 0", undefined).applyAttributesFinish(); + { + __memo_scope.recache(); + return; + } + }), undefined); { __memo_scope.recache(); return; @@ -163,14 +219,38 @@ function main() {} __memo_scope.cached; return; } - Text(__memo_context, ((__memo_id) + ()), undefined, \"case 1\", undefined, undefined); + TextImpl(__memo_context, ((__memo_id) + ()), @memo() ((__memo_context: __memo_context_type, __memo_id: __memo_id_type, instance: TextAttribute): void => { + const __memo_scope = __memo_context.scope(((__memo_id) + ()), 1); + const __memo_parameter_instance = __memo_scope.param(0, instance); + if (__memo_scope.unchanged) { + __memo_scope.cached; + return; + } + __memo_parameter_instance.value.setTextOptions("case 1", undefined).applyAttributesFinish(); + { + __memo_scope.recache(); + return; + } + }), undefined); { __memo_scope.recache(); return; } })); break; - Text(__memo_context, ((__memo_id) + ()), undefined, \"after break\", undefined, undefined); + TextImpl(__memo_context, ((__memo_id) + ()), @memo() ((__memo_context: __memo_context_type, __memo_id: __memo_id_type, instance: TextAttribute): void => { + const __memo_scope = __memo_context.scope(((__memo_id) + ()), 1); + const __memo_parameter_instance = __memo_scope.param(0, instance); + if (__memo_scope.unchanged) { + __memo_scope.cached; + return; + } + __memo_parameter_instance.value.setTextOptions("after break", undefined).applyAttributesFinish(); + { + __memo_scope.recache(); + return; + } + }), undefined); } case \"2\": { ConditionBranch(__memo_context, ((__memo_id) + ()), @memo() ((__memo_context: __memo_context_type, __memo_id: __memo_id_type) => { @@ -179,14 +259,38 @@ function main() {} __memo_scope.cached; return; } - Text(__memo_context, ((__memo_id) + ()), undefined, \"case 2\", undefined, undefined); + TextImpl(__memo_context, ((__memo_id) + ()), @memo() ((__memo_context: __memo_context_type, __memo_id: __memo_id_type, instance: TextAttribute): void => { + const __memo_scope = __memo_context.scope(((__memo_id) + ()), 1); + const __memo_parameter_instance = __memo_scope.param(0, instance); + if (__memo_scope.unchanged) { + __memo_scope.cached; + return; + } + __memo_parameter_instance.value.setTextOptions("case 2", undefined).applyAttributesFinish(); + { + __memo_scope.recache(); + return; + } + }), undefined); { __memo_scope.recache(); return; } })); return; - Text(__memo_context, ((__memo_id) + ()), undefined, \"after return\", undefined, undefined); + TextImpl(__memo_context, ((__memo_id) + ()), @memo() ((__memo_context: __memo_context_type, __memo_id: __memo_id_type, instance: TextAttribute): void => { + const __memo_scope = __memo_context.scope(((__memo_id) + ()), 1); + const __memo_parameter_instance = __memo_scope.param(0, instance); + if (__memo_scope.unchanged) { + __memo_scope.cached; + return; + } + __memo_parameter_instance.value.setTextOptions("after return", undefined).applyAttributesFinish(); + { + __memo_scope.recache(); + return; + } + }), undefined); } default: { ConditionBranch(__memo_context, ((__memo_id) + ()), @memo() ((__memo_context: __memo_context_type, __memo_id: __memo_id_type) => { @@ -195,7 +299,19 @@ function main() {} __memo_scope.cached; return; } - Text(__memo_context, ((__memo_id) + ()), undefined, \"default\", undefined, undefined); + TextImpl(__memo_context, ((__memo_id) + ()), @memo() ((__memo_context: __memo_context_type, __memo_id: __memo_id_type, instance: TextAttribute): void => { + const __memo_scope = __memo_context.scope(((__memo_id) + ()), 1); + const __memo_parameter_instance = __memo_scope.param(0, instance); + if (__memo_scope.unchanged) { + __memo_scope.cached; + return; + } + __memo_parameter_instance.value.setTextOptions("default", undefined).applyAttributesFinish(); + { + __memo_scope.recache(); + return; + } + }), undefined); { __memo_scope.recache(); return; @@ -208,7 +324,19 @@ function main() {} return; } })); - Text(__memo_context, ((__memo_id) + ()), undefined, \"hello world\", undefined, undefined); + TextImpl(__memo_context, ((__memo_id) + ()), @memo() ((__memo_context: __memo_context_type, __memo_id: __memo_id_type, instance: TextAttribute): void => { + const __memo_scope = __memo_context.scope(((__memo_id) + ()), 1); + const __memo_parameter_instance = __memo_scope.param(0, instance); + if (__memo_scope.unchanged) { + __memo_scope.cached; + return; + } + __memo_parameter_instance.value.setTextOptions("hello world", undefined).applyAttributesFinish(); + { + __memo_scope.recache(); + return; + } + }), undefined); { __memo_scope.recache(); return; diff --git a/arkui-plugins/test/ut/ui-plugins/builder-lambda/condition-scope/switch-in-if-in-content.test.ts b/arkui-plugins/test/ut/ui-plugins/builder-lambda/condition-scope/switch-in-if-in-content.test.ts index 889cc905f..aa0c59584 100644 --- a/arkui-plugins/test/ut/ui-plugins/builder-lambda/condition-scope/switch-in-if-in-content.test.ts +++ b/arkui-plugins/test/ut/ui-plugins/builder-lambda/condition-scope/switch-in-if-in-content.test.ts @@ -38,9 +38,13 @@ const parsedTransform: Plugins = { }; const expectedUIScript: string = ` +import { ColumnAttribute as ColumnAttribute } from "arkui.component.column"; import { ConditionScope as ConditionScope } from \"arkui.component.builder\"; import { ConditionBranch as ConditionBranch } from \"arkui.component.builder\"; import { memo as memo } from \"arkui.stateManagement.runtime\"; +import { TextAttribute as TextAttribute } from "arkui.component.text"; +import { TextImpl as TextImpl } from "arkui.component.text"; +import { ColumnImpl as ColumnImpl } from "arkui.component.column"; import { CustomComponent as CustomComponent } from \"arkui.component.customComponent\"; import { Text as Text, Column as Column, Component as Component } from \"@ohos.arkui.component\"; function main() {} @@ -58,7 +62,10 @@ function main() {} this.__backing_num = value; } @memo() public build() { - Column(undefined, undefined, @memo() (() => { + ColumnImpl(@memo() ((instance: ColumnAttribute): void => { + instance.setColumnOptions(undefined).applyAttributesFinish(); + return; + }), @memo() (() => { ConditionScope(@memo() (() => { if (true) { ConditionBranch(@memo() (() => { @@ -66,7 +73,10 @@ function main() {} switch (this.num) { case \"0\": { ConditionBranch(@memo() (() => { - Text(undefined, \"case 0\", undefined, undefined); + TextImpl(@memo() ((instance: TextAttribute): void => { + instance.setTextOptions("case 0", undefined).applyAttributesFinish(); + return; + }), undefined); })); } } @@ -90,9 +100,13 @@ function testUITransformer(this: PluginTestContext): void { const expectedMemoScript: string = ` import { __memo_context_type as __memo_context_type, __memo_id_type as __memo_id_type } from \"arkui.stateManagement.runtime\"; +import { ColumnAttribute as ColumnAttribute } from "arkui.component.column"; import { ConditionScope as ConditionScope } from \"arkui.component.builder\"; import { ConditionBranch as ConditionBranch } from \"arkui.component.builder\"; import { memo as memo } from \"arkui.stateManagement.runtime\"; +import { TextAttribute as TextAttribute } from "arkui.component.text"; +import { TextImpl as TextImpl } from "arkui.component.text"; +import { ColumnImpl as ColumnImpl } from "arkui.component.column"; import { CustomComponent as CustomComponent } from \"arkui.component.customComponent\"; import { Text as Text, Column as Column, Component as Component } from \"@ohos.arkui.component\"; function main() {} @@ -115,7 +129,19 @@ function main() {} __memo_scope.cached; return; } - Column(__memo_context, ((__memo_id) + ()), undefined, undefined, @memo() ((__memo_context: __memo_context_type, __memo_id: __memo_id_type) => { + ColumnImpl(__memo_context, ((__memo_id) + ()), @memo() ((__memo_context: __memo_context_type, __memo_id: __memo_id_type, instance: ColumnAttribute): void => { + const __memo_scope = __memo_context.scope(((__memo_id) + ()), 1); + const __memo_parameter_instance = __memo_scope.param(0, instance); + if (__memo_scope.unchanged) { + __memo_scope.cached; + return; + } + __memo_parameter_instance.value.setColumnOptions(undefined).applyAttributesFinish(); + { + __memo_scope.recache(); + return; + } + }), @memo() ((__memo_context: __memo_context_type, __memo_id: __memo_id_type) => { const __memo_scope = __memo_context.scope(((__memo_id) + ()), 0); if (__memo_scope.unchanged) { __memo_scope.cached; @@ -148,7 +174,19 @@ function main() {} __memo_scope.cached; return; } - Text(__memo_context, ((__memo_id) + ()), undefined, \"case 0\", undefined, undefined); + TextImpl(__memo_context, ((__memo_id) + ()), @memo() ((__memo_context: __memo_context_type, __memo_id: __memo_id_type, instance: TextAttribute): void => { + const __memo_scope = __memo_context.scope(((__memo_id) + ()), 1); + const __memo_parameter_instance = __memo_scope.param(0, instance); + if (__memo_scope.unchanged) { + __memo_scope.cached; + return; + } + __memo_parameter_instance.value.setTextOptions("case 0", undefined).applyAttributesFinish(); + { + __memo_scope.recache(); + return; + } + }), undefined); { __memo_scope.recache(); return; diff --git a/arkui-plugins/test/ut/ui-plugins/builder-lambda/condition-scope/with-builder.test.ts b/arkui-plugins/test/ut/ui-plugins/builder-lambda/condition-scope/with-builder.test.ts index 9118dc865..51326c372 100644 --- a/arkui-plugins/test/ut/ui-plugins/builder-lambda/condition-scope/with-builder.test.ts +++ b/arkui-plugins/test/ut/ui-plugins/builder-lambda/condition-scope/with-builder.test.ts @@ -38,9 +38,13 @@ const parsedTransform: Plugins = { }; const expectedUIScript: string = ` +import { ColumnAttribute as ColumnAttribute } from "arkui.component.column"; +import { ColumnImpl as ColumnImpl } from "arkui.component.column"; import { ConditionScope as ConditionScope } from \"arkui.component.builder\"; import { ConditionBranch as ConditionBranch } from \"arkui.component.builder\"; import { memo as memo } from \"arkui.stateManagement.runtime\"; +import { TextAttribute as TextAttribute } from "arkui.component.text"; +import { TextImpl as TextImpl } from "arkui.component.text"; import { CustomComponent as CustomComponent } from \"arkui.component.customComponent\"; import { Text as Text, Column as Column, Component as Component, Builder as Builder, BuilderParam as BuilderParam, WrappedBuilder as WrappedBuilder, wrapBuilder as wrapBuilder } from \"@ohos.arkui.component\"; const wBuilder = wrapBuilder(ParamBuilder); @@ -49,7 +53,10 @@ function main() {} ConditionScope(@memo() (() => { if (true) { ConditionBranch(@memo() (() => { - Text(undefined, \"within Builder function\", undefined, undefined); + TextImpl(@memo() ((instance: TextAttribute): void => { + instance.setTextOptions("within Builder function", undefined).applyAttributesFinish(); + return; + }), undefined); })); } })); @@ -59,7 +66,10 @@ function main() {} ConditionScope(@memo() (() => { if (true) { ConditionBranch(@memo() (() => { - Text(undefined, \"within Builder parameter\", undefined, undefined); + TextImpl(@memo() ((instance: TextAttribute): void => { + instance.setTextOptions("within Builder parameter", undefined).applyAttributesFinish(); + return; + }), undefined); })); } })); @@ -73,18 +83,27 @@ function main() {} ConditionScope(@memo() (() => { if (true) { ConditionBranch(@memo() (() => { - Text(undefined, \"within Builder method\", undefined, undefined); + TextImpl(@memo() ((instance: TextAttribute): void => { + instance.setTextOptions("within Builder method", undefined).applyAttributesFinish(); + return; + }), undefined); })); } })); } @memo() public build() { - Column(undefined, undefined, @memo() (() => { + ColumnImpl(@memo() ((instance: ColumnAttribute): void => { + instance.setColumnOptions(undefined).applyAttributesFinish(); + return; + }), @memo() (() => { wBuilder.builder(@Builder() (() => { ConditionScope(@memo() (() => { if (true) { ConditionBranch(@memo() (() => { - Text(undefined, \"with Builder lambda\", undefined, undefined); + TextImpl(@memo() ((instance: TextAttribute): void => { + instance.setTextOptions("with Builder lambda", undefined).applyAttributesFinish(); + return; + }), undefined); })); } })); @@ -96,7 +115,10 @@ function main() {} ConditionScope(@memo() (() => { if (true) { ConditionBranch(@memo() (() => { - Text(undefined, \"within Builder property\", undefined, undefined); + TextImpl(@memo() ((instance: TextAttribute): void => { + instance.setTextOptions("within Builder property", undefined).applyAttributesFinish(); + return; + }), undefined); })); } })); @@ -114,7 +136,10 @@ function main() {} ConditionScope(@memo() (() => { if (true) { ConditionBranch(@memo() (() => { - Text(undefined, \"within BuilderParam property\", undefined, undefined); + TextImpl(@memo() ((instance: TextAttribute): void => { + instance.setTextOptions("within BuilderParam property", undefined).applyAttributesFinish(); + return; + }), undefined); })); } })); @@ -132,7 +157,10 @@ function main() {} ConditionScope(@memo() (() => { if (true) { ConditionBranch(@memo() (() => { - Text(undefined, "within struct build", undefined, undefined); + TextImpl(@memo() ((instance: TextAttribute): void => { + instance.setTextOptions("within struct build", undefined).applyAttributesFinish(); + return; + }), undefined); })); } })); @@ -153,9 +181,13 @@ function testUITransformer(this: PluginTestContext): void { const expectedMemoScript: string = ` import { __memo_context_type as __memo_context_type, __memo_id_type as __memo_id_type } from \"arkui.stateManagement.runtime\"; +import { ColumnAttribute as ColumnAttribute } from "arkui.component.column"; +import { ColumnImpl as ColumnImpl } from "arkui.component.column"; import { ConditionScope as ConditionScope } from \"arkui.component.builder\"; import { ConditionBranch as ConditionBranch } from \"arkui.component.builder\"; import { memo as memo } from \"arkui.stateManagement.runtime\"; +import { TextAttribute as TextAttribute } from "arkui.component.text"; +import { TextImpl as TextImpl } from "arkui.component.text"; import { CustomComponent as CustomComponent } from \"arkui.component.customComponent\"; import { Text as Text, Column as Column, Component as Component, Builder as Builder, BuilderParam as BuilderParam, WrappedBuilder as WrappedBuilder, wrapBuilder as wrapBuilder } from \"@ohos.arkui.component\"; const wBuilder = wrapBuilder(ParamBuilder); @@ -179,7 +211,19 @@ function main() {} __memo_scope.cached; return; } - Text(__memo_context, ((__memo_id) + ()), undefined, \"within Builder function\", undefined, undefined); + TextImpl(__memo_context, ((__memo_id) + ()), @memo() ((__memo_context: __memo_context_type, __memo_id: __memo_id_type, instance: TextAttribute): void => { + const __memo_scope = __memo_context.scope(((__memo_id) + ()), 1); + const __memo_parameter_instance = __memo_scope.param(0, instance); + if (__memo_scope.unchanged) { + __memo_scope.cached; + return; + } + __memo_parameter_instance.value.setTextOptions("within Builder function", undefined).applyAttributesFinish(); + { + __memo_scope.recache(); + return; + } + }), undefined); { __memo_scope.recache(); return; @@ -216,7 +260,19 @@ function main() {} __memo_scope.cached; return; } - Text(__memo_context, ((__memo_id) + ()), undefined, \"within Builder parameter\", undefined, undefined); + TextImpl(__memo_context, ((__memo_id) + ()), @memo() ((__memo_context: __memo_context_type, __memo_id: __memo_id_type, instance: TextAttribute): void => { + const __memo_scope = __memo_context.scope(((__memo_id) + ()), 1); + const __memo_parameter_instance = __memo_scope.param(0, instance); + if (__memo_scope.unchanged) { + __memo_scope.cached; + return; + } + __memo_parameter_instance.value.setTextOptions("within Builder parameter", undefined).applyAttributesFinish(); + { + __memo_scope.recache(); + return; + } + }), undefined); { __memo_scope.recache(); return; @@ -267,7 +323,19 @@ function main() {} __memo_scope.cached; return; } - Text(__memo_context, ((__memo_id) + ()), undefined, \"within Builder method\", undefined, undefined); + TextImpl(__memo_context, ((__memo_id) + ()), @memo() ((__memo_context: __memo_context_type, __memo_id: __memo_id_type, instance: TextAttribute): void => { + const __memo_scope = __memo_context.scope(((__memo_id) + ()), 1); + const __memo_parameter_instance = __memo_scope.param(0, instance); + if (__memo_scope.unchanged) { + __memo_scope.cached; + return; + } + __memo_parameter_instance.value.setTextOptions("within Builder method", undefined).applyAttributesFinish(); + { + __memo_scope.recache(); + return; + } + }), undefined); { __memo_scope.recache(); return; @@ -290,7 +358,19 @@ function main() {} __memo_scope.cached; return; } - Column(__memo_context, ((__memo_id) + ()), undefined, undefined, @memo() ((__memo_context: __memo_context_type, __memo_id: __memo_id_type) => { + ColumnImpl(__memo_context, ((__memo_id) + ()), @memo() ((__memo_context: __memo_context_type, __memo_id: __memo_id_type, instance: ColumnAttribute): void => { + const __memo_scope = __memo_context.scope(((__memo_id) + ()), 1); + const __memo_parameter_instance = __memo_scope.param(0, instance); + if (__memo_scope.unchanged) { + __memo_scope.cached; + return; + } + __memo_parameter_instance.value.setColumnOptions(undefined).applyAttributesFinish(); + { + __memo_scope.recache(); + return; + } + }), @memo() ((__memo_context: __memo_context_type, __memo_id: __memo_id_type) => { const __memo_scope = __memo_context.scope(((__memo_id) + ()), 0); if (__memo_scope.unchanged) { __memo_scope.cached; @@ -315,7 +395,19 @@ function main() {} __memo_scope.cached; return; } - Text(__memo_context, ((__memo_id) + ()), undefined, \"with Builder lambda\", undefined, undefined); + TextImpl(__memo_context, ((__memo_id) + ()), @memo() ((__memo_context: __memo_context_type, __memo_id: __memo_id_type, instance: TextAttribute): void => { + const __memo_scope = __memo_context.scope(((__memo_id) + ()), 1); + const __memo_parameter_instance = __memo_scope.param(0, instance); + if (__memo_scope.unchanged) { + __memo_scope.cached; + return; + } + __memo_parameter_instance.value.setTextOptions("with Builder lambda", undefined).applyAttributesFinish(); + { + __memo_scope.recache(); + return; + } + }), undefined); { __memo_scope.recache(); return; @@ -354,7 +446,19 @@ function main() {} __memo_scope.cached; return; } - Text(__memo_context, ((__memo_id) + ()), undefined, \"within Builder property\", undefined, undefined); + TextImpl(__memo_context, ((__memo_id) + ()), @memo() ((__memo_context: __memo_context_type, __memo_id: __memo_id_type, instance: TextAttribute): void => { + const __memo_scope = __memo_context.scope(((__memo_id) + ()), 1); + const __memo_parameter_instance = __memo_scope.param(0, instance); + if (__memo_scope.unchanged) { + __memo_scope.cached; + return; + } + __memo_parameter_instance.value.setTextOptions("within Builder property", undefined).applyAttributesFinish(); + { + __memo_scope.recache(); + return; + } + }), undefined); { __memo_scope.recache(); return; @@ -407,7 +511,19 @@ function main() {} __memo_scope.cached; return; } - Text(__memo_context, ((__memo_id) + ()), undefined, \"within BuilderParam property\", undefined, undefined); + TextImpl(__memo_context, ((__memo_id) + ()), @memo() ((__memo_context: __memo_context_type, __memo_id: __memo_id_type, instance: TextAttribute): void => { + const __memo_scope = __memo_context.scope(((__memo_id) + ()), 1); + const __memo_parameter_instance = __memo_scope.param(0, instance); + if (__memo_scope.unchanged) { + __memo_scope.cached; + return; + } + __memo_parameter_instance.value.setTextOptions("within BuilderParam property", undefined).applyAttributesFinish(); + { + __memo_scope.recache(); + return; + } + }), undefined); { __memo_scope.recache(); return; @@ -452,7 +568,19 @@ function main() {} __memo_scope.cached; return; } - Text(__memo_context, ((__memo_id) + ()), undefined, "within struct build", undefined, undefined); + TextImpl(__memo_context, ((__memo_id) + ()), @memo() ((__memo_context: __memo_context_type, __memo_id: __memo_id_type, instance: TextAttribute): void => { + const __memo_scope = __memo_context.scope(((__memo_id) + ()), 1); + const __memo_parameter_instance = __memo_scope.param(0, instance); + if (__memo_scope.unchanged) { + __memo_scope.cached; + return; + } + __memo_parameter_instance.value.setTextOptions("within struct build", undefined).applyAttributesFinish(); + { + __memo_scope.recache(); + return; + } + }), undefined); { __memo_scope.recache(); return; diff --git a/arkui-plugins/test/ut/ui-plugins/builder-lambda/custom-component/custom-component-call.test.ts b/arkui-plugins/test/ut/ui-plugins/builder-lambda/custom-component/custom-component-call.test.ts index 751bfc0be..75d3a17f1 100644 --- a/arkui-plugins/test/ut/ui-plugins/builder-lambda/custom-component/custom-component-call.test.ts +++ b/arkui-plugins/test/ut/ui-plugins/builder-lambda/custom-component/custom-component-call.test.ts @@ -97,6 +97,13 @@ function testParedTransformer(this: PluginTestContext): void { } const expectedBuilderLambdaScript: string = ` +import { ColumnAttribute as ColumnAttribute } from "arkui.component.column"; + +import { TextAttribute as TextAttribute } from "arkui.component.text"; + +import { TextImpl as TextImpl } from "arkui.component.text"; + +import { ColumnImpl as ColumnImpl } from "arkui.component.column"; import { memo as memo } from "arkui.stateManagement.runtime"; @@ -141,18 +148,30 @@ function main() {} public __updateStruct(initializers: (__Options_CustomContainerUser | undefined)): void {} @memo() public build() { - Column(undefined, undefined, @memo() (() => { + ColumnImpl(@memo() ((instance: ColumnAttribute): void => { + instance.setColumnOptions(undefined).applyAttributesFinish(); + return; + }), @memo() (() => { CustomContainer._instantiateImpl(undefined, (() => { return new CustomContainer(); }), undefined, undefined, @memo() (() => { - Column(undefined, undefined, @memo() (() => { - Text(undefined, "hello", undefined, undefined); + ColumnImpl(@memo() ((instance: ColumnAttribute): void => { + instance.setColumnOptions(undefined).applyAttributesFinish(); + return; + }), @memo() (() => { + TextImpl(@memo() ((instance: TextAttribute): void => { + instance.setTextOptions("hello", undefined).applyAttributesFinish(); + return; + }), undefined); })); })); CustomContainer._instantiateImpl(undefined, (() => { return new CustomContainer(); }), {}, undefined, @memo() (() => { - Column(undefined, undefined, @memo() (() => {})); + ColumnImpl(@memo() ((instance: ColumnAttribute): void => { + instance.setColumnOptions(undefined).applyAttributesFinish(); + return; + }), @memo() (() => {})); })); CustomContainer._instantiateImpl(undefined, (() => { return new CustomContainer(); diff --git a/arkui-plugins/test/ut/ui-plugins/builder-lambda/simple-component.test.ts b/arkui-plugins/test/ut/ui-plugins/builder-lambda/simple-component.test.ts index e8e1ace16..d660394e1 100644 --- a/arkui-plugins/test/ut/ui-plugins/builder-lambda/simple-component.test.ts +++ b/arkui-plugins/test/ut/ui-plugins/builder-lambda/simple-component.test.ts @@ -32,13 +32,18 @@ const pluginTester = new PluginTester('test builder-lambda simple component', bu function testBuilderLambdaTransformer(this: PluginTestContext): void { const expectedScript: string = ` +import { ColumnAttribute as ColumnAttribute } from "arkui.component.column"; import { memo as memo } from "arkui.stateManagement.runtime"; +import { ColumnImpl as ColumnImpl } from "arkui.component.column"; import { memo as memo } from \"@ohos.arkui.stateManagement\"; import { Column as Column, ColumnAttribute as ColumnAttribute } from \"arkui.component.column\"; function main() {} class MyStateSample { @memo() public build() { - Column(undefined, undefined, @memo() (() => {})); + ColumnImpl(@memo() ((instance: ColumnAttribute): void => { + instance.setColumnOptions(undefined).applyAttributesFinish(); + return; + }), @memo() (() => {})); } public constructor() {} } @@ -49,7 +54,9 @@ class MyStateSample { function testMemoTransformer(this: PluginTestContext): void { const expectedScript: string = ` import { __memo_context_type as __memo_context_type, __memo_id_type as __memo_id_type } from \"arkui.stateManagement.runtime\"; +import { ColumnAttribute as ColumnAttribute } from "arkui.component.column"; import { memo as memo } from "arkui.stateManagement.runtime"; +import { ColumnImpl as ColumnImpl } from "arkui.component.column"; import { memo as memo } from \"@ohos.arkui.stateManagement\"; import { Column as Column, ColumnAttribute as ColumnAttribute } from \"arkui.component.column\"; function main() {} @@ -60,7 +67,19 @@ class MyStateSample { __memo_scope.cached; return; } - Column(__memo_context, ((__memo_id) + (65509320)), undefined, undefined, @memo() ((__memo_context: __memo_context_type, __memo_id: __memo_id_type) => { + ColumnImpl(__memo_context, ((__memo_id) + ()), @memo() ((__memo_context: __memo_context_type, __memo_id: __memo_id_type, instance: ColumnAttribute): void => { + const __memo_scope = __memo_context.scope(((__memo_id) + ()), 1); + const __memo_parameter_instance = __memo_scope.param(0, instance); + if (__memo_scope.unchanged) { + __memo_scope.cached; + return; + } + __memo_parameter_instance.value.setColumnOptions(undefined).applyAttributesFinish(); + { + __memo_scope.recache(); + return; + } + }), @memo() ((__memo_context: __memo_context_type, __memo_id: __memo_id_type) => { const __memo_scope = __memo_context.scope(((__memo_id) + (147296800)), 0); if (__memo_scope.unchanged) { __memo_scope.cached; diff --git a/arkui-plugins/test/ut/ui-plugins/builder-lambda/style-with-receiver.test.ts b/arkui-plugins/test/ut/ui-plugins/builder-lambda/style-with-receiver.test.ts index f9a77f155..27de4854a 100644 --- a/arkui-plugins/test/ut/ui-plugins/builder-lambda/style-with-receiver.test.ts +++ b/arkui-plugins/test/ut/ui-plugins/builder-lambda/style-with-receiver.test.ts @@ -39,10 +39,15 @@ const parsedTransform: Plugins = { const expectedScript: string = ` +import { ColumnAttribute as ColumnAttribute } from "arkui.component.column"; + import { memo as memo } from "arkui.stateManagement.runtime"; import { TextAttribute as TextAttribute } from "arkui.component.text"; +import { TextImpl as TextImpl } from "arkui.component.text"; + +import { ColumnImpl as ColumnImpl } from "arkui.component.column"; import { CustomComponent as CustomComponent } from "arkui.component.customComponent"; @@ -73,15 +78,18 @@ function main() {} public __updateStruct(initializers: (__Options_MM | undefined)): void {} @memo() public build() { - Column(undefined, undefined, @memo() (() => { - Text(@memo() ((instance: TextAttribute): void => { - style22(cardStyle(instance.height(200).fontColor("#000000"), 600, "#eeeeee").fontSize(60).fontWeight(400)).width(900); + ColumnImpl(@memo() ((instance: ColumnAttribute): void => { + instance.setColumnOptions(undefined).applyAttributesFinish(); + return; + }), @memo() (() => { + TextImpl(@memo() ((instance: TextAttribute): void => { + style22(cardStyle(instance.setTextOptions("hello world", undefined).height(200).fontColor("#000000"), 600, "#eeeeee").fontSize(60).fontWeight(400)).width(900).applyAttributesFinish(); return; - }), "hello world", undefined, undefined); - Text(@memo() ((instance: TextAttribute): void => { - cardStyle(instance, 600, "#eeeeee"); + }), undefined); + TextImpl(@memo() ((instance: TextAttribute): void => { + cardStyle(instance.setTextOptions("hello world", undefined), 600, "#eeeeee").applyAttributesFinish(); return; - }), "hello world", undefined, undefined); + }), undefined); })); } diff --git a/arkui-plugins/test/ut/ui-plugins/component/for-each.test.ts b/arkui-plugins/test/ut/ui-plugins/component/for-each.test.ts index b828c2703..25bfda637 100644 --- a/arkui-plugins/test/ut/ui-plugins/component/for-each.test.ts +++ b/arkui-plugins/test/ut/ui-plugins/component/for-each.test.ts @@ -38,8 +38,16 @@ const parsedTransform: Plugins = { }; const expectedScript: string = ` +import { TextAttribute as TextAttribute } from "arkui.component.text"; + +import { TextImpl as TextImpl } from "arkui.component.text"; + +import { ColumnAttribute as ColumnAttribute } from "arkui.component.column"; + import { memo as memo } from "arkui.stateManagement.runtime"; +import { ColumnImpl as ColumnImpl } from "arkui.component.column"; + import { CustomComponent as CustomComponent } from "arkui.component.customComponent"; import { Component as Component, Text as Text, WrappedBuilder as WrappedBuilder, Column as Column, ForEach as ForEach } from "@kit.ArkUI"; @@ -94,21 +102,33 @@ class AB { } @memo() public build() { - Column(undefined, undefined, @memo() (() => { + ColumnImpl(@memo() ((instance: ColumnAttribute): void => { + instance.setColumnOptions(undefined).applyAttributesFinish(); + return; + }), @memo() (() => { ForEach(((): Array => { return this.arr; }), ((item: string) => { - Text(undefined, item, undefined, undefined); + TextImpl(@memo() ((instance: TextAttribute): void => { + instance.setTextOptions(item, undefined).applyAttributesFinish(); + return; + }), undefined); })); ForEach(((): Array => { return this.getArray(); }), ((item: Person) => { - Text(undefined, item.name, undefined, undefined); + TextImpl(@memo() ((instance: TextAttribute): void => { + instance.setTextOptions(item.name, undefined).applyAttributesFinish(); + return; + }), undefined); })); ForEach(((): Array => { return new AB().bar; }), ((item: string) => { - Text(undefined, item, undefined, undefined); + TextImpl(@memo() ((instance: TextAttribute): void => { + instance.setTextOptions(item, undefined).applyAttributesFinish(); + return; + }), undefined); })); ForEach(((): Array => { return new AB().bar; @@ -122,7 +142,10 @@ class AB { ForEach(((): Array => { return new Array("1", "2"); }), ((item: string) => { - Text(undefined, item, undefined, undefined); + TextImpl(@memo() ((instance: TextAttribute): void => { + instance.setTextOptions(item, undefined).applyAttributesFinish(); + return; + }), undefined); })); })); })); diff --git a/arkui-plugins/test/ut/ui-plugins/decorators/builder-param/builder-param-passing.test.ts b/arkui-plugins/test/ut/ui-plugins/decorators/builder-param/builder-param-passing.test.ts index bed12d063..438ebe36d 100644 --- a/arkui-plugins/test/ut/ui-plugins/decorators/builder-param/builder-param-passing.test.ts +++ b/arkui-plugins/test/ut/ui-plugins/decorators/builder-param/builder-param-passing.test.ts @@ -38,6 +38,14 @@ const parsedTransform: Plugins = { }; const expectedAfterUIScript: string = ` +import { ColumnAttribute as ColumnAttribute } from "arkui.component.column"; + +import { ColumnImpl as ColumnImpl } from "arkui.component.column"; + +import { TextAttribute as TextAttribute } from "arkui.component.text"; + +import { TextImpl as TextImpl } from "arkui.component.text"; + import { memo as memo } from "arkui.stateManagement.runtime"; import { CustomComponent as CustomComponent } from "arkui.component.customComponent"; @@ -80,11 +88,17 @@ function main() {} public __updateStruct(initializers: (__Options_Parent | undefined)): void {} @memo() public componentBuilder() { - Text(undefined, "Parent builder", undefined, undefined); + TextImpl(@memo() ((instance: TextAttribute): void => { + instance.setTextOptions("Parent builder", undefined).applyAttributesFinish(); + return; + }), undefined); } @memo() public build() { - Column(undefined, undefined, @memo() (() => { + ColumnImpl(@memo() ((instance: ColumnAttribute): void => { + instance.setColumnOptions(undefined).applyAttributesFinish(); + return; + }), @memo() (() => { Child._instantiateImpl(undefined, (() => { return new Child(); }), { @@ -100,7 +114,10 @@ function main() {} Child._instantiateImpl(undefined, (() => { return new Child(); }), undefined, undefined, @memo() (() => { - Text(undefined, "Parent builder", undefined, undefined); + TextImpl(@memo() ((instance: TextAttribute): void => { + instance.setTextOptions("Parent builder", undefined).applyAttributesFinish(); + return; + }), undefined); })); })); } @@ -123,6 +140,10 @@ function main() {} const expectedAfterMemoScript: string = ` import { __memo_context_type as __memo_context_type, __memo_id_type as __memo_id_type } from "arkui.stateManagement.runtime"; +import { ColumnAttribute as ColumnAttribute } from "arkui.component.column"; +import { ColumnImpl as ColumnImpl } from "arkui.component.column"; +import { TextAttribute as TextAttribute } from "arkui.component.text"; +import { TextImpl as TextImpl } from "arkui.component.text"; import { memo as memo } from "arkui.stateManagement.runtime"; import { CustomComponent as CustomComponent } from "arkui.component.customComponent"; import { Component as Component, Entry as Entry, Builder as Builder, BuilderParam as BuilderParam, Column as Column, Text as Text } from "@ohos.arkui.component"; @@ -187,7 +208,19 @@ function main() {} __memo_scope.cached; return; } - Text(__memo_context, ((__memo_id) + (137225318)), undefined, "Parent builder", undefined, undefined); + TextImpl(__memo_context, ((__memo_id) + (137225318)), @memo() ((__memo_context: __memo_context_type, __memo_id: __memo_id_type, instance: TextAttribute): void => { + const __memo_scope = __memo_context.scope(((__memo_id) + ()), 1); + const __memo_parameter_instance = __memo_scope.param(0, instance); + if (__memo_scope.unchanged) { + __memo_scope.cached; + return; + } + __memo_parameter_instance.value.setTextOptions("Parent builder", undefined).applyAttributesFinish(); + { + __memo_scope.recache(); + return; + } + }), undefined); { __memo_scope.recache(); return; @@ -200,7 +233,19 @@ function main() {} __memo_scope.cached; return; } - Column(__memo_context, ((__memo_id) + (136716185)), undefined, undefined, @memo() ((__memo_context: __memo_context_type, __memo_id: __memo_id_type) => { + ColumnImpl(__memo_context, ((__memo_id) + (136716185)), @memo() ((__memo_context: __memo_context_type, __memo_id: __memo_id_type, instance: ColumnAttribute): void => { + const __memo_scope = __memo_context.scope(((__memo_id) + ()), 1); + const __memo_parameter_instance = __memo_scope.param(0, instance); + if (__memo_scope.unchanged) { + __memo_scope.cached; + return; + } + __memo_parameter_instance.value.setColumnOptions(undefined).applyAttributesFinish(); + { + __memo_scope.recache(); + return; + } + }), @memo() ((__memo_context: __memo_context_type, __memo_id: __memo_id_type) => { const __memo_scope = __memo_context.scope(((__memo_id) + (54078781)), 0); if (__memo_scope.unchanged) { __memo_scope.cached; @@ -235,7 +280,19 @@ function main() {} __memo_scope.cached; return; } - Text(__memo_context, ((__memo_id) + (223657391)), undefined, "Parent builder", undefined, undefined); + TextImpl(__memo_context, ((__memo_id) + (223657391)), @memo() ((__memo_context: __memo_context_type, __memo_id: __memo_id_type, instance: TextAttribute): void => { + const __memo_scope = __memo_context.scope(((__memo_id) + ()), 1); + const __memo_parameter_instance = __memo_scope.param(0, instance); + if (__memo_scope.unchanged) { + __memo_scope.cached; + return; + } + __memo_parameter_instance.value.setTextOptions("Parent builder", undefined).applyAttributesFinish(); + { + __memo_scope.recache(); + return; + } + }), undefined); { __memo_scope.recache(); return; diff --git a/arkui-plugins/test/ut/ui-plugins/decorators/builder-param/optional-builder-param.test.ts b/arkui-plugins/test/ut/ui-plugins/decorators/builder-param/optional-builder-param.test.ts index 15ed194e3..1d36a346c 100644 --- a/arkui-plugins/test/ut/ui-plugins/decorators/builder-param/optional-builder-param.test.ts +++ b/arkui-plugins/test/ut/ui-plugins/decorators/builder-param/optional-builder-param.test.ts @@ -38,16 +38,25 @@ const parsedTransform: Plugins = { }; const expectedUIScript: string = ` +import { ColumnAttribute as ColumnAttribute } from "arkui.component.column"; +import { ColumnImpl as ColumnImpl } from "arkui.component.column"; +import { RowAttribute as RowAttribute } from "arkui.component.row"; import { ConditionScope as ConditionScope } from "arkui.component.builder"; import { ConditionBranch as ConditionBranch } from "arkui.component.builder"; +import { RowImpl as RowImpl } from "arkui.component.row"; import { memo as memo } from "arkui.stateManagement.runtime"; +import { TextAttribute as TextAttribute } from "arkui.component.text"; +import { TextImpl as TextImpl } from "arkui.component.text"; import { CustomComponent as CustomComponent } from "arkui.component.customComponent"; import { Component as Component, Entry as Entry, Builder as Builder, BuilderParam as BuilderParam, Column as Column, Text as Text, Row as Row } from "@kit.ArkUI"; function main() {} @memo() function showTextBuilder() { - Text(undefined, "Hello World", undefined, undefined); + TextImpl(@memo() ((instance: TextAttribute): void => { + instance.setTextOptions("Hello World", undefined).applyAttributesFinish(); + return; + }), undefined); } @Component() final struct Child extends CustomComponent { @@ -81,7 +90,10 @@ function main() {} } @memo() public build() { - Row(undefined, undefined, @memo() (() => { + RowImpl(@memo() ((instance: RowAttribute): void => { + instance.setRowOptions(undefined).applyAttributesFinish(); + return; + }), @memo() (() => { ConditionScope(@memo() (() => { if (this.customBuilderParam2) { ConditionBranch(@memo() (() => { @@ -110,11 +122,17 @@ function main() {} public __updateStruct(initializers: (__Options_Parent | undefined)): void {} @memo() public componentBuilder() { - Text(undefined, "Parent builder", undefined, undefined); + TextImpl(@memo() ((instance: TextAttribute): void => { + instance.setTextOptions("Parent builder", undefined).applyAttributesFinish(); + return; + }), undefined); } @memo() public build() { - Column(undefined, undefined, @memo() (() => { + ColumnImpl(@memo() ((instance: ColumnAttribute): void => { + instance.setColumnOptions(undefined).applyAttributesFinish(); + return; + }), @memo() (() => { Child._instantiateImpl(undefined, (() => { return new Child(); }), { @@ -146,9 +164,15 @@ function main() {} const expectedMemoScript: string = ` import { __memo_context_type as __memo_context_type, __memo_id_type as __memo_id_type } from "arkui.stateManagement.runtime"; +import { ColumnAttribute as ColumnAttribute } from "arkui.component.column"; +import { ColumnImpl as ColumnImpl } from "arkui.component.column"; +import { RowAttribute as RowAttribute } from "arkui.component.row"; import { ConditionScope as ConditionScope } from "arkui.component.builder"; import { ConditionBranch as ConditionBranch } from "arkui.component.builder"; +import { RowImpl as RowImpl } from "arkui.component.row"; import { memo as memo } from "arkui.stateManagement.runtime"; +import { TextAttribute as TextAttribute } from "arkui.component.text"; +import { TextImpl as TextImpl } from "arkui.component.text"; import { CustomComponent as CustomComponent } from "arkui.component.customComponent"; import { Component as Component, Entry as Entry, Builder as Builder, BuilderParam as BuilderParam, Column as Column, Text as Text, Row as Row } from "@kit.ArkUI"; @@ -160,7 +184,19 @@ function main() {} __memo_scope.cached; return; } - Text(__memo_context, ((__memo_id) + (47330804)), undefined, "Hello World", undefined, undefined); + TextImpl(__memo_context, ((__memo_id) + ()), @memo() ((__memo_context: __memo_context_type, __memo_id: __memo_id_type, instance: TextAttribute): void => { + const __memo_scope = __memo_context.scope(((__memo_id) + ()), 1); + const __memo_parameter_instance = __memo_scope.param(0, instance); + if (__memo_scope.unchanged) { + __memo_scope.cached; + return; + } + __memo_parameter_instance.value.setTextOptions("Hello World", undefined).applyAttributesFinish(); + { + __memo_scope.recache(); + return; + } + }), undefined); { __memo_scope.recache(); return; @@ -203,7 +239,19 @@ function main() {} __memo_scope.cached; return; } - Row(__memo_context, ((__memo_id) + (46726221)), undefined, undefined, @memo() ((__memo_context: __memo_context_type, __memo_id: __memo_id_type) => { + RowImpl(__memo_context, ((__memo_id) + ()), @memo() ((__memo_context: __memo_context_type, __memo_id: __memo_id_type, instance: RowAttribute): void => { + const __memo_scope = __memo_context.scope(((__memo_id) + ()), 1); + const __memo_parameter_instance = __memo_scope.param(0, instance); + if (__memo_scope.unchanged) { + __memo_scope.cached; + return; + } + __memo_parameter_instance.value.setRowOptions(undefined).applyAttributesFinish(); + { + __memo_scope.recache(); + return; + } + }), @memo() ((__memo_context: __memo_context_type, __memo_id: __memo_id_type) => { const __memo_scope = __memo_context.scope(((__memo_id) + (213104625)), 0); if (__memo_scope.unchanged) { __memo_scope.cached; @@ -286,7 +334,19 @@ function main() {} __memo_scope.cached; return; } - Text(__memo_context, ((__memo_id) + (218979098)), undefined, "Parent builder", undefined, undefined); + TextImpl(__memo_context, ((__memo_id) + ()), @memo() ((__memo_context: __memo_context_type, __memo_id: __memo_id_type, instance: TextAttribute): void => { + const __memo_scope = __memo_context.scope(((__memo_id) + ()), 1); + const __memo_parameter_instance = __memo_scope.param(0, instance); + if (__memo_scope.unchanged) { + __memo_scope.cached; + return; + } + __memo_parameter_instance.value.setTextOptions("Parent builder", undefined).applyAttributesFinish(); + { + __memo_scope.recache(); + return; + } + }), undefined); { __memo_scope.recache(); return; @@ -299,7 +359,19 @@ function main() {} __memo_scope.cached; return; } - Column(__memo_context, ((__memo_id) + (78055758)), undefined, undefined, @memo() ((__memo_context: __memo_context_type, __memo_id: __memo_id_type) => { + ColumnImpl(__memo_context, ((__memo_id) + (78055758)), @memo() ((__memo_context: __memo_context_type, __memo_id: __memo_id_type, instance: ColumnAttribute): void => { + const __memo_scope = __memo_context.scope(((__memo_id) + ()), 1); + const __memo_parameter_instance = __memo_scope.param(0, instance); + if (__memo_scope.unchanged) { + __memo_scope.cached; + return; + } + __memo_parameter_instance.value.setColumnOptions(undefined).applyAttributesFinish(); + { + __memo_scope.recache(); + return; + } + }), @memo() ((__memo_context: __memo_context_type, __memo_id: __memo_id_type) => { const __memo_scope = __memo_context.scope(((__memo_id) + (136716185)), 0); if (__memo_scope.unchanged) { __memo_scope.cached; diff --git a/arkui-plugins/test/ut/ui-plugins/decorators/builder/global-builder.test.ts b/arkui-plugins/test/ut/ui-plugins/decorators/builder/global-builder.test.ts index 7ed01f726..4a4095926 100644 --- a/arkui-plugins/test/ut/ui-plugins/decorators/builder/global-builder.test.ts +++ b/arkui-plugins/test/ut/ui-plugins/decorators/builder/global-builder.test.ts @@ -37,8 +37,15 @@ const parsedTransform: Plugins = { const expectedScript: string = ` +import { RowAttribute as RowAttribute } from "arkui.component.row"; + +import { RowImpl as RowImpl } from "arkui.component.row"; + import { memo as memo } from "arkui.stateManagement.runtime"; +import { TextAttribute as TextAttribute } from "arkui.component.text"; + +import { TextImpl as TextImpl } from "arkui.component.text"; import { CustomComponent as CustomComponent } from "arkui.component.customComponent"; @@ -48,12 +55,21 @@ function main() {} @memo() function showTextBuilder() { - Text(undefined, "Hello World", undefined, undefined); + TextImpl(@memo() ((instance: TextAttribute): void => { + instance.setTextOptions("Hello World", undefined).applyAttributesFinish(); + return; + }), undefined); } @memo() function overBuilder(params: Tmp) { - Row(undefined, undefined, @memo() (() => { - Text(undefined, (("UseStateVarByReference: ") + (params.paramA1)), undefined, undefined); + RowImpl(@memo() ((instance: RowAttribute): void => { + instance.setRowOptions(undefined).applyAttributesFinish(); + return; + }), @memo() (() => { + TextImpl(@memo() ((instance: TextAttribute): void => { + instance.setTextOptions((("UseStateVarByReference: ") + (params.paramA1)), undefined).applyAttributesFinish(); + return; + }), undefined); })); } @@ -71,7 +87,10 @@ class Tmp { public __updateStruct(initializers: (__Options_BuilderDemo | undefined)): void {} @memo() public build() { - Row(undefined, undefined, @memo() (() => { + RowImpl(@memo() ((instance: RowAttribute): void => { + instance.setRowOptions(undefined).applyAttributesFinish(); + return; + }), @memo() (() => { showTextBuilder(); overBuilder({ paramA1: "Hello", diff --git a/arkui-plugins/test/ut/ui-plugins/decorators/builder/local-builder.test.ts b/arkui-plugins/test/ut/ui-plugins/decorators/builder/local-builder.test.ts index 54c8ceac0..0858de299 100644 --- a/arkui-plugins/test/ut/ui-plugins/decorators/builder/local-builder.test.ts +++ b/arkui-plugins/test/ut/ui-plugins/decorators/builder/local-builder.test.ts @@ -36,11 +36,15 @@ const parsedTransform: Plugins = { }; const expectedScript: string = ` +import { ColumnAttribute as ColumnAttribute } from "arkui.component.column"; + +import { ColumnImpl as ColumnImpl } from "arkui.component.column"; import { memo as memo } from "arkui.stateManagement.runtime"; import { TextAttribute as TextAttribute } from "arkui.component.text"; +import { TextImpl as TextImpl } from "arkui.component.text"; import { CustomComponent as CustomComponent } from "arkui.component.customComponent"; @@ -56,21 +60,24 @@ function main() {} public __updateStruct(initializers: (__Options_BuilderDemo | undefined)): void {} @memo() public showTextBuilder() { - Text(@memo() ((instance: TextAttribute): void => { - instance.fontSize(30); + TextImpl(@memo() ((instance: TextAttribute): void => { + instance.setTextOptions("Hello World", undefined).fontSize(30).applyAttributesFinish(); return; - }), "Hello World", undefined, undefined); + }), undefined); } @memo() public showTextValueBuilder(param: string) { - Text(@memo() ((instance: TextAttribute): void => { - instance.fontSize(30); + TextImpl(@memo() ((instance: TextAttribute): void => { + instance.setTextOptions(param, undefined).fontSize(30).applyAttributesFinish(); return; - }), param, undefined, undefined); + }), undefined); } @memo() public build() { - Column(undefined, undefined, @memo() (() => { + ColumnImpl(@memo() ((instance: ColumnAttribute): void => { + instance.setColumnOptions(undefined).applyAttributesFinish(); + return; + }), @memo() (() => { this.showTextBuilder(); this.showTextValueBuilder("Hello @Builder"); })); diff --git a/arkui-plugins/test/ut/ui-plugins/decorators/computed/computed-in-struct.test.ts b/arkui-plugins/test/ut/ui-plugins/decorators/computed/computed-in-struct.test.ts index 7ce255df6..bc60f3d2b 100644 --- a/arkui-plugins/test/ut/ui-plugins/decorators/computed/computed-in-struct.test.ts +++ b/arkui-plugins/test/ut/ui-plugins/decorators/computed/computed-in-struct.test.ts @@ -42,10 +42,24 @@ import { STATE_MGMT_FACTORY as STATE_MGMT_FACTORY } from "arkui.stateManagement. import { ILocalDecoratedVariable as ILocalDecoratedVariable } from "arkui.stateManagement.decorator"; -import { memo as memo } from "arkui.stateManagement.runtime"; +import { ColumnAttribute as ColumnAttribute } from "arkui.component.column"; import { ButtonAttribute as ButtonAttribute } from "arkui.component.button"; +import { ButtonImpl as ButtonImpl } from "arkui.component.button"; + +import { DividerAttribute as DividerAttribute } from "arkui.component.divider"; + +import { DividerImpl as DividerImpl } from "arkui.component.divider"; + +import { memo as memo } from "arkui.stateManagement.runtime"; + +import { TextAttribute as TextAttribute } from "arkui.component.text"; + +import { TextImpl as TextImpl } from "arkui.component.text"; + +import { ColumnImpl as ColumnImpl } from "arkui.component.column"; + import { CustomComponentV2 as CustomComponentV2 } from "arkui.component.customComponent"; import { ComponentV2 as ComponentV2, Column as Column, Button as Button, Divider as Divider, Text as Text } from "@ohos.arkui.component"; @@ -104,24 +118,42 @@ function main() {} } @memo() public build() { - Column(undefined, undefined, @memo() (() => { - Text(undefined, ((((this.lastName) + (" "))) + (this.firstName)), undefined, undefined); - Text(undefined, ((((this.lastName) + (" "))) + (this.firstName)), undefined, undefined); - Divider(undefined); - Text(undefined, this.fullName, undefined, undefined); - Text(undefined, this.fullName, undefined, undefined); - Button(@memo() ((instance: ButtonAttribute): void => { - instance.onClick(((e) => { + ColumnImpl(@memo() ((instance: ColumnAttribute): void => { + instance.setColumnOptions(undefined).applyAttributesFinish(); + return; + }), @memo() (() => { + TextImpl(@memo() ((instance: TextAttribute): void => { + instance.setTextOptions(((((this.lastName) + (" "))) + (this.firstName)), undefined).applyAttributesFinish(); + return; + }), undefined); + TextImpl(@memo() ((instance: TextAttribute): void => { + instance.setTextOptions(((((this.lastName) + (" "))) + (this.firstName)), undefined).applyAttributesFinish(); + return; + }), undefined); + DividerImpl(@memo() ((instance: DividerAttribute): void => { + instance.setDividerOptions().applyAttributesFinish(); + return; + })); + TextImpl(@memo() ((instance: TextAttribute): void => { + instance.setTextOptions(this.fullName, undefined).applyAttributesFinish(); + return; + }), undefined); + TextImpl(@memo() ((instance: TextAttribute): void => { + instance.setTextOptions(this.fullName, undefined).applyAttributesFinish(); + return; + }), undefined); + ButtonImpl(@memo() ((instance: ButtonAttribute): void => { + instance.setButtonOptions("changed lastName", undefined).onClick(((e) => { this.lastName += "a"; - })); + })).applyAttributesFinish(); return; - }), "changed lastName", undefined, undefined); - Button(@memo() ((instance: ButtonAttribute): void => { - instance.onClick(((e) => { + }), undefined); + ButtonImpl(@memo() ((instance: ButtonAttribute): void => { + instance.setButtonOptions("changed age", undefined).onClick(((e) => { (this.age++); - })); + })).applyAttributesFinish(); return; - }), "changed age", undefined, undefined); + }), undefined); })); } diff --git a/arkui-plugins/test/ut/ui-plugins/decorators/custom-dialog/base-custom-dialog.test.ts b/arkui-plugins/test/ut/ui-plugins/decorators/custom-dialog/base-custom-dialog.test.ts index 7547b4bfe..5d531fc4d 100644 --- a/arkui-plugins/test/ut/ui-plugins/decorators/custom-dialog/base-custom-dialog.test.ts +++ b/arkui-plugins/test/ut/ui-plugins/decorators/custom-dialog/base-custom-dialog.test.ts @@ -42,12 +42,20 @@ import { STATE_MGMT_FACTORY as STATE_MGMT_FACTORY } from "arkui.stateManagement. import { IStateDecoratedVariable as IStateDecoratedVariable } from "arkui.stateManagement.decorator"; +import { ColumnAttribute as ColumnAttribute } from "arkui.component.column"; + import { ButtonAttribute as ButtonAttribute } from "arkui.component.button"; +import { ButtonImpl as ButtonImpl } from "arkui.component.button"; + import { memo as memo } from "arkui.stateManagement.runtime"; import { TextAttribute as TextAttribute } from "arkui.component.text"; +import { TextImpl as TextImpl } from "arkui.component.text"; + +import { ColumnImpl as ColumnImpl } from "arkui.component.column"; + import { BaseCustomDialog as BaseCustomDialog } from "arkui.component.customComponent"; import { CustomComponent as CustomComponent } from "arkui.component.customComponent"; @@ -136,19 +144,22 @@ function main() {} } @memo() public build() { - Column(undefined, undefined, @memo() (() => { - Text(@memo() ((instance: TextAttribute): void => { - instance.fontSize(30).height(100); + ColumnImpl(@memo() ((instance: ColumnAttribute): void => { + instance.setColumnOptions(undefined).applyAttributesFinish(); + return; + }), @memo() (() => { + TextImpl(@memo() ((instance: TextAttribute): void => { + instance.setTextOptions("CustomDialog One", undefined).fontSize(30).height(100).applyAttributesFinish(); return; - }), "CustomDialog One", undefined, undefined); - Button(@memo() ((instance: ButtonAttribute): void => { - instance.onClick(((e: ClickEvent) => { + }), undefined); + ButtonImpl(@memo() ((instance: ButtonAttribute): void => { + instance.setButtonOptions("Close", undefined).onClick(((e: ClickEvent) => { if (((this.aaController) != (undefined))) { this.aaController!.close(); } - })).margin(20); + })).margin(20).applyAttributesFinish(); return; - }), "Close", undefined, undefined); + }), undefined); })); } @@ -222,15 +233,18 @@ function main() {} } @memo() public build() { - Column(undefined, undefined, @memo() (() => { - Button(@memo() ((instance: ButtonAttribute): void => { - instance.onClick(((e: ClickEvent) => { + ColumnImpl(@memo() ((instance: ColumnAttribute): void => { + instance.setColumnOptions(undefined).applyAttributesFinish(); + return; + }), @memo() (() => { + ButtonImpl(@memo() ((instance: ButtonAttribute): void => { + instance.setButtonOptions("click me", undefined).onClick(((e: ClickEvent) => { if (((this.dialogController) != (null))) { this.dialogController!.open(); } - })).backgroundColor(0x317aff); + })).backgroundColor(0x317aff).applyAttributesFinish(); return; - }), "click me", undefined, undefined); + }), undefined); })); } diff --git a/arkui-plugins/test/ut/ui-plugins/decorators/custom-dialog/builder-dialog-options.test.ts b/arkui-plugins/test/ut/ui-plugins/decorators/custom-dialog/builder-dialog-options.test.ts index 32f602403..9b0667dd2 100644 --- a/arkui-plugins/test/ut/ui-plugins/decorators/custom-dialog/builder-dialog-options.test.ts +++ b/arkui-plugins/test/ut/ui-plugins/decorators/custom-dialog/builder-dialog-options.test.ts @@ -90,6 +90,10 @@ import hilog from "@ohos.hilog"; `; const expectedCheckedScript: string = ` +import { ColumnAttribute as ColumnAttribute } from "arkui.component.column"; + +import { ColumnImpl as ColumnImpl } from "arkui.component.column"; + import { memo as memo } from "arkui.stateManagement.runtime"; import { CustomComponent as CustomComponent } from "arkui.component.customComponent"; @@ -132,7 +136,10 @@ function main() {} } @memo() public build() { - Column(undefined, undefined, @memo() (() => {})); + ColumnImpl(@memo() ((instance: ColumnAttribute): void => { + instance.setColumnOptions(undefined).applyAttributesFinish(); + return; + }), @memo() (() => {})); } private constructor() {} @@ -163,7 +170,10 @@ function main() {} } @memo() public build() { - Column(undefined, undefined, @memo() (() => {})); + ColumnImpl(@memo() ((instance: ColumnAttribute): void => { + instance.setColumnOptions(undefined).applyAttributesFinish(); + return; + }), @memo() (() => {})); } private constructor() {} diff --git a/arkui-plugins/test/ut/ui-plugins/decorators/custom-dialog/controller-in-build.test.ts b/arkui-plugins/test/ut/ui-plugins/decorators/custom-dialog/controller-in-build.test.ts index 9ad581f09..982a2e26a 100644 --- a/arkui-plugins/test/ut/ui-plugins/decorators/custom-dialog/controller-in-build.test.ts +++ b/arkui-plugins/test/ut/ui-plugins/decorators/custom-dialog/controller-in-build.test.ts @@ -40,12 +40,22 @@ const parsedTransform: Plugins = { const expectedScript: string = ` import { ButtonAttribute as ButtonAttribute } from "arkui.component.button"; +import { ButtonImpl as ButtonImpl } from "arkui.component.button"; + import { STATE_MGMT_FACTORY as STATE_MGMT_FACTORY } from "arkui.stateManagement.decorator"; import { IStateDecoratedVariable as IStateDecoratedVariable } from "arkui.stateManagement.decorator"; +import { ColumnAttribute as ColumnAttribute } from "arkui.component.column"; + import { memo as memo } from "arkui.stateManagement.runtime"; +import { TextAttribute as TextAttribute } from "arkui.component.text"; + +import { TextImpl as TextImpl } from "arkui.component.text"; + +import { ColumnImpl as ColumnImpl } from "arkui.component.column"; + import { BaseCustomDialog as BaseCustomDialog } from "arkui.component.customComponent"; import { CustomComponent as CustomComponent } from "arkui.component.customComponent"; @@ -112,8 +122,14 @@ function main() {} } @memo() public build() { - Column(undefined, undefined, @memo() (() => { - Text(undefined, "CustomDialog One", undefined, undefined); + ColumnImpl(@memo() ((instance: ColumnAttribute): void => { + instance.setColumnOptions(undefined).applyAttributesFinish(); + return; + }), @memo() (() => { + TextImpl(@memo() ((instance: TextAttribute): void => { + instance.setTextOptions("CustomDialog One", undefined).applyAttributesFinish(); + return; + }), undefined); })); } @@ -127,9 +143,12 @@ function main() {} public __updateStruct(initializers: (__Options_CustomDialogUser | undefined)): void {} @memo() public build() { - Column(undefined, undefined, @memo() (() => { - Button(@memo() ((instance: ButtonAttribute): void => { - instance.onClick(((e: ClickEvent) => { + ColumnImpl(@memo() ((instance: ColumnAttribute): void => { + instance.setColumnOptions(undefined).applyAttributesFinish(); + return; + }), @memo() (() => { + ButtonImpl(@memo() ((instance: ButtonAttribute): void => { + instance.setButtonOptions("click me", undefined).onClick(((e: ClickEvent) => { let dialogController: (CustomDialogController | undefined) = ({let gensym___220374545: Any; gensym___220374545 = new CustomDialogController({ builder: @memo() (() => { @@ -142,9 +161,9 @@ function main() {} baseComponent: this, }) (gensym___220374545 as CustomDialogController)}); - })).backgroundColor(0x317aff); + })).backgroundColor(0x317aff).applyAttributesFinish(); return; - }), "click me", undefined, undefined); + }), undefined); })); } diff --git a/arkui-plugins/test/ut/ui-plugins/decorators/custom-dialog/extends-dialog-controller.test.ts b/arkui-plugins/test/ut/ui-plugins/decorators/custom-dialog/extends-dialog-controller.test.ts index 1785866b1..663d7e6ad 100644 --- a/arkui-plugins/test/ut/ui-plugins/decorators/custom-dialog/extends-dialog-controller.test.ts +++ b/arkui-plugins/test/ut/ui-plugins/decorators/custom-dialog/extends-dialog-controller.test.ts @@ -40,8 +40,14 @@ const parsedTransform: Plugins = { const expectedScript: string = ` import { ButtonAttribute as ButtonAttribute } from "arkui.component.button"; +import { ButtonImpl as ButtonImpl } from "arkui.component.button"; + +import { ColumnAttribute as ColumnAttribute } from "arkui.component.column"; + import { memo as memo } from "arkui.stateManagement.runtime"; +import { ColumnImpl as ColumnImpl } from "arkui.component.column"; + import { BaseCustomDialog as BaseCustomDialog } from "arkui.component.customComponent"; import { CustomComponent as CustomComponent } from "arkui.component.customComponent"; @@ -78,7 +84,10 @@ function main() {} } @memo() public build() { - Column(undefined, undefined, @memo() (() => {})); + ColumnImpl(@memo() ((instance: ColumnAttribute): void => { + instance.setColumnOptions(undefined).applyAttributesFinish(); + return; + }), @memo() (() => {})); } private constructor() {} @@ -137,15 +146,18 @@ class DialogControllerV3 extends DialogControllerV2 { } @memo() public build() { - Column(undefined, undefined, @memo() (() => { - Button(@memo() ((instance: ButtonAttribute): void => { - instance.onClick(((e: ClickEvent) => { + ColumnImpl(@memo() ((instance: ColumnAttribute): void => { + instance.setColumnOptions(undefined).applyAttributesFinish(); + return; + }), @memo() (() => { + ButtonImpl(@memo() ((instance: ButtonAttribute): void => { + instance.setButtonOptions("click me", undefined).onClick(((e: ClickEvent) => { if (((this.dialogController) != (null))) { this.dialogController!.open(); } - })); + })).applyAttributesFinish(); return; - }), "click me", undefined, undefined); + }), undefined); })); } diff --git a/arkui-plugins/test/ut/ui-plugins/decorators/event/event-initialize.test.ts b/arkui-plugins/test/ut/ui-plugins/decorators/event/event-initialize.test.ts index 783bcc981..ce1b12eac 100644 --- a/arkui-plugins/test/ut/ui-plugins/decorators/event/event-initialize.test.ts +++ b/arkui-plugins/test/ut/ui-plugins/decorators/event/event-initialize.test.ts @@ -110,10 +110,16 @@ import { STATE_MGMT_FACTORY as STATE_MGMT_FACTORY } from "arkui.stateManagement. import { IParamDecoratedVariable as IParamDecoratedVariable } from "arkui.stateManagement.decorator"; +import { ColumnAttribute as ColumnAttribute } from "arkui.component.column"; + import { memo as memo } from "arkui.stateManagement.runtime"; import { TextAttribute as TextAttribute } from "arkui.component.text"; +import { TextImpl as TextImpl } from "arkui.component.text"; + +import { ColumnImpl as ColumnImpl } from "arkui.component.column"; + import { CustomComponentV2 as CustomComponentV2 } from "arkui.component.customComponent"; import { ComponentV2 as ComponentV2, Column as Column, Text as Text } from "@ohos.arkui.component"; @@ -180,14 +186,17 @@ function main() {} } @memo() public build() { - Column(undefined, undefined, @memo() (() => { - Text(@memo() ((instance: TextAttribute): void => { - instance.onClick(((e) => { + ColumnImpl(@memo() ((instance: ColumnAttribute): void => { + instance.setColumnOptions(undefined).applyAttributesFinish(); + return; + }), @memo() (() => { + TextImpl(@memo() ((instance: TextAttribute): void => { + instance.setTextOptions(\`Child index: \${this.index}\`, undefined).onClick(((e) => { this.changeIndex(20); console.log(\`after changeIndex \${this.index}\`); - })); + })).applyAttributesFinish(); return; - }), \`Child index: \${this.index}\`, undefined, undefined); + }), undefined); })); } @@ -213,7 +222,10 @@ function main() {} } @memo() public build() { - Column(undefined, undefined, @memo() (() => { + ColumnImpl(@memo() ((instance: ColumnAttribute): void => { + instance.setColumnOptions(undefined).applyAttributesFinish(); + return; + }), @memo() (() => { Child._instantiateImpl(undefined, (() => { return new Child(); }), { diff --git a/arkui-plugins/test/ut/ui-plugins/decorators/link/link-to-link-prop-state.test.ts b/arkui-plugins/test/ut/ui-plugins/decorators/link/link-to-link-prop-state.test.ts index 0e3f56d43..bfe502042 100644 --- a/arkui-plugins/test/ut/ui-plugins/decorators/link/link-to-link-prop-state.test.ts +++ b/arkui-plugins/test/ut/ui-plugins/decorators/link/link-to-link-prop-state.test.ts @@ -48,8 +48,15 @@ import { LinkSourceType as LinkSourceType } from "arkui.stateManagement.decorato import { ILinkDecoratedVariable as ILinkDecoratedVariable } from "arkui.stateManagement.decorator"; +import { ColumnAttribute as ColumnAttribute } from "arkui.component.column"; + import { memo as memo } from "arkui.stateManagement.runtime"; +import { TextInputAttribute as TextInputAttribute } from "arkui.component.textInput"; + +import { TextInputImpl as TextInputImpl } from "arkui.component.textInput"; + +import { ColumnImpl as ColumnImpl } from "arkui.component.column"; import { CustomComponent as CustomComponent } from "arkui.component.customComponent"; @@ -80,10 +87,16 @@ function main() {} } @memo() public build() { - Column(undefined, undefined, @memo() (() => { - TextInput(undefined, { - text: this.text1, - }, undefined); + ColumnImpl(@memo() ((instance: ColumnAttribute): void => { + instance.setColumnOptions(undefined).applyAttributesFinish(); + return; + }), @memo() (() => { + TextInputImpl(@memo() ((instance: TextInputAttribute): void => { + instance.setTextInputOptions({ + text: this.text1, + }).applyAttributesFinish(); + return; + }), undefined); Child._instantiateImpl(undefined, (() => { return new Child(); }), { @@ -164,9 +177,12 @@ function main() {} } @memo() public build() { - TextInput(undefined, { - text: this.childText, - }, undefined); + TextInputImpl(@memo() ((instance: TextInputAttribute): void => { + instance.setTextInputOptions({ + text: this.childText, + }).applyAttributesFinish(); + return; + }), undefined); } private constructor() {} diff --git a/arkui-plugins/test/ut/ui-plugins/decorators/link/state-to-link.test.ts b/arkui-plugins/test/ut/ui-plugins/decorators/link/state-to-link.test.ts index 8f4d4fa0e..b3c9356ad 100644 --- a/arkui-plugins/test/ut/ui-plugins/decorators/link/state-to-link.test.ts +++ b/arkui-plugins/test/ut/ui-plugins/decorators/link/state-to-link.test.ts @@ -46,10 +46,20 @@ import { LinkSourceType as LinkSourceType } from "arkui.stateManagement.decorato import { ILinkDecoratedVariable as ILinkDecoratedVariable } from "arkui.stateManagement.decorator"; +import { ColumnAttribute as ColumnAttribute } from "arkui.component.column"; + +import { DatePickerAttribute as DatePickerAttribute } from "arkui.component.datePicker"; + +import { DatePickerImpl as DatePickerImpl } from "arkui.component.datePicker"; + import { memo as memo } from "arkui.stateManagement.runtime"; import { ButtonAttribute as ButtonAttribute } from "arkui.component.button"; +import { ButtonImpl as ButtonImpl } from "arkui.component.button"; + +import { ColumnImpl as ColumnImpl } from "arkui.component.column"; + import { NavInterface as NavInterface } from "arkui.UserView"; import { PageLifeCycle as PageLifeCycle } from "arkui.component.customComponent"; @@ -94,24 +104,30 @@ __EntryWrapper.RegisterNamedRouter("", new __EntryWrapper(), ({ } @memo() public build() { - Column(undefined, undefined, @memo() (() => { - Button(@memo() ((instance: ButtonAttribute): void => { - instance.onClick(((e: ClickEvent) => { + ColumnImpl(@memo() ((instance: ColumnAttribute): void => { + instance.setColumnOptions(undefined).applyAttributesFinish(); + return; + }), @memo() (() => { + ButtonImpl(@memo() ((instance: ButtonAttribute): void => { + instance.setButtonOptions("child increase the year by 1", undefined).onClick(((e: ClickEvent) => { this.selectedDate.setFullYear(((this.selectedDate.getFullYear()) + (1))); - })); + })).applyAttributesFinish(); return; - }), "child increase the year by 1", undefined, undefined); - Button(@memo() ((instance: ButtonAttribute): void => { - instance.margin(10).onClick(((e: ClickEvent) => { + }), undefined); + ButtonImpl(@memo() ((instance: ButtonAttribute): void => { + instance.setButtonOptions("child update the new date", undefined).margin(10).onClick(((e: ClickEvent) => { this.selectedDate = new Date("2023-09-09"); - })); + })).applyAttributesFinish(); + return; + }), undefined); + DatePickerImpl(@memo() ((instance: DatePickerAttribute): void => { + instance.setDatePickerOptions({ + start: new Date("1970-1-1"), + end: new Date("2100-1-1"), + selected: this.selectedDate, + }).applyAttributesFinish(); return; - }), "child update the new date", undefined, undefined); - DatePicker(undefined, { - start: new Date("1970-1-1"), - end: new Date("2100-1-1"), - selected: this.selectedDate, - }, undefined); + }), undefined); })); } @@ -138,24 +154,30 @@ __EntryWrapper.RegisterNamedRouter("", new __EntryWrapper(), ({ } @memo() public build() { - Column(undefined, undefined, @memo() (() => { - Button(@memo() ((instance: ButtonAttribute): void => { - instance.margin(10).onClick(((e: ClickEvent) => { + ColumnImpl(@memo() ((instance: ColumnAttribute): void => { + instance.setColumnOptions(undefined).applyAttributesFinish(); + return; + }), @memo() (() => { + ButtonImpl(@memo() ((instance: ButtonAttribute): void => { + instance.setButtonOptions("parent increase the month by 1", undefined).margin(10).onClick(((e: ClickEvent) => { this.parentSelectedDate.setMonth(((this.parentSelectedDate.getMonth()) + (1))); - })); + })).applyAttributesFinish(); return; - }), "parent increase the month by 1", undefined, undefined); - Button(@memo() ((instance: ButtonAttribute): void => { - instance.margin(10).onClick(((e: ClickEvent) => { + }), undefined); + ButtonImpl(@memo() ((instance: ButtonAttribute): void => { + instance.setButtonOptions("parent update the new date", undefined).margin(10).onClick(((e: ClickEvent) => { this.parentSelectedDate = new Date("2023-07-07"); - })); + })).applyAttributesFinish(); + return; + }), undefined); + DatePickerImpl(@memo() ((instance: DatePickerAttribute): void => { + instance.setDatePickerOptions({ + start: new Date("1970-1-1"), + end: new Date("2100-1-1"), + selected: this.parentSelectedDate, + }).applyAttributesFinish(); return; - }), "parent update the new date", undefined, undefined); - DatePicker(undefined, { - start: new Date("1970-1-1"), - end: new Date("2100-1-1"), - selected: this.parentSelectedDate, - }, undefined); + }), undefined); DateComponent._instantiateImpl(undefined, (() => { return new DateComponent(); }), { diff --git a/arkui-plugins/test/ut/ui-plugins/decorators/monitor/monitor-in-observedv2-class.test.ts b/arkui-plugins/test/ut/ui-plugins/decorators/monitor/monitor-in-observedv2-class.test.ts index 35a2ba44f..3451f48e2 100644 --- a/arkui-plugins/test/ut/ui-plugins/decorators/monitor/monitor-in-observedv2-class.test.ts +++ b/arkui-plugins/test/ut/ui-plugins/decorators/monitor/monitor-in-observedv2-class.test.ts @@ -38,10 +38,16 @@ const parsedTransform: Plugins = { }; const expectedScript: string = ` +import { ColumnAttribute as ColumnAttribute } from "arkui.component.column"; + import { memo as memo } from "arkui.stateManagement.runtime"; import { ButtonAttribute as ButtonAttribute } from "arkui.component.button"; +import { ButtonImpl as ButtonImpl } from "arkui.component.button"; + +import { ColumnImpl as ColumnImpl } from "arkui.component.column"; + import { IObservedObject as IObservedObject } from "arkui.stateManagement.decorator"; import { IMonitorDecoratedVariable as IMonitorDecoratedVariable } from "arkui.stateManagement.decorator"; @@ -221,31 +227,34 @@ function main() {} } @memo() public build() { - Column(undefined, undefined, @memo() (() => { - Button(@memo() ((instance: ButtonAttribute): void => { - instance.onClick(((e) => { + ColumnImpl(@memo() ((instance: ColumnAttribute): void => { + instance.setColumnOptions(undefined).applyAttributesFinish(); + return; + }), @memo() (() => { + ButtonImpl(@memo() ((instance: ButtonAttribute): void => { + instance.setButtonOptions("change name", undefined).onClick(((e) => { this.info.name = "Jack"; - })); + })).applyAttributesFinish(); return; - }), "change name", undefined, undefined); - Button(@memo() ((instance: ButtonAttribute): void => { - instance.onClick(((e) => { + }), undefined); + ButtonImpl(@memo() ((instance: ButtonAttribute): void => { + instance.setButtonOptions("change age", undefined).onClick(((e) => { this.info.age = 26; - })); + })).applyAttributesFinish(); return; - }), "change age", undefined, undefined); - Button(@memo() ((instance: ButtonAttribute): void => { - instance.onClick(((e) => { + }), undefined); + ButtonImpl(@memo() ((instance: ButtonAttribute): void => { + instance.setButtonOptions("change region", undefined).onClick(((e) => { this.info.region = "South"; - })); + })).applyAttributesFinish(); return; - }), "change region", undefined, undefined); - Button(@memo() ((instance: ButtonAttribute): void => { - instance.onClick(((e) => { + }), undefined); + ButtonImpl(@memo() ((instance: ButtonAttribute): void => { + instance.setButtonOptions("change job", undefined).onClick(((e) => { this.info.job = "Driver"; - })); + })).applyAttributesFinish(); return; - }), "change job", undefined, undefined); + }), undefined); })); } diff --git a/arkui-plugins/test/ut/ui-plugins/decorators/monitor/monitor-in-struct.test.ts b/arkui-plugins/test/ut/ui-plugins/decorators/monitor/monitor-in-struct.test.ts index df17928a9..d37a7bb74 100644 --- a/arkui-plugins/test/ut/ui-plugins/decorators/monitor/monitor-in-struct.test.ts +++ b/arkui-plugins/test/ut/ui-plugins/decorators/monitor/monitor-in-struct.test.ts @@ -44,10 +44,16 @@ import { STATE_MGMT_FACTORY as STATE_MGMT_FACTORY } from "arkui.stateManagement. import { ILocalDecoratedVariable as ILocalDecoratedVariable } from "arkui.stateManagement.decorator"; +import { ColumnAttribute as ColumnAttribute } from "arkui.component.column"; + import { memo as memo } from "arkui.stateManagement.runtime"; import { ButtonAttribute as ButtonAttribute } from "arkui.component.button"; +import { ButtonImpl as ButtonImpl } from "arkui.component.button"; + +import { ColumnImpl as ColumnImpl } from "arkui.component.column"; + import { CustomComponentV2 as CustomComponentV2 } from "arkui.component.customComponent"; import { ComponentV2 as ComponentV2, Column as Column, Button as Button } from "@ohos.arkui.component"; @@ -121,14 +127,17 @@ function main() {} } @memo() public build() { - Column(undefined, undefined, @memo() (() => { - Button(@memo() ((instance: ButtonAttribute): void => { - instance.onClick(((e) => { + ColumnImpl(@memo() ((instance: ColumnAttribute): void => { + instance.setColumnOptions(undefined).applyAttributesFinish(); + return; + }), @memo() (() => { + ButtonImpl(@memo() ((instance: ButtonAttribute): void => { + instance.setButtonOptions("change string", undefined).onClick(((e) => { this.message += "!"; this.name = "Jack"; - })); + })).applyAttributesFinish(); return; - }), "change string", undefined, undefined); + }), undefined); })); } diff --git a/arkui-plugins/test/ut/ui-plugins/decorators/objectlink/objectlink-observed.test.ts b/arkui-plugins/test/ut/ui-plugins/decorators/objectlink/objectlink-observed.test.ts index 79774185e..fa432b935 100644 --- a/arkui-plugins/test/ut/ui-plugins/decorators/objectlink/objectlink-observed.test.ts +++ b/arkui-plugins/test/ut/ui-plugins/decorators/objectlink/objectlink-observed.test.ts @@ -43,10 +43,16 @@ import { IStateDecoratedVariable as IStateDecoratedVariable } from "arkui.stateM import { IObjectLinkDecoratedVariable as IObjectLinkDecoratedVariable } from "arkui.stateManagement.decorator"; +import { ColumnAttribute as ColumnAttribute } from "arkui.component.column"; + import { memo as memo } from "arkui.stateManagement.runtime"; import { ButtonAttribute as ButtonAttribute } from "arkui.component.button"; +import { ButtonImpl as ButtonImpl } from "arkui.component.button"; + +import { ColumnImpl as ColumnImpl } from "arkui.component.column"; + import { IObservedObject as IObservedObject } from "arkui.stateManagement.decorator"; import { OBSERVE as OBSERVE } from "arkui.stateManagement.decorator"; @@ -200,13 +206,16 @@ __EntryWrapper.RegisterNamedRouter("", new __EntryWrapper(), ({ } @memo() public build() { - Column(undefined, undefined, @memo() (() => { - Button(@memo() ((instance: ButtonAttribute): void => { - instance.onClick(((e: ClickEvent) => { + ColumnImpl(@memo() ((instance: ColumnAttribute): void => { + instance.setColumnOptions(undefined).applyAttributesFinish(); + return; + }), @memo() (() => { + ButtonImpl(@memo() ((instance: ButtonAttribute): void => { + instance.setButtonOptions("child increase the day by 1", undefined).onClick(((e: ClickEvent) => { this.data.setDate(((this.data.getDate()) + (1))); - })); + })).applyAttributesFinish(); return; - }), "child increase the day by 1", undefined, undefined); + }), undefined); })); } @@ -233,25 +242,28 @@ __EntryWrapper.RegisterNamedRouter("", new __EntryWrapper(), ({ } @memo() public build() { - Column(undefined, undefined, @memo() (() => { + ColumnImpl(@memo() ((instance: ColumnAttribute): void => { + instance.setColumnOptions(undefined).applyAttributesFinish(); + return; + }), @memo() (() => { Child._instantiateImpl(undefined, (() => { return new Child(); }), { label: "date", data: this.newData.data, }, undefined, undefined); - Button(@memo() ((instance: ButtonAttribute): void => { - instance.onClick(((e: ClickEvent) => { + ButtonImpl(@memo() ((instance: ButtonAttribute): void => { + instance.setButtonOptions("parent update the new date", undefined).onClick(((e: ClickEvent) => { this.newData.data = new DateClass("2023-07-07"); - })); + })).applyAttributesFinish(); return; - }), "parent update the new date", undefined, undefined); - Button(@memo() ((instance: ButtonAttribute): void => { - instance.onClick(((e: ClickEvent) => { + }), undefined); + ButtonImpl(@memo() ((instance: ButtonAttribute): void => { + instance.setButtonOptions("ViewB: this.newData = new NewDate(new DateClass('2023-08-20'))", undefined).onClick(((e: ClickEvent) => { this.newData = new NewDate(new DateClass("2023-08-20")); - })); + })).applyAttributesFinish(); return; - }), "ViewB: this.newData = new NewDate(new DateClass('2023-08-20'))", undefined, undefined); + }), undefined); })); } diff --git a/arkui-plugins/test/ut/ui-plugins/decorators/once/once-with-require.test.ts b/arkui-plugins/test/ut/ui-plugins/decorators/once/once-with-require.test.ts index dade76adc..44dacc015 100644 --- a/arkui-plugins/test/ut/ui-plugins/decorators/once/once-with-require.test.ts +++ b/arkui-plugins/test/ut/ui-plugins/decorators/once/once-with-require.test.ts @@ -112,10 +112,20 @@ import { ILocalDecoratedVariable as ILocalDecoratedVariable } from "arkui.stateM import { IParamOnceDecoratedVariable as IParamOnceDecoratedVariable } from "arkui.stateManagement.decorator"; -import { memo as memo } from "arkui.stateManagement.runtime"; +import { ColumnAttribute as ColumnAttribute } from "arkui.component.column"; import { ButtonAttribute as ButtonAttribute } from "arkui.component.button"; +import { ButtonImpl as ButtonImpl } from "arkui.component.button"; + +import { memo as memo } from "arkui.stateManagement.runtime"; + +import { TextAttribute as TextAttribute } from "arkui.component.text"; + +import { TextImpl as TextImpl } from "arkui.component.text"; + +import { ColumnImpl as ColumnImpl } from "arkui.component.column"; + import { IObservedObject as IObservedObject } from "arkui.stateManagement.decorator"; import { UIUtils as UIUtils } from "arkui.stateManagement.utils"; @@ -212,15 +222,24 @@ function main() {} } @memo() public build() { - Column(undefined, undefined, @memo() (() => { - Text(undefined, \`Child onceParamNum: \${this.onceParamNum}\`, undefined, undefined); - Text(undefined, \`Child onceParamInfo: \${this.onceParamInfo.name}\`, undefined, undefined); - Button(@memo() ((instance: ButtonAttribute): void => { - instance.onClick(((e) => { + ColumnImpl(@memo() ((instance: ColumnAttribute): void => { + instance.setColumnOptions(undefined).applyAttributesFinish(); + return; + }), @memo() (() => { + TextImpl(@memo() ((instance: TextAttribute): void => { + instance.setTextOptions(\`Child onceParamNum: \${this.onceParamNum}\`, undefined).applyAttributesFinish(); + return; + }), undefined); + TextImpl(@memo() ((instance: TextAttribute): void => { + instance.setTextOptions(\`Child onceParamInfo: \${this.onceParamInfo.name}\`, undefined).applyAttributesFinish(); + return; + }), undefined); + ButtonImpl(@memo() ((instance: ButtonAttribute): void => { + instance.setButtonOptions("changeOnceParamNum", undefined).onClick(((e) => { (this.onceParamNum++); - })); + })).applyAttributesFinish(); return; - }), "changeOnceParamNum", undefined, undefined); + }), undefined); })); } @@ -257,9 +276,18 @@ function main() {} } @memo() public build() { - Column(undefined, undefined, @memo() (() => { - Text(undefined, \`Parent localNum: \${this.localNum}\`, undefined, undefined); - Text(undefined, \`Parent localInfo: \${this.localInfo.name}\`, undefined, undefined); + ColumnImpl(@memo() ((instance: ColumnAttribute): void => { + instance.setColumnOptions(undefined).applyAttributesFinish(); + return; + }), @memo() (() => { + TextImpl(@memo() ((instance: TextAttribute): void => { + instance.setTextOptions(\`Parent localNum: \${this.localNum}\`, undefined).applyAttributesFinish(); + return; + }), undefined); + TextImpl(@memo() ((instance: TextAttribute): void => { + instance.setTextOptions(\`Parent localInfo: \${this.localInfo.name}\`, undefined).applyAttributesFinish(); + return; + }), undefined); Child._instantiateImpl(undefined, (() => { return new Child(); }), { diff --git a/arkui-plugins/test/ut/ui-plugins/decorators/param/param-with-require.test.ts b/arkui-plugins/test/ut/ui-plugins/decorators/param/param-with-require.test.ts index 488decbf2..91e2fa2fc 100644 --- a/arkui-plugins/test/ut/ui-plugins/decorators/param/param-with-require.test.ts +++ b/arkui-plugins/test/ut/ui-plugins/decorators/param/param-with-require.test.ts @@ -145,14 +145,24 @@ class Info { const expectedCheckedScript: string = ` import { IParamDecoratedVariable as IParamDecoratedVariable } from "arkui.stateManagement.decorator"; +import { TextAttribute as TextAttribute } from "arkui.component.text"; + +import { TextImpl as TextImpl } from "arkui.component.text"; + import { STATE_MGMT_FACTORY as STATE_MGMT_FACTORY } from "arkui.stateManagement.decorator"; import { ILocalDecoratedVariable as ILocalDecoratedVariable } from "arkui.stateManagement.decorator"; +import { ColumnAttribute as ColumnAttribute } from "arkui.component.column"; + import { memo as memo } from "arkui.stateManagement.runtime"; import { ButtonAttribute as ButtonAttribute } from "arkui.component.button"; +import { ButtonImpl as ButtonImpl } from "arkui.component.button"; + +import { ColumnImpl as ColumnImpl } from "arkui.component.column"; + import { CustomComponentV2 as CustomComponentV2 } from "arkui.component.customComponent"; import { ComponentV2 as ComponentV2, Column as Column, ForEach as ForEach, Button as Button, Text as Text } from "@ohos.arkui.component"; @@ -208,7 +218,10 @@ class Info { } @memo() public build() { - Column(undefined, undefined, @memo() (() => { + ColumnImpl(@memo() ((instance: ColumnAttribute): void => { + instance.setColumnOptions(undefined).applyAttributesFinish(); + return; + }), @memo() (() => { ForEach(((): Array => { return this.infoList; }), ((info: Info) => { @@ -218,14 +231,14 @@ class Info { info: info, }, undefined, undefined); })); - Button(@memo() ((instance: ButtonAttribute): void => { - instance.onClick(((e) => { + ButtonImpl(@memo() ((instance: ButtonAttribute): void => { + instance.setButtonOptions("change", undefined).onClick(((e) => { this.infoList[0] = new Info("Atom", 40, 27, 90); this.infoList[1].name = "Bob"; this.infoList[2].region = new Region(7, 9); - })); + })).applyAttributesFinish(); return; - }), "change", undefined, undefined); + }), undefined); })); } @@ -252,9 +265,18 @@ class Info { } @memo() public build() { - Column(undefined, undefined, @memo() (() => { - Text(undefined, \`name: \${this.info.name}\`, undefined, undefined); - Text(undefined, \`age: \${this.info.age}\`, undefined, undefined); + ColumnImpl(@memo() ((instance: ColumnAttribute): void => { + instance.setColumnOptions(undefined).applyAttributesFinish(); + return; + }), @memo() (() => { + TextImpl(@memo() ((instance: TextAttribute): void => { + instance.setTextOptions(\`name: \${this.info.name}\`, undefined).applyAttributesFinish(); + return; + }), undefined); + TextImpl(@memo() ((instance: TextAttribute): void => { + instance.setTextOptions(\`age: \${this.info.age}\`, undefined).applyAttributesFinish(); + return; + }), undefined); SubComponent._instantiateImpl(undefined, (() => { return new SubComponent(); }), { @@ -286,8 +308,14 @@ class Info { } @memo() public build() { - Column(undefined, undefined, @memo() (() => { - Text(undefined, \`region: \${this.region.x}-\${this.region.y}\`, undefined, undefined); + ColumnImpl(@memo() ((instance: ColumnAttribute): void => { + instance.setColumnOptions(undefined).applyAttributesFinish(); + return; + }), @memo() (() => { + TextImpl(@memo() ((instance: TextAttribute): void => { + instance.setTextOptions(\`region: \${this.region.x}-\${this.region.y}\`, undefined).applyAttributesFinish(); + return; + }), undefined); })); } diff --git a/arkui-plugins/test/ut/ui-plugins/decorators/prop-ref/state-to-propref.test.ts b/arkui-plugins/test/ut/ui-plugins/decorators/prop-ref/state-to-propref.test.ts index 1cc5db07d..b1e775c06 100644 --- a/arkui-plugins/test/ut/ui-plugins/decorators/prop-ref/state-to-propref.test.ts +++ b/arkui-plugins/test/ut/ui-plugins/decorators/prop-ref/state-to-propref.test.ts @@ -44,14 +44,24 @@ import { STATE_MGMT_FACTORY as STATE_MGMT_FACTORY } from "arkui.stateManagement. import { IPropRefDecoratedVariable as IPropRefDecoratedVariable } from "arkui.stateManagement.decorator"; +import { ColumnAttribute as ColumnAttribute } from "arkui.component.column"; + import { ButtonAttribute as ButtonAttribute } from "arkui.component.button"; +import { ButtonImpl as ButtonImpl } from "arkui.component.button"; + import { ConditionScope as ConditionScope } from "arkui.component.builder"; import { ConditionBranch as ConditionBranch } from "arkui.component.builder"; import { memo as memo } from "arkui.stateManagement.runtime"; +import { TextAttribute as TextAttribute } from "arkui.component.text"; + +import { TextImpl as TextImpl } from "arkui.component.text"; + +import { ColumnImpl as ColumnImpl } from "arkui.component.column"; + import { CustomComponent as CustomComponent } from "arkui.component.customComponent"; import { Component as Component, Text as Text, Button as Button, Column as Column, ClickEvent as ClickEvent } from "@ohos.arkui.component"; @@ -96,24 +106,33 @@ function main() {} } @memo() public build() { - Column(undefined, undefined, @memo() (() => { + ColumnImpl(@memo() ((instance: ColumnAttribute): void => { + instance.setColumnOptions(undefined).applyAttributesFinish(); + return; + }), @memo() (() => { ConditionScope(@memo() (() => { if (((this.count) > (0))) { ConditionBranch(@memo() (() => { - Text(undefined, (((("You have") + (this.count))) + ("Nuggets left")), undefined, undefined); + TextImpl(@memo() ((instance: TextAttribute): void => { + instance.setTextOptions((((("You have") + (this.count))) + ("Nuggets left")), undefined).applyAttributesFinish(); + return; + }), undefined); })); } else { ConditionBranch(@memo() (() => { - Text(undefined, "Game over!", undefined, undefined); + TextImpl(@memo() ((instance: TextAttribute): void => { + instance.setTextOptions("Game over!", undefined).applyAttributesFinish(); + return; + }), undefined); })); } })); - Button(@memo() ((instance: ButtonAttribute): void => { - instance.onClick(((e: ClickEvent) => { + ButtonImpl(@memo() ((instance: ButtonAttribute): void => { + instance.setButtonOptions("Try again", undefined).onClick(((e: ClickEvent) => { this.count -= this.costOfOneAttempt; - })); + })).applyAttributesFinish(); return; - }), "Try again", undefined, undefined); + }), undefined); })); } @@ -140,20 +159,26 @@ function main() {} } @memo() public build() { - Column(undefined, undefined, @memo() (() => { - Text(undefined, (((("Grant") + (this.countDownStartValue))) + ("nuggets to play.")), undefined, undefined); - Button(@memo() ((instance: ButtonAttribute): void => { - instance.onClick(((e: ClickEvent) => { + ColumnImpl(@memo() ((instance: ColumnAttribute): void => { + instance.setColumnOptions(undefined).applyAttributesFinish(); + return; + }), @memo() (() => { + TextImpl(@memo() ((instance: TextAttribute): void => { + instance.setTextOptions((((("Grant") + (this.countDownStartValue))) + ("nuggets to play.")), undefined).applyAttributesFinish(); + return; + }), undefined); + ButtonImpl(@memo() ((instance: ButtonAttribute): void => { + instance.setButtonOptions("+1 - Nuggets in New Game", undefined).onClick(((e: ClickEvent) => { this.countDownStartValue += 1; - })); + })).applyAttributesFinish(); return; - }), "+1 - Nuggets in New Game", undefined, undefined); - Button(@memo() ((instance: ButtonAttribute): void => { - instance.onClick(((e: ClickEvent) => { + }), undefined); + ButtonImpl(@memo() ((instance: ButtonAttribute): void => { + instance.setButtonOptions("-1 - Nuggets in New Game", undefined).onClick(((e: ClickEvent) => { this.countDownStartValue -= 1; - })); + })).applyAttributesFinish(); return; - }), "-1 - Nuggets in New Game", undefined, undefined); + }), undefined); CountDownComponent._instantiateImpl(undefined, (() => { return new CountDownComponent(); }), { diff --git a/arkui-plugins/test/ut/ui-plugins/decorators/prop/state-to-prop.test.ts b/arkui-plugins/test/ut/ui-plugins/decorators/prop/state-to-prop.test.ts index fb8f9e78c..b54b2b522 100644 --- a/arkui-plugins/test/ut/ui-plugins/decorators/prop/state-to-prop.test.ts +++ b/arkui-plugins/test/ut/ui-plugins/decorators/prop/state-to-prop.test.ts @@ -44,14 +44,24 @@ import { STATE_MGMT_FACTORY as STATE_MGMT_FACTORY } from "arkui.stateManagement. import { IPropDecoratedVariable as IPropDecoratedVariable } from "arkui.stateManagement.decorator"; +import { ColumnAttribute as ColumnAttribute } from "arkui.component.column"; + import { ButtonAttribute as ButtonAttribute } from "arkui.component.button"; +import { ButtonImpl as ButtonImpl } from "arkui.component.button"; + import { ConditionScope as ConditionScope } from "arkui.component.builder"; import { ConditionBranch as ConditionBranch } from "arkui.component.builder"; import { memo as memo } from "arkui.stateManagement.runtime"; +import { TextAttribute as TextAttribute } from "arkui.component.text"; + +import { TextImpl as TextImpl } from "arkui.component.text"; + +import { ColumnImpl as ColumnImpl } from "arkui.component.column"; + import { CustomComponent as CustomComponent } from "arkui.component.customComponent"; import { Component as Component, Text as Text, Button as Button, Column as Column, ClickEvent as ClickEvent } from "@ohos.arkui.component"; @@ -96,24 +106,33 @@ function main() {} } @memo() public build() { - Column(undefined, undefined, @memo() (() => { + ColumnImpl(@memo() ((instance: ColumnAttribute): void => { + instance.setColumnOptions(undefined).applyAttributesFinish(); + return; + }), @memo() (() => { ConditionScope(@memo() (() => { if (((this.count) > (0))) { ConditionBranch(@memo() (() => { - Text(undefined, (((("You have") + (this.count))) + ("Nuggets left")), undefined, undefined); + TextImpl(@memo() ((instance: TextAttribute): void => { + instance.setTextOptions((((("You have") + (this.count))) + ("Nuggets left")), undefined).applyAttributesFinish(); + return; + }), undefined); })); } else { ConditionBranch(@memo() (() => { - Text(undefined, "Game over!", undefined, undefined); + TextImpl(@memo() ((instance: TextAttribute): void => { + instance.setTextOptions("Game over!", undefined).applyAttributesFinish(); + return; + }), undefined); })); } })); - Button(@memo() ((instance: ButtonAttribute): void => { - instance.onClick(((e: ClickEvent) => { + ButtonImpl(@memo() ((instance: ButtonAttribute): void => { + instance.setButtonOptions("Try again", undefined).onClick(((e: ClickEvent) => { this.count -= this.costOfOneAttempt; - })); + })).applyAttributesFinish(); return; - }), "Try again", undefined, undefined); + }), undefined); })); } @@ -140,20 +159,26 @@ function main() {} } @memo() public build() { - Column(undefined, undefined, @memo() (() => { - Text(undefined, (((("Grant") + (this.countDownStartValue))) + ("nuggets to play.")), undefined, undefined); - Button(@memo() ((instance: ButtonAttribute): void => { - instance.onClick(((e: ClickEvent) => { + ColumnImpl(@memo() ((instance: ColumnAttribute): void => { + instance.setColumnOptions(undefined).applyAttributesFinish(); + return; + }), @memo() (() => { + TextImpl(@memo() ((instance: TextAttribute): void => { + instance.setTextOptions((((("Grant") + (this.countDownStartValue))) + ("nuggets to play.")), undefined).applyAttributesFinish(); + return; + }), undefined); + ButtonImpl(@memo() ((instance: ButtonAttribute): void => { + instance.setButtonOptions("+1 - Nuggets in New Game", undefined).onClick(((e: ClickEvent) => { this.countDownStartValue += 1; - })); + })).applyAttributesFinish(); return; - }), "+1 - Nuggets in New Game", undefined, undefined); - Button(@memo() ((instance: ButtonAttribute): void => { - instance.onClick(((e: ClickEvent) => { + }), undefined); + ButtonImpl(@memo() ((instance: ButtonAttribute): void => { + instance.setButtonOptions("-1 - Nuggets in New Game", undefined).onClick(((e: ClickEvent) => { this.countDownStartValue -= 1; - })); + })).applyAttributesFinish(); return; - }), "-1 - Nuggets in New Game", undefined, undefined); + }), undefined); CountDownComponent._instantiateImpl(undefined, (() => { return new CountDownComponent(); }), { diff --git a/arkui-plugins/test/ut/ui-plugins/decorators/provide-and-consume/provide-to-consume.test.ts b/arkui-plugins/test/ut/ui-plugins/decorators/provide-and-consume/provide-to-consume.test.ts index e8293b085..3068a0779 100644 --- a/arkui-plugins/test/ut/ui-plugins/decorators/provide-and-consume/provide-to-consume.test.ts +++ b/arkui-plugins/test/ut/ui-plugins/decorators/provide-and-consume/provide-to-consume.test.ts @@ -101,8 +101,16 @@ import { IConsumeDecoratedVariable as IConsumeDecoratedVariable } from "arkui.st import { STATE_MGMT_FACTORY as STATE_MGMT_FACTORY } from "arkui.stateManagement.decorator"; +import { ColumnAttribute as ColumnAttribute } from "arkui.component.column"; + import { memo as memo } from "arkui.stateManagement.runtime"; +import { TextAttribute as TextAttribute } from "arkui.component.text"; + +import { TextImpl as TextImpl } from "arkui.component.text"; + +import { ColumnImpl as ColumnImpl } from "arkui.component.column"; + import { CustomComponent as CustomComponent } from "arkui.component.customComponent"; import { Component as Component, Column as Column, Text as Text } from "@ohos.arkui.component"; @@ -142,9 +150,18 @@ function main() {} } @memo() public build() { - Column(undefined, undefined, @memo() (() => { - Text(undefined, \`Child num: \${this.num}\`, undefined, undefined); - Text(undefined, \`Child str: \${this.str}\`, undefined, undefined); + ColumnImpl(@memo() ((instance: ColumnAttribute): void => { + instance.setColumnOptions(undefined).applyAttributesFinish(); + return; + }), @memo() (() => { + TextImpl(@memo() ((instance: TextAttribute): void => { + instance.setTextOptions(\`Child num: \${this.num}\`, undefined).applyAttributesFinish(); + return; + }), undefined); + TextImpl(@memo() ((instance: TextAttribute): void => { + instance.setTextOptions(\`Child str: \${this.str}\`, undefined).applyAttributesFinish(); + return; + }), undefined); })); } @@ -183,9 +200,18 @@ function main() {} } @memo() public build() { - Column(undefined, undefined, @memo() (() => { - Text(undefined, \`Parent num: \${this.num}\`, undefined, undefined); - Text(undefined, \`Parent str: \${this.str}\`, undefined, undefined); + ColumnImpl(@memo() ((instance: ColumnAttribute): void => { + instance.setColumnOptions(undefined).applyAttributesFinish(); + return; + }), @memo() (() => { + TextImpl(@memo() ((instance: TextAttribute): void => { + instance.setTextOptions(\`Parent num: \${this.num}\`, undefined).applyAttributesFinish(); + return; + }), undefined); + TextImpl(@memo() ((instance: TextAttribute): void => { + instance.setTextOptions(\`Parent str: \${this.str}\`, undefined).applyAttributesFinish(); + return; + }), undefined); Child._instantiateImpl(undefined, (() => { return new Child(); }), undefined, undefined, undefined); diff --git a/arkui-plugins/test/ut/ui-plugins/decorators/provider-and-consumer/provider-to-consumer.test.ts b/arkui-plugins/test/ut/ui-plugins/decorators/provider-and-consumer/provider-to-consumer.test.ts index d6e40550d..1f7120e28 100644 --- a/arkui-plugins/test/ut/ui-plugins/decorators/provider-and-consumer/provider-to-consumer.test.ts +++ b/arkui-plugins/test/ut/ui-plugins/decorators/provider-and-consumer/provider-to-consumer.test.ts @@ -40,14 +40,26 @@ const parsedTransform: Plugins = { const expectedCheckedScript: string = ` import { IConsumerDecoratedVariable as IConsumerDecoratedVariable } from "arkui.stateManagement.decorator"; +import { DividerAttribute as DividerAttribute } from "arkui.component.divider"; + +import { DividerImpl as DividerImpl } from "arkui.component.divider"; + import { TextAttribute as TextAttribute } from "arkui.component.text"; +import { TextImpl as TextImpl } from "arkui.component.text"; + import { IProviderDecoratedVariable as IProviderDecoratedVariable } from "arkui.stateManagement.decorator"; +import { ColumnAttribute as ColumnAttribute } from "arkui.component.column"; + import { memo as memo } from "arkui.stateManagement.runtime"; import { ButtonAttribute as ButtonAttribute } from "arkui.component.button"; +import { ButtonImpl as ButtonImpl } from "arkui.component.button"; + +import { ColumnImpl as ColumnImpl } from "arkui.component.column"; + import { IObservedObject as IObservedObject } from "arkui.stateManagement.decorator"; import { UIUtils as UIUtils } from "arkui.stateManagement.utils"; @@ -154,28 +166,31 @@ function main() {} } @memo() public build() { - Column(undefined, undefined, @memo() (() => { + ColumnImpl(@memo() ((instance: ColumnAttribute): void => { + instance.setColumnOptions(undefined).applyAttributesFinish(); + return; + }), @memo() (() => { Child._instantiateImpl(undefined, (() => { return new Child(); }), undefined, undefined, undefined); - Button(@memo() ((instance: ButtonAttribute): void => { - instance.onClick(((e) => { + ButtonImpl(@memo() ((instance: ButtonAttribute): void => { + instance.setButtonOptions("add new user", undefined).onClick(((e) => { this.users.push(new User("Molly", 18)); - })); + })).applyAttributesFinish(); return; - }), "add new user", undefined, undefined); - Button(@memo() ((instance: ButtonAttribute): void => { - instance.onClick(((e) => { + }), undefined); + ButtonImpl(@memo() ((instance: ButtonAttribute): void => { + instance.setButtonOptions("age++", undefined).onClick(((e) => { (this.users[0].age++); - })); + })).applyAttributesFinish(); return; - }), "age++", undefined, undefined); - Button(@memo() ((instance: ButtonAttribute): void => { - instance.onClick(((e) => { + }), undefined); + ButtonImpl(@memo() ((instance: ButtonAttribute): void => { + instance.setButtonOptions("change name", undefined).onClick(((e) => { this.users[0].name = "Shelly"; - })); + })).applyAttributesFinish(); return; - }), "change name", undefined, undefined); + }), undefined); })); } @@ -201,20 +216,29 @@ function main() {} } @memo() public build() { - Column(undefined, undefined, @memo() (() => { + ColumnImpl(@memo() ((instance: ColumnAttribute): void => { + instance.setColumnOptions(undefined).applyAttributesFinish(); + return; + }), @memo() (() => { ForEach(((): Array => { return this.users; }), ((item: User) => { - Column(undefined, undefined, @memo() (() => { - Text(@memo() ((instance: TextAttribute): void => { - instance.fontSize(30); + ColumnImpl(@memo() ((instance: ColumnAttribute): void => { + instance.setColumnOptions(undefined).applyAttributesFinish(); + return; + }), @memo() (() => { + TextImpl(@memo() ((instance: TextAttribute): void => { + instance.setTextOptions(\`name: \${item.name}\`, undefined).fontSize(30).applyAttributesFinish(); + return; + }), undefined); + TextImpl(@memo() ((instance: TextAttribute): void => { + instance.setTextOptions(\`age: \${item.age}\`, undefined).fontSize(30).applyAttributesFinish(); return; - }), \`name: \${item.name}\`, undefined, undefined); - Text(@memo() ((instance: TextAttribute): void => { - instance.fontSize(30); + }), undefined); + DividerImpl(@memo() ((instance: DividerAttribute): void => { + instance.setDividerOptions().applyAttributesFinish(); return; - }), \`age: \${item.age}\`, undefined, undefined); - Divider(undefined); + })); })); })); })); diff --git a/arkui-plugins/test/ut/ui-plugins/decorators/resource/resource-in-build.test.ts b/arkui-plugins/test/ut/ui-plugins/decorators/resource/resource-in-build.test.ts index f083b5e91..bb9c849c3 100644 --- a/arkui-plugins/test/ut/ui-plugins/decorators/resource/resource-in-build.test.ts +++ b/arkui-plugins/test/ut/ui-plugins/decorators/resource/resource-in-build.test.ts @@ -40,12 +40,32 @@ const parsedTransform: Plugins = { const expectedScript: string = ` import { _rawfile as _rawfile } from "arkui.component.resources"; +import { ColumnAttribute as ColumnAttribute } from "arkui.component.column"; + import { ImageAnimatorAttribute as ImageAnimatorAttribute } from "arkui.component.imageAnimator"; -import { memo as memo } from "arkui.stateManagement.runtime"; +import { ImageAnimatorImpl as ImageAnimatorImpl } from "arkui.component.imageAnimator"; + +import { SelectAttribute as SelectAttribute } from "arkui.component.select"; + +import { SelectImpl as SelectImpl } from "arkui.component.select"; + +import { TextInputAttribute as TextInputAttribute } from "arkui.component.textInput"; + +import { TextInputImpl as TextInputImpl } from "arkui.component.textInput"; import { ImageAttribute as ImageAttribute } from "arkui.component.image"; +import { ImageImpl as ImageImpl } from "arkui.component.image"; + +import { memo as memo } from "arkui.stateManagement.runtime"; + +import { TextAttribute as TextAttribute } from "arkui.component.text"; + +import { TextImpl as TextImpl } from "arkui.component.text"; + +import { ColumnImpl as ColumnImpl } from "arkui.component.column"; + import { _r as _r } from "arkui.component.resources"; @@ -106,40 +126,61 @@ function main() {} } @memo() public build() { - Column(undefined, undefined, @memo() (() => { - Text(undefined, _r(16777216, 10003, "com.example.mock", "entry"), undefined, undefined); - Image(undefined, _rawfile(0, 30000, "com.example.mock", "entry", "app.mock.txt"), undefined, undefined); - TextInput(undefined, { - text: _r(16777220, 10003, "com.example.mock", "entry"), - }, undefined); - Text(undefined, _r(-1, -1, "com.example.mock", "entry", this.str1), undefined, undefined); - Text(undefined, _r(-1, -1, "com.example.mock", "entry", this.str2), undefined, undefined); - Select(undefined, new Array({ - value: "aaa", - icon: _r(16777223, 20000, "com.example.mock", "entry"), - }, { - value: "bbb", - icon: _r(16777223, 20000, "com.example.mock", "entry"), - }, { - value: "ccc", - icon: _r(16777223, 20000, "com.example.mock", "entry"), - }, { - value: "ddd", - icon: _r(16777223, 20000, "com.example.mock", "entry"), + ColumnImpl(@memo() ((instance: ColumnAttribute): void => { + instance.setColumnOptions(undefined).applyAttributesFinish(); + return; + }), @memo() (() => { + TextImpl(@memo() ((instance: TextAttribute): void => { + instance.setTextOptions(_r(16777216, 10003, "com.example.mock", "entry"), undefined).applyAttributesFinish(); + return; }), undefined); - Image(@memo() ((instance: ImageAttribute): void => { - instance.margin(({ + ImageImpl(@memo() ((instance: ImageAttribute): void => { + instance.setImageOptions(_rawfile(0, 30000, "com.example.mock", "entry", "app.mock.txt"), undefined).applyAttributesFinish(); + return; + }), undefined); + TextInputImpl(@memo() ((instance: TextInputAttribute): void => { + instance.setTextInputOptions({ + text: _r(16777220, 10003, "com.example.mock", "entry"), + }).applyAttributesFinish(); + return; + }), undefined); + TextImpl(@memo() ((instance: TextAttribute): void => { + instance.setTextOptions(_r(-1, -1, "com.example.mock", "entry", this.str1), undefined).applyAttributesFinish(); + return; + }), undefined); + TextImpl(@memo() ((instance: TextAttribute): void => { + instance.setTextOptions(_r(-1, -1, "com.example.mock", "entry", this.str2), undefined).applyAttributesFinish(); + return; + }), undefined); + SelectImpl(@memo() ((instance: SelectAttribute): void => { + instance.setSelectOptions(new Array({ + value: "aaa", + icon: _r(16777223, 20000, "com.example.mock", "entry"), + }, { + value: "bbb", + icon: _r(16777223, 20000, "com.example.mock", "entry"), + }, { + value: "ccc", + icon: _r(16777223, 20000, "com.example.mock", "entry"), + }, { + value: "ddd", + icon: _r(16777223, 20000, "com.example.mock", "entry"), + })).applyAttributesFinish(); + return; + }), undefined); + ImageImpl(@memo() ((instance: ImageAttribute): void => { + instance.setImageOptions(_r(16777217, 20000, "com.example.mock", "entry"), undefined).margin(({ top: _r(16777222, 10002, "com.example.mock", "entry"), bottom: _r(16777222, 10002, "com.example.mock", "entry"), - } as Margin)); + } as Margin)).applyAttributesFinish(); return; - }), _r(16777217, 20000, "com.example.mock", "entry"), undefined, undefined); - ImageAnimator(@memo() ((instance: ImageAnimatorAttribute): void => { - instance.images([{ + }), undefined); + ImageAnimatorImpl(@memo() ((instance: ImageAnimatorAttribute): void => { + instance.setImageAnimatorOptions().images([{ src: _r(16777217, 20000, "com.example.mock", "entry"), }, { src: _r(16777225, 20000, "com.example.mock", "entry"), - }]); + }]).applyAttributesFinish(); return; })); })); diff --git a/arkui-plugins/test/ut/ui-plugins/decorators/resource/resource-in-property.test.ts b/arkui-plugins/test/ut/ui-plugins/decorators/resource/resource-in-property.test.ts index db246e582..65bfd1ed9 100644 --- a/arkui-plugins/test/ut/ui-plugins/decorators/resource/resource-in-property.test.ts +++ b/arkui-plugins/test/ut/ui-plugins/decorators/resource/resource-in-property.test.ts @@ -38,7 +38,13 @@ const parsedTransform: Plugins = { }; const expectedScript: string = ` +import { ColumnAttribute as ColumnAttribute } from "arkui.component.column"; +import { ImageAttribute as ImageAttribute } from "arkui.component.image"; +import { ImageImpl as ImageImpl } from "arkui.component.image"; import { memo as memo } from "arkui.stateManagement.runtime"; +import { TextAttribute as TextAttribute } from "arkui.component.text"; +import { TextImpl as TextImpl } from "arkui.component.text"; +import { ColumnImpl as ColumnImpl } from "arkui.component.column"; import { _rawfile as _rawfile } from "arkui.component.resources"; import { _r as _r } from "arkui.component.resources"; import { CustomComponent as CustomComponent } from "arkui.component.customComponent"; @@ -73,10 +79,22 @@ i = _r(16777216, 10003, "com.example.mock", "entry"); } @memo() public build() { - Column(undefined, undefined, @memo() (() => { - Text(undefined, this.str, undefined, undefined); - Text(undefined, i, undefined, undefined); - Image(undefined, this.icon, undefined, undefined); + ColumnImpl(@memo() ((instance: ColumnAttribute): void => { + instance.setColumnOptions(undefined).applyAttributesFinish(); + return; + }), @memo() (() => { + TextImpl(@memo() ((instance: TextAttribute): void => { + instance.setTextOptions(this.str, undefined).applyAttributesFinish(); + return; + }), undefined); + TextImpl(@memo() ((instance: TextAttribute): void => { + instance.setTextOptions(i, undefined).applyAttributesFinish(); + return; + }), undefined); + ImageImpl(@memo() ((instance: ImageAttribute): void => { + instance.setImageOptions(this.icon, undefined).applyAttributesFinish(); + return; + }), undefined); })); } private constructor() {} diff --git a/arkui-plugins/test/ut/ui-plugins/decorators/reusable/reusable-complex.test.ts b/arkui-plugins/test/ut/ui-plugins/decorators/reusable/reusable-complex.test.ts index f741b2dea..7494e3a3b 100644 --- a/arkui-plugins/test/ut/ui-plugins/decorators/reusable/reusable-complex.test.ts +++ b/arkui-plugins/test/ut/ui-plugins/decorators/reusable/reusable-complex.test.ts @@ -41,19 +41,25 @@ const expectedScript: string = ` import { TextAttribute as TextAttribute } from "arkui.component.text"; +import { TextImpl as TextImpl } from "arkui.component.text"; + import { STATE_MGMT_FACTORY as STATE_MGMT_FACTORY } from "arkui.stateManagement.decorator"; import { IStateDecoratedVariable as IStateDecoratedVariable } from "arkui.stateManagement.decorator"; +import { ColumnAttribute as ColumnAttribute } from "arkui.component.column"; + import { ConditionScope as ConditionScope } from "arkui.component.builder"; import { ConditionBranch as ConditionBranch } from "arkui.component.builder"; +import { memo as memo } from "arkui.stateManagement.runtime"; + import { ButtonAttribute as ButtonAttribute } from "arkui.component.button"; -import { memo as memo } from "arkui.stateManagement.runtime"; +import { ButtonImpl as ButtonImpl } from "arkui.component.button"; -import { ColumnAttribute as ColumnAttribute } from "arkui.component.column"; +import { ColumnImpl as ColumnImpl } from "arkui.component.column"; import { NavInterface as NavInterface } from "arkui.UserView"; @@ -61,7 +67,6 @@ import { PageLifeCycle as PageLifeCycle } from "arkui.component.customComponent" import { EntryPoint as EntryPoint } from "arkui.UserView"; - import { CustomComponent as CustomComponent } from "arkui.component.customComponent"; import { Component as Component, Entry as Entry, Reusable as Reusable, Column as Column, Text as Text, Button as Button, ClickEvent as ClickEvent, FontWeight as FontWeight } from "@ohos.arkui.component"; @@ -106,16 +111,16 @@ class Message { } @memo() public build() { - Column(@memo() ((instance: ColumnAttribute): void => { - instance.height("100%").width("100%"); + ColumnImpl(@memo() ((instance: ColumnAttribute): void => { + instance.setColumnOptions(undefined).height("100%").width("100%").applyAttributesFinish(); return; - }), undefined, @memo() (() => { - Button(@memo() ((instance: ButtonAttribute): void => { - instance.fontSize(30).fontWeight(FontWeight.Bold).onClick(((e: ClickEvent) => { + }), @memo() (() => { + ButtonImpl(@memo() ((instance: ButtonAttribute): void => { + instance.setButtonOptions("Hello", undefined).fontSize(30).fontWeight(FontWeight.Bold).onClick(((e: ClickEvent) => { this.display = !(this.display); - })); + })).applyAttributesFinish(); return; - }), "Hello", undefined, undefined); + }), undefined); ConditionScope(@memo() (() => { if (this.display) { ConditionBranch(@memo() (() => { @@ -164,14 +169,14 @@ class Message { } @memo() public build() { - Column(@memo() ((instance: ColumnAttribute): void => { - instance.borderWidth(1).height(100); + ColumnImpl(@memo() ((instance: ColumnAttribute): void => { + instance.setColumnOptions(undefined).borderWidth(1).height(100).applyAttributesFinish(); return; - }), undefined, @memo() (() => { - Text(@memo() ((instance: TextAttribute): void => { - instance.fontSize(30); + }), @memo() (() => { + TextImpl(@memo() ((instance: TextAttribute): void => { + instance.setTextOptions(this.message.value, undefined).fontSize(30).applyAttributesFinish(); return; - }), this.message.value, undefined, undefined); + }), undefined); })); } diff --git a/arkui-plugins/test/ut/ui-plugins/decorators/state/state-to-state.test.ts b/arkui-plugins/test/ut/ui-plugins/decorators/state/state-to-state.test.ts index 09310a680..c6dc2c966 100644 --- a/arkui-plugins/test/ut/ui-plugins/decorators/state/state-to-state.test.ts +++ b/arkui-plugins/test/ut/ui-plugins/decorators/state/state-to-state.test.ts @@ -38,13 +38,19 @@ const parsedTransform: Plugins = { }; const expectedScript: string = ` +import { TextAttribute as TextAttribute } from "arkui.component.text"; + +import { TextImpl as TextImpl } from "arkui.component.text"; import { STATE_MGMT_FACTORY as STATE_MGMT_FACTORY } from "arkui.stateManagement.decorator"; import { IStateDecoratedVariable as IStateDecoratedVariable } from "arkui.stateManagement.decorator"; +import { ColumnAttribute as ColumnAttribute } from "arkui.component.column"; + import { memo as memo } from "arkui.stateManagement.runtime"; +import { ColumnImpl as ColumnImpl } from "arkui.component.column"; import { CustomComponent as CustomComponent } from "arkui.component.customComponent"; @@ -84,7 +90,10 @@ class Per { } @memo() public build() { - Column(undefined, undefined, @memo() (() => { + ColumnImpl(@memo() ((instance: ColumnAttribute): void => { + instance.setColumnOptions(undefined).applyAttributesFinish(); + return; + }), @memo() (() => { Child._instantiateImpl(undefined, (() => { return new Child(); }), { @@ -116,7 +125,10 @@ class Per { } @memo() public build() { - Text(undefined, this.childVar1.str, undefined, undefined); + TextImpl(@memo() ((instance: TextAttribute): void => { + instance.setTextOptions(this.childVar1.str, undefined).applyAttributesFinish(); + return; + }), undefined); } private constructor() {} diff --git a/arkui-plugins/test/ut/ui-plugins/decorators/storagelink/storagelink-appstorage.test.ts b/arkui-plugins/test/ut/ui-plugins/decorators/storagelink/storagelink-appstorage.test.ts index 86d9753b6..ab0fc18b1 100644 --- a/arkui-plugins/test/ut/ui-plugins/decorators/storagelink/storagelink-appstorage.test.ts +++ b/arkui-plugins/test/ut/ui-plugins/decorators/storagelink/storagelink-appstorage.test.ts @@ -40,8 +40,11 @@ const pluginTester = new PluginTester('test storagelink with appstorage', buildC const expectedScript: string = ` import { STATE_MGMT_FACTORY as STATE_MGMT_FACTORY } from "arkui.stateManagement.decorator"; import { IStorageLinkDecoratedVariable as IStorageLinkDecoratedVariable } from "arkui.stateManagement.decorator"; +import { ColumnAttribute as ColumnAttribute } from "arkui.component.column"; import { memo as memo } from "arkui.stateManagement.runtime"; import { TextAttribute as TextAttribute } from "arkui.component.text"; +import { TextImpl as TextImpl } from "arkui.component.text"; +import { ColumnImpl as ColumnImpl } from "arkui.component.column"; import { NavInterface as NavInterface } from "arkui.UserView"; import { PageLifeCycle as PageLifeCycle } from "arkui.component.customComponent"; import { EntryPoint as EntryPoint } from "arkui.UserView"; @@ -98,19 +101,22 @@ class Data { } @memo() public build() { - Column(undefined, undefined, @memo() (() => { - Text(@memo() ((instance: TextAttribute): void => { - instance.onClick(((e: ClickEvent) => { + ColumnImpl(@memo() ((instance: ColumnAttribute): void => { + instance.setColumnOptions(undefined).applyAttributesFinish(); + return; + }), @memo() (() => { + TextImpl(@memo() ((instance: TextAttribute): void => { + instance.setTextOptions(\`From AppStorage \${this.storageLink}\`, undefined).onClick(((e: ClickEvent) => { this.storageLink += 1; - })); + })).applyAttributesFinish(); return; - }), \`From AppStorage \${this.storageLink}\`, undefined, undefined); - Text(@memo() ((instance: TextAttribute): void => { - instance.onClick(((e: ClickEvent) => { + }), undefined); + TextImpl(@memo() ((instance: TextAttribute): void => { + instance.setTextOptions(\`From AppStorage \${this.storageLinkObject.code}\`, undefined).onClick(((e: ClickEvent) => { this.storageLinkObject.code += 1; - })); + })).applyAttributesFinish(); return; - }), \`From AppStorage \${this.storageLinkObject.code}\`, undefined, undefined); + }), undefined); })); } diff --git a/arkui-plugins/test/ut/ui-plugins/decorators/storageprop/storageprop-appstorage.test.ts b/arkui-plugins/test/ut/ui-plugins/decorators/storageprop/storageprop-appstorage.test.ts index 9563b1770..3a02f836f 100644 --- a/arkui-plugins/test/ut/ui-plugins/decorators/storageprop/storageprop-appstorage.test.ts +++ b/arkui-plugins/test/ut/ui-plugins/decorators/storageprop/storageprop-appstorage.test.ts @@ -42,10 +42,16 @@ import { STATE_MGMT_FACTORY as STATE_MGMT_FACTORY } from "arkui.stateManagement. import { IStoragePropRefDecoratedVariable as IStoragePropRefDecoratedVariable } from "arkui.stateManagement.decorator"; +import { ColumnAttribute as ColumnAttribute } from "arkui.component.column"; + import { memo as memo } from "arkui.stateManagement.runtime"; import { TextAttribute as TextAttribute } from "arkui.component.text"; +import { TextImpl as TextImpl } from "arkui.component.text"; + +import { ColumnImpl as ColumnImpl } from "arkui.component.column"; + import { NavInterface as NavInterface } from "arkui.UserView"; import { PageLifeCycle as PageLifeCycle } from "arkui.component.customComponent"; @@ -110,19 +116,22 @@ class Data { } @memo() public build() { - Column(undefined, undefined, @memo() (() => { - Text(@memo() ((instance: TextAttribute): void => { - instance.onClick(((e: ClickEvent) => { + ColumnImpl(@memo() ((instance: ColumnAttribute): void => { + instance.setColumnOptions(undefined).applyAttributesFinish(); + return; + }), @memo() (() => { + TextImpl(@memo() ((instance: TextAttribute): void => { + instance.setTextOptions(\`From AppStorage \${this.storageProp}\`, undefined).onClick(((e: ClickEvent) => { this.storageProp += 1; - })); + })).applyAttributesFinish(); return; - }), \`From AppStorage \${this.storageProp}\`, undefined, undefined); - Text(@memo() ((instance: TextAttribute): void => { - instance.onClick(((e: ClickEvent) => { + }), undefined); + TextImpl(@memo() ((instance: TextAttribute): void => { + instance.setTextOptions(\`From AppStorage \${this.storagePropObject.code}\`, undefined).onClick(((e: ClickEvent) => { this.storagePropObject.code += 1; - })); + })).applyAttributesFinish(); return; - }), \`From AppStorage \${this.storagePropObject.code}\`, undefined, undefined); + }), undefined); })); } diff --git a/arkui-plugins/test/ut/ui-plugins/decorators/watch/watch-basic.test.ts b/arkui-plugins/test/ut/ui-plugins/decorators/watch/watch-basic.test.ts index f54b66794..98cde3edd 100644 --- a/arkui-plugins/test/ut/ui-plugins/decorators/watch/watch-basic.test.ts +++ b/arkui-plugins/test/ut/ui-plugins/decorators/watch/watch-basic.test.ts @@ -56,8 +56,12 @@ import { IPropDecoratedVariable as IPropDecoratedVariable } from "arkui.stateMan import { IStateDecoratedVariable as IStateDecoratedVariable } from "arkui.stateManagement.decorator"; +import { ColumnAttribute as ColumnAttribute } from "arkui.component.column"; + import { memo as memo } from "arkui.stateManagement.runtime"; +import { ColumnImpl as ColumnImpl } from "arkui.component.column"; + import { IObservedObject as IObservedObject } from "arkui.stateManagement.decorator"; import { OBSERVE as OBSERVE } from "arkui.stateManagement.decorator"; @@ -269,7 +273,10 @@ __EntryWrapper.RegisterNamedRouter("", new __EntryWrapper(), ({ public ProvideOnChange(propName: string) {} @memo() public build() { - Column(undefined, undefined, @memo() (() => { + ColumnImpl(@memo() ((instance: ColumnAttribute): void => { + instance.setColumnOptions(undefined).applyAttributesFinish(); + return; + }), @memo() (() => { Child._instantiateImpl(undefined, (() => { return new Child(); }), undefined, undefined, undefined); diff --git a/arkui-plugins/test/ut/ui-plugins/double-dollar/double-dollar-griditem.test.ts b/arkui-plugins/test/ut/ui-plugins/double-dollar/double-dollar-griditem.test.ts index 216eb9086..dd76d40ea 100644 --- a/arkui-plugins/test/ut/ui-plugins/double-dollar/double-dollar-griditem.test.ts +++ b/arkui-plugins/test/ut/ui-plugins/double-dollar/double-dollar-griditem.test.ts @@ -42,12 +42,26 @@ import { STATE_MGMT_FACTORY as STATE_MGMT_FACTORY } from "arkui.stateManagement. import { IStateDecoratedVariable as IStateDecoratedVariable } from "arkui.stateManagement.decorator"; -import { memo as memo } from "arkui.stateManagement.runtime"; +import { ColumnAttribute as ColumnAttribute } from "arkui.component.column"; + +import { GridAttribute as GridAttribute } from "arkui.component.grid"; import { GridItemAttribute as GridItemAttribute } from "arkui.component.gridItem"; +import { memo as memo } from "arkui.stateManagement.runtime"; + +import { TextAttribute as TextAttribute } from "arkui.component.text"; + +import { TextImpl as TextImpl } from "arkui.component.text"; + import { Bindable as Bindable } from "arkui.component.common"; +import { GridItemImpl as GridItemImpl } from "arkui.component.gridItem"; + +import { GridImpl as GridImpl } from "arkui.component.grid"; + +import { ColumnImpl as ColumnImpl } from "arkui.component.column"; + import { NavInterface as NavInterface } from "arkui.UserView"; import { PageLifeCycle as PageLifeCycle } from "arkui.component.customComponent"; @@ -93,29 +107,41 @@ __EntryWrapper.RegisterNamedRouter("", new __EntryWrapper(), ({ } @memo() public build() { - Column(undefined, undefined, @memo() (() => { - Grid(undefined, undefined, undefined, @memo() (() => { - GridItem(@memo() ((instance: GridItemAttribute): void => { - instance.selected(({ + ColumnImpl(@memo() ((instance: ColumnAttribute): void => { + instance.setColumnOptions(undefined).applyAttributesFinish(); + return; + }), @memo() (() => { + GridImpl(@memo() ((instance: GridAttribute): void => { + instance.setGridOptions(undefined, undefined).applyAttributesFinish(); + return; + }), @memo() (() => { + GridItemImpl(@memo() ((instance: GridItemAttribute): void => { + instance.setGridItemOptions(undefined).selected(({ value: this.boo, onChange: ((value: boolean) => { this.boo = value; }), - } as Bindable)); + } as Bindable)).applyAttributesFinish(); return; - }), undefined, @memo() (() => { - Text(undefined, "nihao", undefined, undefined); + }), @memo() (() => { + TextImpl(@memo() ((instance: TextAttribute): void => { + instance.setTextOptions("nihao", undefined).applyAttributesFinish(); + return; + }), undefined); })); - GridItem(@memo() ((instance: GridItemAttribute): void => { - instance.selected(({ + GridItemImpl(@memo() ((instance: GridItemAttribute): void => { + instance.setGridItemOptions(undefined).selected(({ value: c, onChange: ((value: boolean) => { c = value; }), - } as Bindable)); + } as Bindable)).applyAttributesFinish(); return; - }), undefined, @memo() (() => { - Text(undefined, "nihao", undefined, undefined); + }), @memo() (() => { + TextImpl(@memo() ((instance: TextAttribute): void => { + instance.setTextOptions("nihao", undefined).applyAttributesFinish(); + return; + }), undefined); })); })); })); diff --git a/arkui-plugins/test/ut/ui-plugins/double-dollar/double-dollar-toggle.test.ts b/arkui-plugins/test/ut/ui-plugins/double-dollar/double-dollar-toggle.test.ts index 8387fe7ae..cd9f49fbe 100644 --- a/arkui-plugins/test/ut/ui-plugins/double-dollar/double-dollar-toggle.test.ts +++ b/arkui-plugins/test/ut/ui-plugins/double-dollar/double-dollar-toggle.test.ts @@ -39,17 +39,15 @@ const parsedTransform: Plugins = { const expectedScript: string = ` import { STATE_MGMT_FACTORY as STATE_MGMT_FACTORY } from "arkui.stateManagement.decorator"; - import { IStateDecoratedVariable as IStateDecoratedVariable } from "arkui.stateManagement.decorator"; - +import { ColumnAttribute as ColumnAttribute } from "arkui.component.column"; import { memo as memo } from "arkui.stateManagement.runtime"; - +import { ToggleAttribute as ToggleAttribute } from "arkui.component.toggle"; import { Bindable as Bindable } from "arkui.component.common"; - +import { ToggleImpl as ToggleImpl } from "arkui.component.toggle"; +import { ColumnImpl as ColumnImpl } from "arkui.component.column"; import { CustomComponent as CustomComponent } from "arkui.component.customComponent"; - import { Text as Text, Column as Column, Component as Component, $$ as $$, Toggle as Toggle, ToggleType as ToggleType } from "@ohos.arkui.component"; - import { State as State } from "@ohos.arkui.stateManagement"; let c: Array; @@ -96,34 +94,46 @@ class BooleanClass { } @memo() public build() { - Column(undefined, undefined, @memo() (() => { - Toggle(undefined, { - type: ToggleType.Checkbox, - isOn: ({ - value: this.boo[0], - onChange: ((value: boolean) => { - this.boo[0] = value; - }), - } as Bindable), - }, undefined); - Toggle(undefined, { - type: ToggleType.Checkbox, - isOn: ({ - value: this.booClass.isOn, - onChange: ((value: boolean) => { - this.booClass.isOn = value; - }), - } as Bindable), - }, undefined); - Toggle(undefined, { - type: ToggleType.Checkbox, - isOn: ({ - value: c[1], - onChange: ((value: boolean) => { - c[1] = value; - }), - } as Bindable), - }, undefined); + ColumnImpl(@memo() ((instance: ColumnAttribute): void => { + instance.setColumnOptions(undefined).applyAttributesFinish(); + return; + }), @memo() (() => { + ToggleImpl(@memo() ((instance: ToggleAttribute): void => { + instance.setToggleOptions({ + type: ToggleType.Checkbox, + isOn: ({ + value: this.boo[0], + onChange: ((value: boolean) => { + this.boo[0] = value; + }), + } as Bindable), + }).applyAttributesFinish(); + return; + }), undefined); + ToggleImpl(@memo() ((instance: ToggleAttribute): void => { + instance.setToggleOptions({ + type: ToggleType.Checkbox, + isOn: ({ + value: this.booClass.isOn, + onChange: ((value: boolean) => { + this.booClass.isOn = value; + }), + } as Bindable), + }).applyAttributesFinish(); + return; + }), undefined); + ToggleImpl(@memo() ((instance: ToggleAttribute): void => { + instance.setToggleOptions({ + type: ToggleType.Checkbox, + isOn: ({ + value: c[1], + onChange: ((value: boolean) => { + c[1] = value; + }), + } as Bindable), + }).applyAttributesFinish(); + return; + }), undefined); })); } diff --git a/arkui-plugins/test/ut/ui-plugins/imports/import-struct.test.ts b/arkui-plugins/test/ut/ui-plugins/imports/import-struct.test.ts index 79e3668c5..90fdce6cf 100644 --- a/arkui-plugins/test/ut/ui-plugins/imports/import-struct.test.ts +++ b/arkui-plugins/test/ut/ui-plugins/imports/import-struct.test.ts @@ -69,6 +69,10 @@ import { SimpleStruct as SimpleStruct } from "./utils/simple-struct"; const expectedCheckedScript: string = ` import { memo as memo } from "arkui.stateManagement.runtime"; +import { TextAttribute as TextAttribute } from "arkui.component.text"; + +import { TextImpl as TextImpl } from "arkui.component.text"; + import { CustomComponent as CustomComponent } from "arkui.component.customComponent"; import { Component as Component, Text as Text } from "@ohos.arkui.component"; @@ -96,7 +100,10 @@ function main() {} SimpleStruct._instantiateImpl(undefined, (() => { return new SimpleStruct(); }), undefined, undefined, @memo() (() => { - Text(undefined, "a", undefined, undefined); + TextImpl(@memo() ((instance: TextAttribute): void => { + instance.setTextOptions("a", undefined).applyAttributesFinish(); + return; + }), undefined); })); } diff --git a/arkui-plugins/test/ut/ui-plugins/imports/kit-import.test.ts b/arkui-plugins/test/ut/ui-plugins/imports/kit-import.test.ts index 0147ea48f..3ddcee6e2 100644 --- a/arkui-plugins/test/ut/ui-plugins/imports/kit-import.test.ts +++ b/arkui-plugins/test/ut/ui-plugins/imports/kit-import.test.ts @@ -105,12 +105,20 @@ import { STATE_MGMT_FACTORY as STATE_MGMT_FACTORY } from "arkui.stateManagement. import { IStateDecoratedVariable as IStateDecoratedVariable } from "arkui.stateManagement.decorator"; +import { ColumnAttribute as ColumnAttribute } from "arkui.component.column"; + import { TextAttribute as TextAttribute } from "arkui.component.text"; +import { TextImpl as TextImpl } from "arkui.component.text"; + import { memo as memo } from "arkui.stateManagement.runtime"; import { ButtonAttribute as ButtonAttribute } from "arkui.component.button"; +import { ButtonImpl as ButtonImpl } from "arkui.component.button"; + +import { ColumnImpl as ColumnImpl } from "arkui.component.column"; + import { NavInterface as NavInterface } from "arkui.UserView"; import { PageLifeCycle as PageLifeCycle } from "arkui.component.customComponent"; @@ -174,15 +182,18 @@ __EntryWrapper.RegisterNamedRouter("", new __EntryWrapper(), ({ } @memo() public build() { - Column(undefined, undefined, @memo() (() => { - Button(@memo() ((instance: ButtonAttribute): void => { - instance.onClick(((e: ClickEvent) => {})); + ColumnImpl(@memo() ((instance: ColumnAttribute): void => { + instance.setColumnOptions(undefined).applyAttributesFinish(); + return; + }), @memo() (() => { + ButtonImpl(@memo() ((instance: ButtonAttribute): void => { + instance.setButtonOptions("button", undefined).onClick(((e: ClickEvent) => {})).applyAttributesFinish(); return; - }), "button", undefined, undefined); - Text(@memo() ((instance: TextAttribute): void => { - instance.fontSize(20); + }), undefined); + TextImpl(@memo() ((instance: TextAttribute): void => { + instance.setTextOptions("text", undefined).fontSize(20).applyAttributesFinish(); return; - }), "text", undefined, undefined); + }), undefined); })); } diff --git a/arkui-plugins/test/ut/ui-plugins/wrap-builder/builder-in-generic.test.ts b/arkui-plugins/test/ut/ui-plugins/wrap-builder/builder-in-generic.test.ts index 4f7fc9dc5..4a7ad66d9 100644 --- a/arkui-plugins/test/ut/ui-plugins/wrap-builder/builder-in-generic.test.ts +++ b/arkui-plugins/test/ut/ui-plugins/wrap-builder/builder-in-generic.test.ts @@ -41,8 +41,10 @@ const expectedUIScript: string = ` import { STATE_MGMT_FACTORY as STATE_MGMT_FACTORY } from \"arkui.stateManagement.decorator\"; import { IStateDecoratedVariable as IStateDecoratedVariable } from \"arkui.stateManagement.decorator\"; import { RowAttribute as RowAttribute } from \"arkui.component.row\"; +import { RowImpl as RowImpl } from "arkui.component.row"; import { memo as memo } from \"arkui.stateManagement.runtime\"; import { TextAttribute as TextAttribute } from \"arkui.component.text\"; +import { TextImpl as TextImpl } from "arkui.component.text"; import { NavInterface as NavInterface } from \"arkui.UserView\"; import { PageLifeCycle as PageLifeCycle } from \"arkui.component.customComponent\"; import { EntryPoint as EntryPoint } from \"arkui.UserView\"; @@ -62,16 +64,16 @@ __EntryWrapper.RegisterNamedRouter(\"\", new __EntryWrapper(), ({ integratedHsp: \"false\", } as NavInterface)); @memo() function MyBuilder(value: string, size: number) { - Text(@memo() ((instance: TextAttribute): void => { - instance.fontSize(size); + TextImpl(@memo() ((instance: TextAttribute): void => { + instance.setTextOptions(value, undefined).fontSize(size).applyAttributesFinish(); return; - }), value, undefined, undefined); + }), undefined); } @memo() function YourBuilder(value: string, size: number) { - Text(@memo() ((instance: TextAttribute): void => { - instance.fontSize(size).fontColor(Color.Pink); + TextImpl(@memo() ((instance: TextAttribute): void => { + instance.setTextOptions(value, undefined).fontSize(size).fontColor(Color.Pink).applyAttributesFinish(); return; - }), value, undefined, undefined); + }), undefined); } @Entry({useSharedStorage:false,storage:\"\",routeName:\"\"}) @Component() final struct Index extends CustomComponent implements PageLifeCycle { public __initializeStruct(initializers: (__Options_Index | undefined), @memo() content: ((()=> void) | undefined)): void { @@ -87,10 +89,10 @@ __EntryWrapper.RegisterNamedRouter(\"\", new __EntryWrapper(), ({ this.__backing_message!.set(value); } @memo() public build() { - Row(@memo() ((instance: RowAttribute): void => { - instance.height(\"100%\"); + RowImpl(@memo() ((instance: RowAttribute): void => { + instance.setRowOptions(undefined).height(\"100%\").applyAttributesFinish(); return; - }), undefined, @memo() (() => { + }), @memo() (() => { globalBuilder(this.message, 50); ForEach(((): Array<@Builder() ((value: string, size: number)=> void)> => { return builderArr; @@ -126,8 +128,10 @@ import { __memo_context_type as __memo_context_type, __memo_id_type as __memo_id import { STATE_MGMT_FACTORY as STATE_MGMT_FACTORY } from \"arkui.stateManagement.decorator\"; import { IStateDecoratedVariable as IStateDecoratedVariable } from \"arkui.stateManagement.decorator\"; import { RowAttribute as RowAttribute } from \"arkui.component.row\"; +import { RowImpl as RowImpl } from "arkui.component.row"; import { memo as memo } from \"arkui.stateManagement.runtime\"; import { TextAttribute as TextAttribute } from \"arkui.component.text\"; +import { TextImpl as TextImpl } from "arkui.component.text"; import { NavInterface as NavInterface } from \"arkui.UserView\"; import { PageLifeCycle as PageLifeCycle } from \"arkui.component.customComponent\"; import { EntryPoint as EntryPoint } from \"arkui.UserView\"; @@ -153,19 +157,19 @@ __EntryWrapper.RegisterNamedRouter(\"\", new __EntryWrapper(), ({ __memo_scope.cached; return; } - Text(__memo_context, ((__memo_id) + ()), @memo() ((__memo_context: __memo_context_type, __memo_id: __memo_id_type, instance: TextAttribute): void => { + TextImpl(__memo_context, ((__memo_id) + ()), @memo() ((__memo_context: __memo_context_type, __memo_id: __memo_id_type, instance: TextAttribute): void => { const __memo_scope = __memo_context.scope(((__memo_id) + ()), 1); const __memo_parameter_instance = __memo_scope.param(0, instance); if (__memo_scope.unchanged) { __memo_scope.cached; return; } - __memo_parameter_instance.value.fontSize(__memo_parameter_size.value); + __memo_parameter_instance.value.setTextOptions(__memo_parameter_value.value, undefined).fontSize(__memo_parameter_size.value).applyAttributesFinish(); { __memo_scope.recache(); return; } - }), __memo_parameter_value.value, undefined, undefined); + }), undefined); { __memo_scope.recache(); return; @@ -178,19 +182,19 @@ __EntryWrapper.RegisterNamedRouter(\"\", new __EntryWrapper(), ({ __memo_scope.cached; return; } - Text(__memo_context, ((__memo_id) + ()), @memo() ((__memo_context: __memo_context_type, __memo_id: __memo_id_type, instance: TextAttribute): void => { + TextImpl(__memo_context, ((__memo_id) + ()), @memo() ((__memo_context: __memo_context_type, __memo_id: __memo_id_type, instance: TextAttribute): void => { const __memo_scope = __memo_context.scope(((__memo_id) + ()), 1); const __memo_parameter_instance = __memo_scope.param(0, instance); if (__memo_scope.unchanged) { __memo_scope.cached; return; } - __memo_parameter_instance.value.fontSize(__memo_parameter_size.value).fontColor(Color.Pink); + __memo_parameter_instance.value.setTextOptions(__memo_parameter_value.value, undefined).fontSize(__memo_parameter_size.value).fontColor(Color.Pink).applyAttributesFinish(); { __memo_scope.recache(); return; } - }), __memo_parameter_value.value, undefined, undefined); + }), undefined); { __memo_scope.recache(); return; @@ -215,19 +219,19 @@ __EntryWrapper.RegisterNamedRouter(\"\", new __EntryWrapper(), ({ __memo_scope.cached; return; } - Row(__memo_context, ((__memo_id) + ()), @memo() ((__memo_context: __memo_context_type, __memo_id: __memo_id_type, instance: RowAttribute): void => { + RowImpl(__memo_context, ((__memo_id) + ()), @memo() ((__memo_context: __memo_context_type, __memo_id: __memo_id_type, instance: RowAttribute): void => { const __memo_scope = __memo_context.scope(((__memo_id) + ()), 1); const __memo_parameter_instance = __memo_scope.param(0, instance); if (__memo_scope.unchanged) { __memo_scope.cached; return; } - __memo_parameter_instance.value.height(\"100%\"); + __memo_parameter_instance.value.setRowOptions(undefined).height("100%").applyAttributesFinish(); { __memo_scope.recache(); return; } - }), undefined, @memo() ((__memo_context: __memo_context_type, __memo_id: __memo_id_type) => { + }), @memo() ((__memo_context: __memo_context_type, __memo_id: __memo_id_type) => { const __memo_scope = __memo_context.scope(((__memo_id) + ()), 0); if (__memo_scope.unchanged) { __memo_scope.cached; diff --git a/arkui-plugins/test/ut/ui-plugins/wrap-builder/init-with-builder.test.ts b/arkui-plugins/test/ut/ui-plugins/wrap-builder/init-with-builder.test.ts index c3443baeb..300815069 100644 --- a/arkui-plugins/test/ut/ui-plugins/wrap-builder/init-with-builder.test.ts +++ b/arkui-plugins/test/ut/ui-plugins/wrap-builder/init-with-builder.test.ts @@ -38,8 +38,11 @@ const parsedTransform: Plugins = { }; const expectedUIScript: string = ` +import { ColumnAttribute as ColumnAttribute } from "arkui.component.column"; +import { ColumnImpl as ColumnImpl } from "arkui.component.column"; import { memo as memo } from "arkui.stateManagement.runtime"; import { TextAttribute as TextAttribute } from "arkui.component.text"; +import { TextImpl as TextImpl } from "arkui.component.text"; import { CustomComponent as CustomComponent } from "arkui.component.customComponent"; import { Component as Component, Text as Text, WrappedBuilder as WrappedBuilder, wrapBuilder as wrapBuilder, Builder as Builder, Column as Column } from "@kit.ArkUI"; @@ -49,10 +52,10 @@ function main() {} globalBuilder = wrapBuilder(myBuilder); @memo() function myBuilder(value: string, size: number) { - Text(@memo() ((instance: TextAttribute): void => { - instance.fontSize(size); + TextImpl(@memo() ((instance: TextAttribute): void => { + instance.setTextOptions(value, undefined).fontSize(size).applyAttributesFinish(); return; - }), value, undefined, undefined); + }), undefined); } @@ -64,7 +67,10 @@ globalBuilder = wrapBuilder(myBuilder); public __updateStruct(initializers: (__Options_ImportStruct | undefined)): void {} @memo() public build() { - Column(undefined, undefined, @memo() (() => { + ColumnImpl(@memo() ((instance: ColumnAttribute): void => { + instance.setColumnOptions(undefined).applyAttributesFinish(); + return; + }), @memo() (() => { globalBuilder.builder("hello", 50); })); } @@ -86,10 +92,16 @@ const expectedMemoScript: string = ` import { __memo_context_type as __memo_context_type, __memo_id_type as __memo_id_type } from "arkui.stateManagement.runtime"; +import { ColumnAttribute as ColumnAttribute } from "arkui.component.column"; + +import { ColumnImpl as ColumnImpl } from "arkui.component.column"; + import { memo as memo } from "arkui.stateManagement.runtime"; import { TextAttribute as TextAttribute } from "arkui.component.text"; +import { TextImpl as TextImpl } from "arkui.component.text"; + import { CustomComponent as CustomComponent } from "arkui.component.customComponent"; import { Component as Component, Text as Text, WrappedBuilder as WrappedBuilder, wrapBuilder as wrapBuilder, Builder as Builder, Column as Column } from "@kit.ArkUI"; @@ -106,19 +118,19 @@ globalBuilder = wrapBuilder(myBuilder); __memo_scope.cached; return; } - Text(__memo_context, ((__memo_id) + (175145513)), @memo() ((__memo_context: __memo_context_type, __memo_id: __memo_id_type, instance: TextAttribute): void => { + TextImpl(__memo_context, ((__memo_id) + (175145513)), @memo() ((__memo_context: __memo_context_type, __memo_id: __memo_id_type, instance: TextAttribute): void => { const __memo_scope = __memo_context.scope(((__memo_id) + (47330804)), 1); const __memo_parameter_instance = __memo_scope.param(0, instance); if (__memo_scope.unchanged) { __memo_scope.cached; return; } - __memo_parameter_instance.value.fontSize(__memo_parameter_size.value); + __memo_parameter_instance.value.setTextOptions(__memo_parameter_value.value, undefined).fontSize(__memo_parameter_size.value).applyAttributesFinish(); { __memo_scope.recache(); return; } - }), __memo_parameter_value.value, undefined, undefined); + }), undefined); { __memo_scope.recache(); return; @@ -139,7 +151,19 @@ globalBuilder = wrapBuilder(myBuilder); __memo_scope.cached; return; } - Column(__memo_context, ((__memo_id) + (213104625)), undefined, undefined, @memo() ((__memo_context: __memo_context_type, __memo_id: __memo_id_type) => { + ColumnImpl(__memo_context, ((__memo_id) + (213104625)), @memo() ((__memo_context: __memo_context_type, __memo_id: __memo_id_type, instance: ColumnAttribute): void => { + const __memo_scope = __memo_context.scope(((__memo_id) + ()), 1); + const __memo_parameter_instance = __memo_scope.param(0, instance); + if (__memo_scope.unchanged) { + __memo_scope.cached; + return; + } + __memo_parameter_instance.value.setColumnOptions(undefined).applyAttributesFinish(); + { + __memo_scope.recache(); + return; + } + }), @memo() ((__memo_context: __memo_context_type, __memo_id: __memo_id_type) => { const __memo_scope = __memo_context.scope(((__memo_id) + (211301233)), 0); if (__memo_scope.unchanged) { __memo_scope.cached; diff --git a/arkui-plugins/test/ut/ui-plugins/wrap-builder/wrap-builder-in-generic.test.ts b/arkui-plugins/test/ut/ui-plugins/wrap-builder/wrap-builder-in-generic.test.ts index 21668068c..4dd7b8f90 100644 --- a/arkui-plugins/test/ut/ui-plugins/wrap-builder/wrap-builder-in-generic.test.ts +++ b/arkui-plugins/test/ut/ui-plugins/wrap-builder/wrap-builder-in-generic.test.ts @@ -41,8 +41,10 @@ const expectedUIScript: string = ` import { STATE_MGMT_FACTORY as STATE_MGMT_FACTORY } from \"arkui.stateManagement.decorator\"; import { IStateDecoratedVariable as IStateDecoratedVariable } from \"arkui.stateManagement.decorator\"; import { RowAttribute as RowAttribute } from \"arkui.component.row\"; +import { RowImpl as RowImpl } from "arkui.component.row"; import { memo as memo } from \"arkui.stateManagement.runtime\"; import { TextAttribute as TextAttribute } from \"arkui.component.text\"; +import { TextImpl as TextImpl } from "arkui.component.text"; import { NavInterface as NavInterface } from \"arkui.UserView\"; import { PageLifeCycle as PageLifeCycle } from \"arkui.component.customComponent\"; import { EntryPoint as EntryPoint } from \"arkui.UserView\"; @@ -66,16 +68,16 @@ __EntryWrapper.RegisterNamedRouter(\"\", new __EntryWrapper(), ({ integratedHsp: \"false\", } as NavInterface)); @memo() function MyBuilder(value: string, size: number) { - Text(@memo() ((instance: TextAttribute): void => { - instance.fontSize(size); - return; - }), value, undefined, undefined); + TextImpl(@memo() ((instance: TextAttribute): void => { + instance.setTextOptions(value, undefined).fontSize(size).applyAttributesFinish(); + return; + }), undefined); } @memo() function YourBuilder(value: string, size: number) { - Text(@memo() ((instance: TextAttribute): void => { - instance.fontSize(size).fontColor(Color.Pink); - return; - }), value, undefined, undefined); + TextImpl(@memo() ((instance: TextAttribute): void => { + instance.setTextOptions(value, undefined).fontSize(size).fontColor(Color.Pink).applyAttributesFinish(); + return; + }), undefined); } @Entry({useSharedStorage:false,storage:\"\",routeName:\"\"}) @Component() final struct Index extends CustomComponent implements PageLifeCycle { public __initializeStruct(initializers: (__Options_Index | undefined), @memo() content: ((()=> void) | undefined)): void { @@ -91,10 +93,10 @@ __EntryWrapper.RegisterNamedRouter(\"\", new __EntryWrapper(), ({ this.__backing_message!.set(value); } @memo() public build() { - Row(@memo() ((instance: RowAttribute): void => { - instance.height(\"100%\"); + RowImpl(@memo() ((instance: RowAttribute): void => { + instance.setRowOptions(undefined).height(\"100%\").applyAttributesFinish(); return; - }), undefined, @memo() (() => { + }), @memo() (() => { globalBuilder.builder(this.message, 50); ForEach(((): Array void)>> => { return builderArr; @@ -130,8 +132,10 @@ import { __memo_context_type as __memo_context_type, __memo_id_type as __memo_id import { STATE_MGMT_FACTORY as STATE_MGMT_FACTORY } from \"arkui.stateManagement.decorator\"; import { IStateDecoratedVariable as IStateDecoratedVariable } from \"arkui.stateManagement.decorator\"; import { RowAttribute as RowAttribute } from \"arkui.component.row\"; +import { RowImpl as RowImpl } from "arkui.component.row"; import { memo as memo } from \"arkui.stateManagement.runtime\"; import { TextAttribute as TextAttribute } from \"arkui.component.text\"; +import { TextImpl as TextImpl } from "arkui.component.text"; import { NavInterface as NavInterface } from \"arkui.UserView\"; import { PageLifeCycle as PageLifeCycle } from \"arkui.component.customComponent\"; import { EntryPoint as EntryPoint } from \"arkui.UserView\"; @@ -161,19 +165,19 @@ __EntryWrapper.RegisterNamedRouter(\"\", new __EntryWrapper(), ({ __memo_scope.cached; return; } - Text(__memo_context, ((__memo_id) + ()), @memo() ((__memo_context: __memo_context_type, __memo_id: __memo_id_type, instance: TextAttribute): void => { + TextImpl(__memo_context, ((__memo_id) + ()), @memo() ((__memo_context: __memo_context_type, __memo_id: __memo_id_type, instance: TextAttribute): void => { const __memo_scope = __memo_context.scope(((__memo_id) + ()), 1); const __memo_parameter_instance = __memo_scope.param(0, instance); if (__memo_scope.unchanged) { __memo_scope.cached; return; } - __memo_parameter_instance.value.fontSize(__memo_parameter_size.value); + __memo_parameter_instance.value.setTextOptions(__memo_parameter_value.value, undefined).fontSize(__memo_parameter_size.value).applyAttributesFinish(); { __memo_scope.recache(); return; } - }), __memo_parameter_value.value, undefined, undefined); + }), undefined); { __memo_scope.recache(); return; @@ -186,19 +190,19 @@ __EntryWrapper.RegisterNamedRouter(\"\", new __EntryWrapper(), ({ __memo_scope.cached; return; } - Text(__memo_context, ((__memo_id) + ()), @memo() ((__memo_context: __memo_context_type, __memo_id: __memo_id_type, instance: TextAttribute): void => { - const __memo_scope = __memo_context.scope(((__memo_id) + ()), 1); - const __memo_parameter_instance = __memo_scope.param(0, instance); - if (__memo_scope.unchanged) { - __memo_scope.cached; - return; - } - __memo_parameter_instance.value.fontSize(__memo_parameter_size.value).fontColor(Color.Pink); - { - __memo_scope.recache(); - return; - } - }), __memo_parameter_value.value, undefined, undefined); + TextImpl(__memo_context, ((__memo_id) + ()), @memo() ((__memo_context: __memo_context_type, __memo_id: __memo_id_type, instance: TextAttribute): void => { + const __memo_scope = __memo_context.scope(((__memo_id) + ()), 1); + const __memo_parameter_instance = __memo_scope.param(0, instance); + if (__memo_scope.unchanged) { + __memo_scope.cached; + return; + } + __memo_parameter_instance.value.setTextOptions(__memo_parameter_value.value, undefined).fontSize(__memo_parameter_size.value).fontColor(Color.Pink).applyAttributesFinish(); + { + __memo_scope.recache(); + return; + } + }), undefined); { __memo_scope.recache(); return; @@ -223,19 +227,19 @@ __EntryWrapper.RegisterNamedRouter(\"\", new __EntryWrapper(), ({ __memo_scope.cached; return; } - Row(__memo_context, ((__memo_id) + ()), @memo() ((__memo_context: __memo_context_type, __memo_id: __memo_id_type, instance: RowAttribute): void => { + RowImpl(__memo_context, ((__memo_id) + ()), @memo() ((__memo_context: __memo_context_type, __memo_id: __memo_id_type, instance: RowAttribute): void => { const __memo_scope = __memo_context.scope(((__memo_id) + ()), 1); const __memo_parameter_instance = __memo_scope.param(0, instance); if (__memo_scope.unchanged) { __memo_scope.cached; return; } - __memo_parameter_instance.value.height(\"100%\"); + __memo_parameter_instance.value.setRowOptions(undefined).height(\"100%\").applyAttributesFinish(); { __memo_scope.recache(); return; } - }), undefined, @memo() ((__memo_context: __memo_context_type, __memo_id: __memo_id_type) => { + }), @memo() ((__memo_context: __memo_context_type, __memo_id: __memo_id_type) => { const __memo_scope = __memo_context.scope(((__memo_id) + ()), 0); if (__memo_scope.unchanged) { __memo_scope.cached; diff --git a/arkui-plugins/test/ut/ui-plugins/wrap-builder/wrap-builder-in-ui.test.ts b/arkui-plugins/test/ut/ui-plugins/wrap-builder/wrap-builder-in-ui.test.ts index 0b6a8c4eb..5f496b408 100644 --- a/arkui-plugins/test/ut/ui-plugins/wrap-builder/wrap-builder-in-ui.test.ts +++ b/arkui-plugins/test/ut/ui-plugins/wrap-builder/wrap-builder-in-ui.test.ts @@ -38,10 +38,16 @@ const parsedTransform: Plugins = { }; const expectedUIScript: string = ` +import { ColumnAttribute as ColumnAttribute } from "arkui.component.column"; + +import { ColumnImpl as ColumnImpl } from "arkui.component.column"; + import { memo as memo } from "arkui.stateManagement.runtime"; import { TextAttribute as TextAttribute } from "arkui.component.text"; +import { TextImpl as TextImpl } from "arkui.component.text"; + import { CustomComponent as CustomComponent } from "arkui.component.customComponent"; import { Component as Component, Text as Text, WrappedBuilder as WrappedBuilder, wrapBuilder as wrapBuilder, Builder as Builder, Column as Column, ForEach as ForEach } from "@kit.ArkUI"; @@ -52,17 +58,17 @@ function main() {} @memo() function myBuilder(value: string, size: number) { - Text(@memo() ((instance: TextAttribute): void => { - instance.fontSize(size); + TextImpl(@memo() ((instance: TextAttribute): void => { + instance.setTextOptions(value, undefined).fontSize(size).applyAttributesFinish(); return; - }), value, undefined, undefined); + }), undefined); } @memo() function yourBuilder(value: string, size: number) { - Text(@memo() ((instance: TextAttribute): void => { - instance.fontSize(size); + TextImpl(@memo() ((instance: TextAttribute): void => { + instance.setTextOptions(value, undefined).fontSize(size).applyAttributesFinish(); return; - }), value, undefined, undefined); + }), undefined); } @@ -82,7 +88,10 @@ function main() {} } @memo() public build() { - Column(undefined, undefined, @memo() (() => { + ColumnImpl(@memo() ((instance: ColumnAttribute): void => { + instance.setColumnOptions(undefined).applyAttributesFinish(); + return; + }), @memo() (() => { this.testBuilder(); })); } @@ -103,10 +112,16 @@ function testUITransformer(this: PluginTestContext): void { const expectedMemoScript: string = ` import { __memo_context_type as __memo_context_type, __memo_id_type as __memo_id_type } from "arkui.stateManagement.runtime"; +import { ColumnAttribute as ColumnAttribute } from "arkui.component.column"; + +import { ColumnImpl as ColumnImpl } from "arkui.component.column"; + import { memo as memo } from "arkui.stateManagement.runtime"; import { TextAttribute as TextAttribute } from "arkui.component.text"; +import { TextImpl as TextImpl } from "arkui.component.text"; + import { CustomComponent as CustomComponent } from "arkui.component.customComponent"; import { Component as Component, Text as Text, WrappedBuilder as WrappedBuilder, wrapBuilder as wrapBuilder, Builder as Builder, Column as Column, ForEach as ForEach } from "@kit.ArkUI"; @@ -123,19 +138,19 @@ function main() {} __memo_scope.cached; return; } - Text(__memo_context, ((__memo_id) + (175145513)), @memo() ((__memo_context: __memo_context_type, __memo_id: __memo_id_type, instance: TextAttribute): void => { + TextImpl(__memo_context, ((__memo_id) + (175145513)), @memo() ((__memo_context: __memo_context_type, __memo_id: __memo_id_type, instance: TextAttribute): void => { const __memo_scope = __memo_context.scope(((__memo_id) + (47330804)), 1); const __memo_parameter_instance = __memo_scope.param(0, instance); if (__memo_scope.unchanged) { __memo_scope.cached; return; } - __memo_parameter_instance.value.fontSize(__memo_parameter_size.value); + __memo_parameter_instance.value.setTextOptions(__memo_parameter_value.value, undefined).fontSize(__memo_parameter_size.value).applyAttributesFinish(); { __memo_scope.recache(); return; } - }), __memo_parameter_value.value, undefined, undefined); + }), undefined); { __memo_scope.recache(); return; @@ -149,19 +164,19 @@ function main() {} __memo_scope.cached; return; } - Text(__memo_context, ((__memo_id) + (211301233)), @memo() ((__memo_context: __memo_context_type, __memo_id: __memo_id_type, instance: TextAttribute): void => { + TextImpl(__memo_context, ((__memo_id) + (211301233)), @memo() ((__memo_context: __memo_context_type, __memo_id: __memo_id_type, instance: TextAttribute): void => { const __memo_scope = __memo_context.scope(((__memo_id) + (137225318)), 1); const __memo_parameter_instance = __memo_scope.param(0, instance); if (__memo_scope.unchanged) { __memo_scope.cached; return; } - __memo_parameter_instance.value.fontSize(__memo_parameter_size.value); + __memo_parameter_instance.value.setTextOptions(__memo_parameter_value.value, undefined).fontSize(__memo_parameter_size.value).applyAttributesFinish(); { __memo_scope.recache(); return; } - }), __memo_parameter_value.value, undefined, undefined); + }), undefined); { __memo_scope.recache(); return; @@ -209,7 +224,19 @@ function main() {} __memo_scope.cached; return; } - Column(__memo_context, ((__memo_id) + (54078781)), undefined, undefined, @memo() ((__memo_context: __memo_context_type, __memo_id: __memo_id_type) => { + ColumnImpl(__memo_context, ((__memo_id) + (54078781)), @memo() ((__memo_context: __memo_context_type, __memo_id: __memo_id_type, instance: ColumnAttribute): void => { + const __memo_scope = __memo_context.scope(((__memo_id) + ()), 1); + const __memo_parameter_instance = __memo_scope.param(0, instance); + if (__memo_scope.unchanged) { + __memo_scope.cached; + return; + } + __memo_parameter_instance.value.setColumnOptions(undefined).applyAttributesFinish(); + { + __memo_scope.recache(); + return; + } + }), @memo() ((__memo_context: __memo_context_type, __memo_id: __memo_id_type) => { const __memo_scope = __memo_context.scope(((__memo_id) + (213687742)), 0); if (__memo_scope.unchanged) { __memo_scope.cached; diff --git a/arkui-plugins/test/ut/ui-plugins/wrap-builder/wrap-builder-with-lambda.test.ts b/arkui-plugins/test/ut/ui-plugins/wrap-builder/wrap-builder-with-lambda.test.ts index 38ef976e6..70f999c2e 100644 --- a/arkui-plugins/test/ut/ui-plugins/wrap-builder/wrap-builder-with-lambda.test.ts +++ b/arkui-plugins/test/ut/ui-plugins/wrap-builder/wrap-builder-with-lambda.test.ts @@ -43,6 +43,8 @@ import { IStateDecoratedVariable as IStateDecoratedVariable } from "arkui.stateM import { ButtonAttribute as ButtonAttribute } from "arkui.component.button"; +import { ButtonImpl as ButtonImpl } from "arkui.component.button"; + import { IObservedObject as IObservedObject } from "arkui.stateManagement.decorator"; import { OBSERVE as OBSERVE } from "arkui.stateManagement.decorator"; @@ -57,8 +59,16 @@ import { ISubscribedWatches as ISubscribedWatches } from "arkui.stateManagement. import { STATE_MGMT_FACTORY as STATE_MGMT_FACTORY } from "arkui.stateManagement.decorator"; +import { ColumnAttribute as ColumnAttribute } from "arkui.component.column"; + import { memo as memo } from "arkui.stateManagement.runtime"; +import { TextAttribute as TextAttribute } from "arkui.component.text"; + +import { TextImpl as TextImpl } from "arkui.component.text"; + +import { ColumnImpl as ColumnImpl } from "arkui.component.column"; + import { CustomComponent as CustomComponent } from "arkui.component.customComponent"; import { Observed as Observed, Builder as Builder, Entry as Entry, Component as Component, State as State } from "@kit.ArkUI"; @@ -73,8 +83,14 @@ function main() {} @memo() function overBuilder(param: (()=> Tmp)) { - Column(undefined, undefined, @memo() (() => { - Text(undefined, \`wrapBuildervalue:\${param().paramA2}\`, undefined, undefined); + ColumnImpl(@memo() ((instance: ColumnAttribute): void => { + instance.setColumnOptions(undefined).applyAttributesFinish(); + return; + }), @memo() (() => { + TextImpl(@memo() ((instance: TextAttribute): void => { + instance.setTextOptions(\`wrapBuildervalue:\${param().paramA2}\`, undefined).applyAttributesFinish(); + return; + }), undefined); })); } @@ -148,18 +164,21 @@ function main() {} } @memo() public build() { - Column(undefined, undefined, @memo() (() => { + ColumnImpl(@memo() ((instance: ColumnAttribute): void => { + instance.setColumnOptions(undefined).applyAttributesFinish(); + return; + }), @memo() (() => { wBuilder.builder((() => { return { paramA2: this.label.paramA2, }; })); - Button(@memo() ((instance: ButtonAttribute): void => { - instance.onClick(((e: ClickEvent) => { + ButtonImpl(@memo() ((instance: ButtonAttribute): void => { + instance.setButtonOptions("Click me", undefined).onClick(((e: ClickEvent) => { this.label.paramA2 = "ArkUI"; - })); + })).applyAttributesFinish(); return; - }), "Click me", undefined, undefined); + }), undefined); })); } @@ -190,6 +209,8 @@ import { IStateDecoratedVariable as IStateDecoratedVariable } from "arkui.stateM import { ButtonAttribute as ButtonAttribute } from "arkui.component.button"; +import { ButtonImpl as ButtonImpl } from "arkui.component.button"; + import { IObservedObject as IObservedObject } from "arkui.stateManagement.decorator"; import { OBSERVE as OBSERVE } from "arkui.stateManagement.decorator"; @@ -204,8 +225,16 @@ import { ISubscribedWatches as ISubscribedWatches } from "arkui.stateManagement. import { STATE_MGMT_FACTORY as STATE_MGMT_FACTORY } from "arkui.stateManagement.decorator"; +import { ColumnAttribute as ColumnAttribute } from "arkui.component.column"; + import { memo as memo } from "arkui.stateManagement.runtime"; +import { TextAttribute as TextAttribute } from "arkui.component.text"; + +import { TextImpl as TextImpl } from "arkui.component.text"; + +import { ColumnImpl as ColumnImpl } from "arkui.component.column"; + import { CustomComponent as CustomComponent } from "arkui.component.customComponent"; import { Observed as Observed, Builder as Builder, Entry as Entry, Component as Component, State as State } from "@kit.ArkUI"; @@ -226,13 +255,37 @@ function main() {} __memo_scope.cached; return; } - Column(__memo_context, ((__memo_id) + (241913892)), undefined, undefined, @memo() ((__memo_context: __memo_context_type, __memo_id: __memo_id_type) => { + ColumnImpl(__memo_context, ((__memo_id) + (241913892)), @memo() ((__memo_context: __memo_context_type, __memo_id: __memo_id_type, instance: ColumnAttribute): void => { + const __memo_scope = __memo_context.scope(((__memo_id) + ()), 1); + const __memo_parameter_instance = __memo_scope.param(0, instance); + if (__memo_scope.unchanged) { + __memo_scope.cached; + return; + } + __memo_parameter_instance.value.setColumnOptions(undefined).applyAttributesFinish(); + { + __memo_scope.recache(); + return; + } + }), @memo() ((__memo_context: __memo_context_type, __memo_id: __memo_id_type) => { const __memo_scope = __memo_context.scope(((__memo_id) + (175145513)), 0); if (__memo_scope.unchanged) { __memo_scope.cached; return; } - Text(__memo_context, ((__memo_id) + (47330804)), undefined, \`wrapBuildervalue:\${__memo_parameter_param.value().paramA2}\`, undefined, undefined); + TextImpl(__memo_context, ((__memo_id) + (47330804)), @memo() ((__memo_context: __memo_context_type, __memo_id: __memo_id_type, instance: TextAttribute): void => { + const __memo_scope = __memo_context.scope(((__memo_id) + ()), 1); + const __memo_parameter_instance = __memo_scope.param(0, instance); + if (__memo_scope.unchanged) { + __memo_scope.cached; + return; + } + __memo_parameter_instance.value.setTextOptions(\`wrapBuildervalue:\${__memo_parameter_param.value().paramA2}\`, undefined).applyAttributesFinish(); + { + __memo_scope.recache(); + return; + } + }), undefined); { __memo_scope.recache(); return; @@ -319,7 +372,19 @@ function main() {} __memo_scope.cached; return; } - Column(__memo_context, ((__memo_id) + (218979098)), undefined, undefined, @memo() ((__memo_context: __memo_context_type, __memo_id: __memo_id_type) => { + ColumnImpl(__memo_context, ((__memo_id) + (218979098)), @memo() ((__memo_context: __memo_context_type, __memo_id: __memo_id_type, instance: ColumnAttribute): void => { + const __memo_scope = __memo_context.scope(((__memo_id) + ()), 1); + const __memo_parameter_instance = __memo_scope.param(0, instance); + if (__memo_scope.unchanged) { + __memo_scope.cached; + return; + } + __memo_parameter_instance.value.setColumnOptions(undefined).applyAttributesFinish(); + { + __memo_scope.recache(); + return; + } + }), @memo() ((__memo_context: __memo_context_type, __memo_id: __memo_id_type) => { const __memo_scope = __memo_context.scope(((__memo_id) + (76711614)), 0); if (__memo_scope.unchanged) { __memo_scope.cached; @@ -330,21 +395,21 @@ function main() {} paramA2: this.label.paramA2, }; })); - Button(__memo_context, ((__memo_id) + (46726221)), @memo() ((__memo_context: __memo_context_type, __memo_id: __memo_id_type, instance: ButtonAttribute): void => { + ButtonImpl(__memo_context, ((__memo_id) + (46726221)), @memo() ((__memo_context: __memo_context_type, __memo_id: __memo_id_type, instance: ButtonAttribute): void => { const __memo_scope = __memo_context.scope(((__memo_id) + (213104625)), 1); const __memo_parameter_instance = __memo_scope.param(0, instance); if (__memo_scope.unchanged) { __memo_scope.cached; return; } - __memo_parameter_instance.value.onClick(((e: ClickEvent) => { + __memo_parameter_instance.value.setButtonOptions("Click me", undefined).onClick(((e: ClickEvent) => { this.label.paramA2 = "ArkUI"; - })); + })).applyAttributesFinish(); { __memo_scope.recache(); return; } - }), "Click me", undefined, undefined); + }), undefined); { __memo_scope.recache(); return; diff --git a/arkui-plugins/ui-plugins/builder-lambda-translators/factory.ts b/arkui-plugins/ui-plugins/builder-lambda-translators/factory.ts index a09b46108..7ff48d4bb 100644 --- a/arkui-plugins/ui-plugins/builder-lambda-translators/factory.ts +++ b/arkui-plugins/ui-plugins/builder-lambda-translators/factory.ts @@ -47,10 +47,18 @@ import { BuilderLambdaConditionBranchInfo, BuilderLambdaChainingCallArgInfo, getArgumentType, + BuilderLambdaStyleBodyInfo, + getDeclaredSetAttribtueMethodName, + checkIsTrailingLambdaInLastParam, + ComponentAttributeCache, + ComponentRecord, + getTransformedComponentName, } from './utils'; import { hasDecorator, isDecoratorIntrinsicAnnotation } from '../property-translators/utils'; import { factory as PropertyFactory } from '../property-translators/factory'; +import { factory as TypeFactory } from '../type-translators/factory'; import { factory as UIFactory } from '../ui-factory'; +import { factory as MemoCollectFactory } from '../../collectors/memo-collectors/factory'; import { AnimationNames, ARKUI_BUILDER_SOURCE_NAME, @@ -60,9 +68,14 @@ import { DecoratorNames, } from '../../common/predefines'; import { ImportCollector } from '../../common/import-collector'; -import { addMemoAnnotation, collectMemoableInfoInParameter } from '../../collectors/memo-collectors/utils'; -import { factory as MemoCollectFactory } from '../../collectors/memo-collectors/factory'; +import { + addMemoAnnotation, + checkIsMemoFromMemoableInfo, + collectMemoableInfoInParameter, +} from '../../collectors/memo-collectors/utils'; +import { TypeRecord } from '../../collectors/utils/collect-types'; import { BuilderFactory } from './builder-factory'; +import { StyleInternalsVisitor } from './style-internals-visitor'; export class factory { /** @@ -72,14 +85,11 @@ export class factory { node: arkts.MethodDefinition, prefixArgs: arkts.ETSParameterExpression[], newAnno: arkts.AnnotationUsage[], - newName: string | undefined, - externalSourceName?: string + newName: string | undefined ): arkts.MethodDefinition { const func: arkts.ScriptFunction = node.scriptFunction; - let newParams: arkts.Expression[] = []; - if (func.params.length > 0) { - newParams.push(...prefixArgs, ...func.params); - } + const isFunctionCall: boolean = node.name.name !== BuilderLambdaNames.ORIGIN_METHOD_NAME; + const newParams: arkts.Expression[] = [...prefixArgs, ...func.params]; const updateFunc = arkts.factory .updateScriptFunction( func, @@ -99,7 +109,7 @@ export class factory { node, node.kind, arkts.factory.updateIdentifier(node.name, newName ?? node.name.name), - node.name.name === BuilderLambdaNames.ORIGIN_METHOD_NAME ? addMemoAnnotation(updateFunc) : updateFunc, + isFunctionCall ? updateFunc : addMemoAnnotation(updateFunc), node.modifiers, false ); @@ -181,6 +191,40 @@ export class factory { } } + /** + * add `instance.()` call as the initial style argument body for components. + * The initial style argument body is `undefined` for custom components. + */ + static createInitLambdaBody(declInfo: BuilderLambdaDeclInfo): BuilderLambdaStyleBodyInfo { + const { name, isFunctionCall, hasReceiver } = declInfo; + const lambdaBodyInfo: BuilderLambdaStyleBodyInfo = { lambdaBody: undefined, initCallPtr: undefined }; + if (!isFunctionCall) { + return lambdaBodyInfo; + } + let lambdaBody: arkts.Identifier | arkts.CallExpression = arkts.factory.createIdentifier( + BuilderLambdaNames.STYLE_ARROW_PARAM_NAME + ); + arkts.NodeCache.getInstance().collect(lambdaBody); + const methodName = arkts.factory.createIdentifier(getDeclaredSetAttribtueMethodName(name)); + if (!hasReceiver) { + lambdaBodyInfo.lambdaBody = arkts.factory.createCallExpression( + arkts.factory.createMemberExpression( + lambdaBody, + methodName, + arkts.Es2pandaMemberExpressionKind.MEMBER_EXPRESSION_KIND_PROPERTY_ACCESS, + false, + false + ), + undefined, + [] + ); + } else { + lambdaBodyInfo.lambdaBody = arkts.factory.createCallExpression(methodName, undefined, [lambdaBody]); + } + lambdaBodyInfo.initCallPtr = lambdaBodyInfo.lambdaBody.peer; + return lambdaBodyInfo; + } + /* * update parameter passing, e.g. `: __backing_`. */ @@ -236,12 +280,12 @@ export class factory { return addMemoAnnotation(arkts.factory.createArrowFunction(func)); } - /* - * create style arguments in builder lambda declaration. + /** + * create style argument in builder lambda declaration. */ static createStyleArgInBuilderLambdaDecl( typeNode: arkts.TypeNode | undefined, - isFunctionCall: boolean + isFunctionCall?: boolean ): arkts.ETSParameterExpression { const styleLambdaParam: arkts.ETSParameterExpression = arkts.factory.createParameterDeclaration( arkts.factory.createIdentifier(BuilderLambdaNames.STYLE_ARROW_PARAM_NAME, typeNode), @@ -268,6 +312,31 @@ export class factory { return parameter; } + /** + * create content argument in builder lambda declaration. + */ + static createContentArgInBuilderLambdaDecl(): arkts.ETSParameterExpression { + const funcType = arkts.factory.createFunctionType( + arkts.FunctionSignature.createFunctionSignature( + undefined, + [], + arkts.factory.createPrimitiveType(arkts.Es2pandaPrimitiveType.PRIMITIVE_TYPE_VOID), + false + ), + arkts.Es2pandaScriptFunctionFlags.SCRIPT_FUNCTION_FLAGS_ARROW + ); + addMemoAnnotation(funcType); + + const parameter: arkts.ETSParameterExpression = arkts.factory + .createParameterDeclaration( + arkts.factory.createIdentifier(BuilderLambdaNames.CONTENT_PARAM_NAME, funcType), + undefined + ) + .setOptional(true); + arkts.NodeCache.getInstance().collect(parameter); + return parameter; + } + /** * If a builder lambda's argument is an arrow function, * then transform any builder lambda in the function body. @@ -300,7 +369,7 @@ export class factory { /** * transform options argument in a builder lambda call. */ - static processOptionsArg(arg: T, typeName: string): T { + static processOptionsArg(arg: T): T { let expr: arkts.ObjectExpression | undefined; if (arkts.isTSAsExpression(arg) && !!arg.expr && arkts.isObjectExpression(arg.expr)) { expr = arg.expr; @@ -370,7 +439,6 @@ export class factory { static createOrUpdateArgInBuilderLambda( fallback: arkts.AstNode | undefined, arg: arkts.Expression | undefined, - typeName?: string, canAddMemo?: boolean ): arkts.AstNode | undefined { if (!arg) { @@ -385,7 +453,7 @@ export class factory { } // this is too optimistic to check if this is an options argument... if (arkts.isTSAsExpression(arg) || arkts.isObjectExpression(arg)) { - return this.processOptionsArg(arg, typeName!); + return this.processOptionsArg(arg); } return arg; } @@ -405,16 +473,17 @@ export class factory { */ static generateArgsInBuilderLambda( leaf: arkts.CallExpression, - lambdaBody: arkts.Identifier | arkts.CallExpression, + lambdaBodyInfo: BuilderLambdaStyleBodyInfo, declInfo: BuilderLambdaDeclInfo ): (arkts.AstNode | undefined)[] { const { isFunctionCall, params, returnType, moduleName } = declInfo; const type: arkts.Identifier | undefined = builderLambdaType(leaf); - const args: (arkts.AstNode | undefined)[] = [ - this.createStyleArgInBuilderLambda(lambdaBody, returnType, moduleName), - ]; + const args: (arkts.AstNode | undefined)[] = []; + const modifiedArgs: (arkts.AstNode | undefined)[] = []; const secondLastArgInfo = buildSecondLastArgInfo(type, isFunctionCall); const isTrailingCall = leaf.isTrailingCall; + const typeArguments = leaf.typeArguments; + const hasLastTrailingLambda = checkIsTrailingLambdaInLastParam(params); forEachArgWithParam( leaf.arguments, params, @@ -425,20 +494,67 @@ export class factory { } if (!modifiedArg) { const memoableInfo = collectMemoableInfoInParameter(param); - const canAddMemo = - (!!memoableInfo.hasBuilder || !!memoableInfo.hasMemo) && !!memoableInfo.hasProperType; - modifiedArg = this.createOrUpdateArgInBuilderLambda( - arkts.factory.createUndefinedLiteral(), - arg, - type?.name, - canAddMemo - ); + const canAddMemo = checkIsMemoFromMemoableInfo(memoableInfo, false); + const fallback = arkts.factory.createUndefinedLiteral(); + modifiedArg = this.createOrUpdateArgInBuilderLambda(fallback, arg, canAddMemo); + } + const shouldInsertToArgs = !isFunctionCall || (index === params.length - 1 && hasLastTrailingLambda); + if (shouldInsertToArgs) { + args.push(modifiedArg); + } else { + modifiedArgs.push(modifiedArg); } - args.push(modifiedArg); }, { isTrailingCall } ); - return filterDefined(args); + const lambdaBody = this.addOptionsArgsToLambdaBodyInStyleArg(lambdaBodyInfo, modifiedArgs, typeArguments); + const typeNode = !isFunctionCall && !!type ? UIFactory.createTypeReferenceFromString(type.name) : returnType; + const styleArg = this.createStyleArgInBuilderLambda(lambdaBody, typeNode, moduleName); + args.unshift(styleArg); + return args; + } + + /** + * add options arguments to set methods in style argument body. + */ + static addOptionsArgsToLambdaBodyInStyleArg( + lambdaBodyInfo: BuilderLambdaStyleBodyInfo, + args: (arkts.AstNode | undefined)[], + typeArguments: readonly arkts.TypeNode[] | undefined + ): arkts.CallExpression | arkts.Identifier | undefined { + const { lambdaBody, initCallPtr } = lambdaBodyInfo; + if (!lambdaBody) { + return undefined; + } + if (!initCallPtr || arkts.isIdentifier(lambdaBody)) { + return this.addApplyAttributesFinishToLambdaBodyEnd(lambdaBody); + } + const styleInternalsVisitor = new StyleInternalsVisitor(); + const newLambdaBody = styleInternalsVisitor + .registerInitCall(initCallPtr) + .registerInitCallArgs(filterDefined(args)) + .registerInitCallTypeArguments(typeArguments) + .visitor(lambdaBody) as arkts.CallExpression | arkts.Identifier; + return this.addApplyAttributesFinishToLambdaBodyEnd(newLambdaBody); + } + + /** + * add `.applyAttributesFinish()` at the end of style argument body. + */ + static addApplyAttributesFinishToLambdaBodyEnd( + lambdaBody: arkts.CallExpression | arkts.Identifier + ): arkts.CallExpression | arkts.Identifier { + return arkts.factory.createCallExpression( + arkts.factory.createMemberExpression( + lambdaBody, + arkts.factory.createIdentifier(BuilderLambdaNames.APPLY_ATTRIBUTES_FINISH_METHOD), + arkts.Es2pandaMemberExpressionKind.MEMBER_EXPRESSION_KIND_PROPERTY_ACCESS, + false, + false + ), + undefined, + [] + ); } /** @@ -597,8 +713,11 @@ export class factory { /** * replace function call's name to the corresponding transformed name. */ - static builderLambdaReplace(leaf: arkts.CallExpression): arkts.Identifier | arkts.MemberExpression | undefined { - if (!callIsGoodForBuilderLambda(leaf)) { + static builderLambdaReplace( + leaf: arkts.CallExpression, + declInfo: BuilderLambdaDeclInfo | undefined + ): arkts.Identifier | arkts.MemberExpression | undefined { + if (!callIsGoodForBuilderLambda(leaf) || !declInfo) { return undefined; } const node = leaf.expression; @@ -607,6 +726,9 @@ export class factory { return undefined; } if (arkts.isIdentifier(node)) { + const { moduleName } = declInfo; + ImportCollector.getInstance().collectSource(funcName, moduleName); + ImportCollector.getInstance().collectImport(funcName); return arkts.factory.createIdentifier(funcName); } if (arkts.isMemberExpression(node)) { @@ -624,23 +746,21 @@ export class factory { /** * transform `@ComponentBuilder` in declared methods. */ - static transformBuilderLambdaMethodDecl( - node: arkts.MethodDefinition, - externalSourceName?: string - ): arkts.MethodDefinition { + static transformBuilderLambdaMethodDecl(node: arkts.MethodDefinition): arkts.MethodDefinition { const func: arkts.ScriptFunction = node.scriptFunction; const isFunctionCall: boolean = isBuilderLambdaFunctionCall(node); + if (isFunctionCall) { + ComponentAttributeCache.getInstance().collect(node); + } const typeNode: arkts.TypeNode | undefined = builderLambdaMethodDeclType(node); const newOverloads: arkts.MethodDefinition[] = node.overloads.map((method) => factory.transformBuilderLambdaMethodDecl(method) ); - const newNode = this.updateBuilderLambdaMethodDecl( node, [this.createStyleArgInBuilderLambdaDecl(typeNode, isFunctionCall)], removeAnnotationByName(func.annotations, BuilderLambdaNames.ANNOTATION_NAME), - replaceBuilderLambdaDeclMethodName(node.name.name), - externalSourceName + replaceBuilderLambdaDeclMethodName(node.name.name) ).setOverloads(newOverloads); arkts.NodeCache.getInstance().collect(newNode); return newNode; @@ -686,7 +806,6 @@ export class factory { static transformBuilderLambda(node: arkts.CallExpression): arkts.AstNode { let instanceCalls: InstanceCallInfo[] = []; let leaf: arkts.CallExpression = node; - while (isStyleChainedCall(leaf) || isStyleWithReceiverCall(leaf)) { if (isStyleChainedCall(leaf)) { instanceCalls.push({ @@ -699,7 +818,6 @@ export class factory { }); leaf = (leaf.expression as arkts.MemberExpression).object as arkts.CallExpression; } - if (isStyleWithReceiverCall(leaf)) { instanceCalls.push({ isReceiver: true, @@ -708,30 +826,29 @@ export class factory { leaf = leaf.arguments[0] as arkts.CallExpression; } } - const decl: arkts.AstNode | undefined = findBuilderLambdaDecl(leaf); if (!decl) { return node; } - - const replace: arkts.Identifier | arkts.MemberExpression | undefined = this.builderLambdaReplace(leaf); const declInfo: BuilderLambdaDeclInfo | undefined = findBuilderLambdaDeclInfo(decl); + const replace: arkts.Identifier | arkts.MemberExpression | undefined = this.builderLambdaReplace( + leaf, + declInfo + ); if (!replace || !declInfo) { return node; } - - let lambdaBody: arkts.Identifier | arkts.CallExpression | undefined; + const lambdaBodyInfo = factory.createInitLambdaBody(declInfo); + let lambdaBody: arkts.Identifier | arkts.CallExpression | undefined = lambdaBodyInfo.lambdaBody; if (instanceCalls.length > 0) { instanceCalls = instanceCalls.reverse(); this.updateAnimation(instanceCalls); - lambdaBody = arkts.factory.createIdentifier(BuilderLambdaNames.STYLE_ARROW_PARAM_NAME); - arkts.NodeCache.getInstance().collect(lambdaBody); instanceCalls.forEach((callInfo) => { lambdaBody = this.createStyleLambdaBody(lambdaBody!, callInfo); }); } - - const args: (arkts.AstNode | undefined)[] = this.generateArgsInBuilderLambda(leaf, lambdaBody!, declInfo); + lambdaBodyInfo.lambdaBody = lambdaBody; + const args: (arkts.AstNode | undefined)[] = this.generateArgsInBuilderLambda(leaf, lambdaBodyInfo, declInfo); const newNode = arkts.factory.updateCallExpression(node, replace, leaf.typeArguments, filterDefined(args)); arkts.NodeCache.getInstance().collect(newNode); return newNode; @@ -882,4 +999,159 @@ export class factory { ); return [conditionScope, conditionBranch]; } + + /** + * add declared set methods in `@ComponentBuilder` Attribute interface + */ + static addDeclaredSetMethodsInAttributeInterface(node: arkts.TSInterfaceDeclaration): arkts.TSInterfaceDeclaration { + if (!node.body) { + return node; + } + const records = ComponentAttributeCache.getInstance().getAllComponentRecords(); + if (records.length === 0) { + return node; + } + let rootMethod = factory.createDeclaredSetMethodFromRecord(records.at(0)!); + const overloads: arkts.MethodDefinition[] = []; + for (let i = 0; i < records.length - 1; i++) { + const newMethod = factory.createDeclaredSetMethodFromRecord(records.at(i + 1)!); + overloads.push(newMethod); + } + rootMethod.setOverloads(overloads); + return arkts.factory.updateInterfaceDeclaration( + node, + node.extends, + node.id, + node.typeParams, + arkts.factory.updateInterfaceBody(node.body, [...node.body.body, rootMethod]), + node.isStatic, + node.isFromExternal + ); + } + + /** + * generate declared set method from `ComponentRecord` + */ + static createDeclaredSetMethodFromRecord(record: ComponentRecord): arkts.MethodDefinition { + const name = getDeclaredSetAttribtueMethodName(record.name); + const hasReceiver = !!record.hasReceiver; + const params = record.attributeRecords.map((record) => TypeFactory.createParameterFromRecord(record)); + const typeParams = record.typeParams?.map((p) => TypeFactory.createTypeParameterFromRecord(p)); + + const key = arkts.factory.createIdentifier(name); + const kind = arkts.Es2pandaMethodDefinitionKind.METHOD_DEFINITION_KIND_METHOD; + const modifiers = arkts.Es2pandaModifierFlags.MODIFIER_FLAGS_DECLARE; + const funcTypeParams = typeParams + ? arkts.factory.createTypeParameterDeclaration(typeParams, typeParams.length) + : undefined; + const returnTypeAnnotation = arkts.factory.createTSThisType(); + const flags = arkts.Es2pandaScriptFunctionFlags.SCRIPT_FUNCTION_FLAGS_METHOD; + + return UIFactory.createMethodDefinition({ + key, + kind, + function: { + key, + flags, + params, + typeParams: funcTypeParams, + returnTypeAnnotation, + modifiers, + hasReceiver, + }, + modifiers, + }); + } + + /** + * generate `applyAttributesFinish(): void;` in `CommonMethod` interface + */ + static createDeclaredApplyAttributesFinish(): arkts.MethodDefinition { + const key = arkts.factory.createIdentifier(BuilderLambdaNames.APPLY_ATTRIBUTES_FINISH_METHOD); + const kind = arkts.Es2pandaMethodDefinitionKind.METHOD_DEFINITION_KIND_METHOD; + const modifiers = arkts.Es2pandaModifierFlags.MODIFIER_FLAGS_DECLARE; + const returnTypeAnnotation = arkts.factory.createPrimitiveType(arkts.Es2pandaPrimitiveType.PRIMITIVE_TYPE_VOID); + const flags = arkts.Es2pandaScriptFunctionFlags.SCRIPT_FUNCTION_FLAGS_METHOD; + return UIFactory.createMethodDefinition({ + key, + kind, + function: { + key, + flags, + returnTypeAnnotation, + modifiers, + }, + modifiers, + }); + } + + /** + * generate `@ComponentBuilder` component Impl function in ETSGLOBAL class + */ + static createDeclaredComponentFunctionFromRecord( + record: ComponentRecord, + attributeName: string, + attributeTypeParams?: TypeRecord[] + ): arkts.MethodDefinition { + const newName: string = getTransformedComponentName(record.name); + const key: arkts.Identifier = arkts.factory.createIdentifier(newName); + const kind = arkts.Es2pandaMethodDefinitionKind.METHOD_DEFINITION_KIND_METHOD; + const modifiers = + arkts.Es2pandaModifierFlags.MODIFIER_FLAGS_DECLARE | + arkts.Es2pandaModifierFlags.MODIFIER_FLAGS_STATIC | + arkts.Es2pandaModifierFlags.MODIFIER_FLAGS_EXPORT; + const returnTypeAnnotation = arkts.factory.createPrimitiveType(arkts.Es2pandaPrimitiveType.PRIMITIVE_TYPE_VOID); + const flags = arkts.Es2pandaScriptFunctionFlags.SCRIPT_FUNCTION_FLAGS_METHOD; + const params = factory.createDeclaredComponentFunctionParameters( + attributeName, + attributeTypeParams, + record.hasLastTrailingLambda + ); + const typeParamItems = record.typeParams?.map((p) => TypeFactory.createTypeParameterFromRecord(p)); + const typeParams = !!typeParamItems + ? arkts.factory.createTypeParameterDeclaration(typeParamItems, typeParamItems.length) + : undefined; + const newMethod = UIFactory.createMethodDefinition({ + key, + kind, + function: { + key, + flags, + params, + typeParams, + returnTypeAnnotation, + modifiers, + }, + modifiers, + }); + addMemoAnnotation(newMethod.scriptFunction); + arkts.NodeCache.getInstance().collect(newMethod); + return newMethod; + } + + /** + * generate parameters in `@ComponentBuilder` component Impl function + */ + static createDeclaredComponentFunctionParameters( + attributeName: string, + attributeTypeParams?: TypeRecord[], + hasLastTrailingLambda?: boolean + ): arkts.ETSParameterExpression[] { + const params: arkts.ETSParameterExpression[] = []; + + const typeParamItems = attributeTypeParams?.map((p) => TypeFactory.createTypeNodeFromRecord(p)); + const typeParams = !!typeParamItems + ? arkts.factory.createTSTypeParameterInstantiation(typeParamItems) + : undefined; + const typeNode: arkts.TypeNode = UIFactory.createTypeReferenceFromString(attributeName, typeParams); + const styleArg: arkts.ETSParameterExpression = this.createStyleArgInBuilderLambdaDecl(typeNode, true); + params.push(styleArg); + + if (!!hasLastTrailingLambda) { + const contentArg: arkts.ETSParameterExpression = this.createContentArgInBuilderLambdaDecl(); + params.push(contentArg); + } + + return params; + } } diff --git a/arkui-plugins/ui-plugins/builder-lambda-translators/style-internals-visitor.ts b/arkui-plugins/ui-plugins/builder-lambda-translators/style-internals-visitor.ts new file mode 100644 index 000000000..fc46594bf --- /dev/null +++ b/arkui-plugins/ui-plugins/builder-lambda-translators/style-internals-visitor.ts @@ -0,0 +1,51 @@ +/* + * Copyright (c) 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 { AbstractVisitor } from '../../common/abstract-visitor'; +import { AstNodePointer } from '../../common/safe-types'; + +export class StyleInternalsVisitor extends AbstractVisitor { + private initCallPtr: AstNodePointer | undefined; + private initCallArgs: arkts.AstNode[] | undefined; + private initCallTypeArguments: readonly arkts.TypeNode[] | undefined; + + registerInitCall(initCallPtr: AstNodePointer): this { + this.initCallPtr = initCallPtr; + return this; + } + + registerInitCallArgs(initCallArgs: arkts.AstNode[]): this { + this.initCallArgs = initCallArgs; + return this; + } + + registerInitCallTypeArguments(initCallTypeArguments: readonly arkts.TypeNode[] | undefined): this { + this.initCallTypeArguments = initCallTypeArguments; + return this; + } + + visitor(node: arkts.CallExpression): arkts.AstNode { + if (!!this.initCallPtr && !!this.initCallArgs && node.peer === this.initCallPtr) { + return arkts.factory.updateCallExpression( + node, + node.expression, + this.initCallTypeArguments ?? node.typeArguments, + this.initCallArgs + ); + } + return this.visitEachChild(node); + } +} diff --git a/arkui-plugins/ui-plugins/builder-lambda-translators/utils.ts b/arkui-plugins/ui-plugins/builder-lambda-translators/utils.ts index 9ccc36a1c..04ba680ca 100644 --- a/arkui-plugins/ui-plugins/builder-lambda-translators/utils.ts +++ b/arkui-plugins/ui-plugins/builder-lambda-translators/utils.ts @@ -19,12 +19,29 @@ import { BuilderLambdaNames, isCustomComponentAnnotation } from '../utils'; import { DeclarationCollector } from '../../common/declaration-collector'; import { ARKUI_IMPORT_PREFIX_NAMES, BindableDecl, Dollars, StructDecoratorNames } from '../../common/predefines'; import { ImportCollector } from '../../common/import-collector'; +import { + collectTypeRecordFromParameter, + collectTypeRecordFromTypeParameterDeclaration, + collectTypeRecordFromTypeParameterInstatiation, + ParameterRecord, + TypeParameterTypeRecord, + TypeRecord, +} from '../../collectors/utils/collect-types'; +import { hasMemoAnnotation } from '../../collectors/memo-collectors/utils'; +import { AstNodePointer } from 'common/safe-types'; export type BuilderLambdaDeclInfo = { + name: string; isFunctionCall: boolean; // isFunctionCall means it is from $_instantiate. params: readonly arkts.Expression[]; returnType: arkts.TypeNode | undefined; moduleName: string; + hasReceiver?: boolean; +}; + +export type BuilderLambdaStyleBodyInfo = { + lambdaBody: arkts.Identifier | arkts.CallExpression | undefined; + initCallPtr: AstNodePointer | undefined; }; export type BuilderLambdaAstNode = arkts.ScriptFunction | arkts.ETSParameterExpression | arkts.FunctionDeclaration; @@ -352,10 +369,12 @@ export function findBuilderLambdaDeclInfo(decl: arkts.AstNode | undefined): Buil return undefined; } if (arkts.isMethodDefinition(decl)) { + const name = decl.name.name; const params = decl.scriptFunction.params.map((p) => p.clone()); const returnType = decl.scriptFunction.returnTypeAnnotation?.clone(); const isFunctionCall = isBuilderLambdaFunctionCall(decl); - return { isFunctionCall, params, returnType, moduleName }; + const hasReceiver = decl.scriptFunction.hasReceiver; + return { name, isFunctionCall, params, returnType, moduleName, hasReceiver }; } return undefined; @@ -418,7 +437,7 @@ export function builderLambdaFunctionName(node: arkts.CallExpression): string | return undefined; } if (arkts.isIdentifier(node.expression)) { - return node.expression.name; + return getTransformedComponentName(node.expression.name); } if ( arkts.isMemberExpression(node.expression) && @@ -551,3 +570,154 @@ export function checkShouldBreakFromStatement(statement: arkts.AstNode): boolean arkts.isReturnStatement(statement) || arkts.isBreakStatement(statement) || arkts.isContinueStatement(statement) ); } + +/** + * check whether the last parameter is trailing lambda in components. + */ +export function checkIsTrailingLambdaInLastParam(params: readonly arkts.Expression[]): boolean { + if (params.length === 0) { + return false; + } + const lastParam = params.at(params.length - 1)! as arkts.ETSParameterExpression; + return hasMemoAnnotation(lastParam) && lastParam.identifier.name === BuilderLambdaNames.COMPONENT_PARAM_ORI; +} + +/** + * remove any parameters except possible last trailing lambda parameter in components. + */ +export function filterParamsExpectTrailingLambda(params: readonly arkts.Expression[]): readonly arkts.Expression[] { + if (checkIsTrailingLambdaInLastParam(params)) { + return [params.at(params.length - 1)!]; + } + return []; +} + +/** + * check whether interface is `XXXAttribute` that implies the component's attribute interface. + */ +export function isComponentAttributeInterface(node: arkts.AstNode): node is arkts.TSInterfaceDeclaration { + if (!ComponentAttributeCache.getInstance().isCollected()) { + return false; + } + if (!arkts.isTSInterfaceDeclaration(node) || !node.id) { + return false; + } + return ComponentAttributeCache.getInstance().attributeName === node.id.name; +} + +/** + * get set method name for components. + */ +export function getDeclaredSetAttribtueMethodName(componentName: string): string { + return `set${componentName}Options`; +} + +/** + * get after-transformed component name + */ +export function getTransformedComponentName(componentName: string): string { + return `${componentName}Impl`; +} + +// CACHE +export interface ComponentRecord { + name: string; + attributeRecords: ParameterRecord[]; + typeParams?: TypeParameterTypeRecord[]; + hasRestParameter?: boolean; + hasReceiver?: boolean; + hasLastTrailingLambda?: boolean; +} + +export class ComponentAttributeCache { + private _cache: Map; + private _attributeName: string | undefined; + private _attributeTypeParams: TypeRecord[] | undefined; + private _isCollected: boolean = false; + private static instance: ComponentAttributeCache; + + private constructor() { + this._cache = new Map(); + } + + static getInstance(): ComponentAttributeCache { + if (!this.instance) { + this.instance = new ComponentAttributeCache(); + } + return this.instance; + } + + private collectAttributeName(type: arkts.TypeNode | undefined): string | undefined { + if ( + !type || + !arkts.isETSTypeReference(type) || + !type.part || + !type.part.name || + !arkts.isIdentifier(type.part.name) + ) { + return; + } + this._attributeName = type.part.name.name; + if (type.part.typeParams) { + this._attributeTypeParams = collectTypeRecordFromTypeParameterInstatiation(type.part.typeParams); + } + } + + get attributeName(): string | undefined { + return this._attributeName; + } + + get attributeTypeParams(): TypeRecord[] | undefined { + return this._attributeTypeParams; + } + + reset(): void { + this._cache.clear(); + this._attributeName = undefined; + this._attributeTypeParams = undefined; + this._isCollected = false; + } + + isCollected(): boolean { + return this._isCollected; + } + + collect(node: arkts.MethodDefinition): void { + this.collectAttributeName(node.scriptFunction.returnTypeAnnotation); + if (!this._attributeName) { + return; + } + const name: string = node.name.name; + const hasRestParameter = node.scriptFunction.hasRestParameter; + const hasReceiver = node.scriptFunction.hasReceiver; + const typeParams = collectTypeRecordFromTypeParameterDeclaration(node.scriptFunction.typeParams); + const params = node.scriptFunction.params as arkts.ETSParameterExpression[]; + const attributeRecords: ParameterRecord[] = []; + const hasLastTrailingLambda = checkIsTrailingLambdaInLastParam(params); + params.forEach((p, index) => { + if (index === params.length - 1 && hasLastTrailingLambda) { + return; + } + const record = collectTypeRecordFromParameter(p); + attributeRecords.push(record); + }); + const componentRecord: ComponentRecord = { + name, + attributeRecords, + typeParams, + hasRestParameter, + hasReceiver, + hasLastTrailingLambda, + }; + this._cache.set(name, componentRecord); + this._isCollected = true; + } + + getComponentRecord(name: string): ComponentRecord | undefined { + return this._cache.get(name); + } + + getAllComponentRecords(): ComponentRecord[] { + return Array.from(this._cache.values()); + } +} diff --git a/arkui-plugins/ui-plugins/checked-transformer.ts b/arkui-plugins/ui-plugins/checked-transformer.ts index ee4daa33a..aaa177820 100644 --- a/arkui-plugins/ui-plugins/checked-transformer.ts +++ b/arkui-plugins/ui-plugins/checked-transformer.ts @@ -19,7 +19,11 @@ import { factory as structFactory } from './struct-translators/factory'; import { factory as builderLambdaFactory } from './builder-lambda-translators/factory'; import { factory as entryFactory } from './entry-translators/factory'; import { AbstractVisitor } from '../common/abstract-visitor'; -import { isBuilderLambda, isBuilderLambdaMethodDecl } from './builder-lambda-translators/utils'; +import { + ComponentAttributeCache, + isBuilderLambda, + isBuilderLambdaMethodDecl, +} from './builder-lambda-translators/utils'; import { isEntryWrapperClass } from './entry-translators/utils'; import { ImportCollector } from '../common/import-collector'; import { DeclarationCollector } from '../common/declaration-collector'; @@ -86,6 +90,7 @@ export class CheckedTransformer extends AbstractVisitor { this.scope = { customComponents: [] }; PropertyCache.getInstance().reset(); MonitorCache.getInstance().reset(); + ComponentAttributeCache.getInstance().reset(); ImportCollector.getInstance().reset(); DeclarationCollector.getInstance().reset(); LogCollector.getInstance().reset(); @@ -161,10 +166,7 @@ export class CheckedTransformer extends AbstractVisitor { return this.visitEachChild(lambda); } } else if (arkts.isMethodDefinition(beforeChildren) && isBuilderLambdaMethodDecl(beforeChildren)) { - const lambda = builderLambdaFactory.transformBuilderLambdaMethodDecl( - beforeChildren, - this.externalSourceName - ); + const lambda = builderLambdaFactory.transformBuilderLambdaMethodDecl(beforeChildren); return this.visitEachChild(lambda); } let node = this.visitEachChild(beforeChildren); diff --git a/arkui-plugins/ui-plugins/struct-translators/factory.ts b/arkui-plugins/ui-plugins/struct-translators/factory.ts index 2e41cd8d3..faea2deb7 100644 --- a/arkui-plugins/ui-plugins/struct-translators/factory.ts +++ b/arkui-plugins/ui-plugins/struct-translators/factory.ts @@ -59,6 +59,7 @@ import { getNoTransformationMembersInClass, } from './utils'; import { collectStateManagementTypeImport, generateThisBacking, hasDecorator } from '../property-translators/utils'; +import { ComponentAttributeCache, isComponentAttributeInterface } from '../builder-lambda-translators/utils'; import { ProjectConfig } from '../../common/plugin-context'; import { ImportCollector } from '../../common/import-collector'; import { @@ -325,7 +326,10 @@ export class factory { } /** - * add headers for animation & @AnimatableExtend in CommonMethod + * add following declared methods in `CommonMethod` interface: + * - `animationStart` and `animationStop` for `Animation` component; + * - `__createOrSetAnimatableProperty` for `@AnimatableExtend` function with receiver; + * - `applyAttributesFinish` for component's style set options method. */ static modifyExternalComponentCommon(node: arkts.TSInterfaceDeclaration): arkts.TSInterfaceDeclaration { if (!node.body) { @@ -334,7 +338,9 @@ export class factory { const animationStart = factory.createAnimationMethod(AnimationNames.ANIMATION_START); const animationStop = factory.createAnimationMethod(AnimationNames.ANIMATION_STOP); const createOrSetAniProperty = factory.createOrSetAniProperty(); + const applyAttributesFinish = BuilderLambdaFactory.createDeclaredApplyAttributesFinish(); const updatedBody = arkts.factory.updateInterfaceBody(node.body!, [ + applyAttributesFinish, animationStart, animationStop, createOrSetAniProperty, @@ -737,8 +743,9 @@ export class factory { if (!node.id || !node.body) { return node; } - if (externalSourceName === ARKUI_COMPONENT_COMMON_SOURCE_NAME && node.id.name === 'CommonMethod') { - return factory.modifyExternalComponentCommon(node); + const newNode = factory.tranformInterfaceBuildMember(node); + if (externalSourceName === ARKUI_COMPONENT_COMMON_SOURCE_NAME && newNode.id!.name === 'CommonMethod') { + return factory.modifyExternalComponentCommon(newNode); } if (isCustomDialogControllerOptions(node, externalSourceName)) { return factory.transformControllerInterfaceType(node); @@ -746,7 +753,10 @@ export class factory { if (isCustomComponentInterface(node)) { return factory.tranformCustomComponentInterfaceMembers(node); } - return factory.tranformInterfaceBuildMember(node); + if (isComponentAttributeInterface(newNode)) { + return BuilderLambdaFactory.addDeclaredSetMethodsInAttributeInterface(newNode); + } + return newNode; } static tranformInterfaceBuildMember(node: arkts.TSInterfaceDeclaration): arkts.TSInterfaceDeclaration { @@ -815,9 +825,14 @@ export class factory { } return member; }); - let newStatements: arkts.AstNode[] = []; + if (ComponentAttributeCache.getInstance().isCollected()) { + const record = ComponentAttributeCache.getInstance().getAllComponentRecords().at(0)!; + const name = ComponentAttributeCache.getInstance().attributeName!; + const typeParams = ComponentAttributeCache.getInstance().attributeTypeParams; + updatedBody.push(BuilderLambdaFactory.createDeclaredComponentFunctionFromRecord(record, name, typeParams)); + } if (externalSourceName === ARKUI_BUILDER_SOURCE_NAME) { - newStatements.push(...BuilderLambdaFactory.addConditionBuilderDecls()); + updatedBody.push(...BuilderLambdaFactory.addConditionBuilderDecls()); } return arkts.factory.updateClassDeclaration( node, @@ -829,7 +844,7 @@ export class factory { node.definition.implements, undefined, node.definition.super, - [...updatedBody, ...newStatements], + updatedBody, node.definition.modifiers, arkts.classDefinitionFlags(node.definition) ) diff --git a/arkui-plugins/ui-plugins/type-translators/factory.ts b/arkui-plugins/ui-plugins/type-translators/factory.ts new file mode 100644 index 000000000..14e265042 --- /dev/null +++ b/arkui-plugins/ui-plugins/type-translators/factory.ts @@ -0,0 +1,216 @@ +/* + * Copyright (C) 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 { + ArrayTypeRecord, + FunctionTypeRecord, + NullTypeRecord, + PrimitiveTypeRecord, + ThisTypeRecord, + TypeRecord, + TypeRecordTypes, + TypeReferenceTypeRecord, + UndefinedTypeRecord, + UnionTypeRecord, + ParameterRecord, + TypeParameterTypeRecord, +} from '../../collectors/utils/collect-types'; + +export class factory { + /** + * generate type node from `TypeRecord` + */ + static createTypeNodeFromRecord(record: TypeRecord): arkts.TypeNode { + const type = record?.type; + switch (type) { + case TypeRecordTypes.ARRAY: + return factory.createArrayTypeFromRecord(record); + case TypeRecordTypes.FUNCTION: + return factory.createFunctionTypeFromRecord(record); + case TypeRecordTypes.NULL: + return factory.createNullTypeFromRecord(record); + case TypeRecordTypes.UNDEFINED: + return factory.createUndefinedTypeFromRecord(record); + case TypeRecordTypes.THIS: + return factory.createThisTypeFromRecord(record); + case TypeRecordTypes.UNION: + return factory.createUnionTypeFromRecord(record); + case TypeRecordTypes.TYPE_REFERENCE: + return factory.createTypeReferenceFromRecord(record); + case TypeRecordTypes.PRIMITIVE: + return factory.createPrimitiveTypeFromRecord(record); + default: + throw new Error(`Unknown type node's type: ${type}`); + } + } + + /** + * generate `arkts.ETSPrimitiveType` node from `PrimitiveTypeRecord` + */ + static createPrimitiveTypeFromRecord(record: PrimitiveTypeRecord): arkts.ETSPrimitiveType { + const typeName = record?.typeName; + switch (typeName) { + case 'boolean': + return arkts.factory.createPrimitiveType(arkts.Es2pandaPrimitiveType.PRIMITIVE_TYPE_BOOLEAN); + case 'byte': + return arkts.factory.createPrimitiveType(arkts.Es2pandaPrimitiveType.PRIMITIVE_TYPE_BYTE); + case 'char': + return arkts.factory.createPrimitiveType(arkts.Es2pandaPrimitiveType.PRIMITIVE_TYPE_CHAR); + case 'double': + return arkts.factory.createPrimitiveType(arkts.Es2pandaPrimitiveType.PRIMITIVE_TYPE_DOUBLE); + case 'float': + return arkts.factory.createPrimitiveType(arkts.Es2pandaPrimitiveType.PRIMITIVE_TYPE_FLOAT); + case 'int': + return arkts.factory.createPrimitiveType(arkts.Es2pandaPrimitiveType.PRIMITIVE_TYPE_INT); + case 'long': + return arkts.factory.createPrimitiveType(arkts.Es2pandaPrimitiveType.PRIMITIVE_TYPE_LONG); + case 'short': + return arkts.factory.createPrimitiveType(arkts.Es2pandaPrimitiveType.PRIMITIVE_TYPE_SHORT); + case 'void': + return arkts.factory.createPrimitiveType(arkts.Es2pandaPrimitiveType.PRIMITIVE_TYPE_VOID); + default: + throw new Error(`Cannot create primitive type because of name: ${typeName}`); + } + } + + /** + * generate `arkts.ETSParameterExpression` node from `ParameterRecord` + */ + static createParameterFromRecord(record: ParameterRecord): arkts.ETSParameterExpression { + const name = record.name; + const annotations = record.annotations.map((a) => a.clone()); + const isOptional = record.isOptional; + const typeAnnotation = factory.createTypeNodeFromRecord(record.typeRecord); + const parameter = arkts.factory.createParameterDeclaration( + arkts.factory.createIdentifier(name, typeAnnotation), + undefined + ); + parameter.annotations = annotations; + if (isOptional) { + parameter.setOptional(true); + } + return parameter; + } + + /** + * generate `arkts.TSTypeParameter` node from `TypeParameterTypeRecord` + */ + static createTypeParameterFromRecord(record: TypeParameterTypeRecord): arkts.TSTypeParameter { + const annotations = record.annotations.map((a) => a.clone()); + const typeName = record.typeName ? arkts.factory.createIdentifier(record.typeName) : undefined; + const defaultType = record.defaultType ? factory.createTypeNodeFromRecord(record.defaultType) : undefined; + const constraint = record.constraint ? factory.createTypeNodeFromRecord(record.constraint) : undefined; + const typeParameter = arkts.factory.createTypeParameter(typeName, constraint, defaultType); + typeParameter.setAnnotations(annotations); + return typeParameter; + } + + /** + * generate `arkts.TSArrayType` node from `ArrayTypeRecord` + */ + static createArrayTypeFromRecord(record: ArrayTypeRecord): arkts.TSArrayType { + const elementType = record.elementType ? factory.createTypeNodeFromRecord(record.elementType) : undefined; + return arkts.factory.createTSArrayType(elementType); + } + + /** + * generate `arkts.ETSNullType` node from `NullTypeRecord` + */ + static createNullTypeFromRecord(record: NullTypeRecord): arkts.ETSNullType { + return arkts.factory.createETSNullType(); + } + + /** + * generate `arkts.ETSUndefinedType` node from `UndefinedTypeRecord` + */ + static createUndefinedTypeFromRecord(record: UndefinedTypeRecord): arkts.ETSUndefinedType { + return arkts.factory.createETSUndefinedType(); + } + + /** + * generate `arkts.TSThisType` node from `ThisTypeRecord` + */ + static createThisTypeFromRecord(record: ThisTypeRecord): arkts.TSThisType { + return arkts.factory.createTSThisType(); + } + + /** + * generate `arkts.ETSFunctionType` node from `FunctionTypeRecord` + */ + static createFunctionTypeFromRecord(record: FunctionTypeRecord): arkts.ETSFunctionType { + const annotations = record.annotations.map((a) => a.clone()); + const returnType = factory.createTypeNodeFromRecord(record.returnType); + const params = record.params.map((p) => factory.createParameterFromRecord(p)); + const typeParams = record.typeParams?.map((p) => factory.createTypeParameterFromRecord(p)); + const funcType = arkts.factory.createFunctionType( + arkts.factory.createFunctionSignature( + typeParams ? arkts.factory.createTypeParameterDeclaration(typeParams, typeParams.length) : undefined, + params, + returnType, + false + ), + arkts.Es2pandaScriptFunctionFlags.SCRIPT_FUNCTION_FLAGS_ARROW + ); + funcType.setAnnotations(annotations); + return funcType; + } + + /** + * generate `arkts.ETSUnionType` node from `UnionTypeRecord` + */ + static createUnionTypeFromRecord(record: UnionTypeRecord): arkts.ETSUnionType { + const types = record.types.map((t) => factory.createTypeNodeFromRecord(t)); + return arkts.factory.createUnionType(types); + } + + /** + * @internal + */ + static createTypeNameForTypeReferencePart(name: string | string[]): arkts.Expression { + if (!Array.isArray(name)) { + return arkts.factory.createIdentifier(name); + } + const names = name.map((n) => arkts.factory.createIdentifier(n)); + if (names.length === 1) { + return names.at(0)!; + } + const leftName = names.shift(); + const rightName = names.shift(); + let nameNode: arkts.TSQualifiedName = arkts.factory.createTSQualifiedName(leftName, rightName); + while (names.length > 0) { + const currName = names.shift(); + nameNode = arkts.factory.updateTSQualifiedName(nameNode, nameNode, currName); + } + return nameNode; + } + + /** + * generate `arkts.ETSTypeReference` node from `TypeReferenceTypeRecord` + */ + static createTypeReferenceFromRecord(record: TypeReferenceTypeRecord): arkts.ETSTypeReference { + const name = record.typeName; + const annotations = record.annotations; + const typeParams = record.typeParams?.map((p) => factory.createTypeNodeFromRecord(p)); + const typeRef = arkts.factory.createTypeReference( + arkts.factory.createTypeReferencePart( + factory.createTypeNameForTypeReferencePart(name), + typeParams ? arkts.factory.createTSTypeParameterInstantiation(typeParams) : undefined + ) + ); + typeRef.setAnnotations(annotations); + return typeRef; + } +} diff --git a/arkui-plugins/ui-plugins/ui-factory.ts b/arkui-plugins/ui-plugins/ui-factory.ts index 81b2bfd24..d850d67ae 100644 --- a/arkui-plugins/ui-plugins/ui-factory.ts +++ b/arkui-plugins/ui-plugins/ui-factory.ts @@ -145,10 +145,17 @@ export class factory { /** * create type from string */ - static createTypeReferenceFromString(name: string): arkts.TypeNode { - return arkts.factory.createTypeReference( - arkts.factory.createTypeReferencePart(arkts.factory.createIdentifier(name)) - ); + static createTypeReferenceFromString( + name: string, + typeParams?: arkts.TSTypeParameterInstantiation + ): arkts.TypeNode { + let part: arkts.ETSTypeReferencePart; + if (!!typeParams) { + part = arkts.factory.createTypeReferencePart(arkts.factory.createIdentifier(name), typeParams); + } else { + part = arkts.factory.createTypeReferencePart(arkts.factory.createIdentifier(name)); + } + return arkts.factory.createTypeReference(part); } /** diff --git a/arkui-plugins/ui-plugins/utils.ts b/arkui-plugins/ui-plugins/utils.ts index 51de58447..d5382b035 100644 --- a/arkui-plugins/ui-plugins/utils.ts +++ b/arkui-plugins/ui-plugins/utils.ts @@ -59,6 +59,8 @@ export enum BuilderLambdaNames { STYLE_PARAM_NAME = 'style', STYLE_ARROW_PARAM_NAME = 'instance', CONTENT_PARAM_NAME = 'content', + COMPONENT_PARAM_ORI = 'content_', + APPLY_ATTRIBUTES_FINISH_METHOD = 'applyAttributesFinish' } // IMPORT diff --git a/koala-wrapper/src/arkts-api/factory/nodeFactory.ts b/koala-wrapper/src/arkts-api/factory/nodeFactory.ts index 6b0de31f4..844384d34 100644 --- a/koala-wrapper/src/arkts-api/factory/nodeFactory.ts +++ b/koala-wrapper/src/arkts-api/factory/nodeFactory.ts @@ -82,6 +82,10 @@ import { SwitchStatement, SwitchCaseStatement, SpreadElement, + TSArrayType, + ETSNullType, + TSThisType, + TSQualifiedName, } from '../../generated'; import { updateIdentifier } from '../node-utilities/Identifier'; import { updateCallExpression } from '../node-utilities/CallExpression'; @@ -144,6 +148,10 @@ import { updateForOfStatement } from '../node-utilities/ForOfStatement'; import { updateSwitchStatement } from '../node-utilities/SwitchStatement'; import { updateSwitchCaseStatement } from '../node-utilities/SwitchCaseStatement'; import { updateSpreadElement } from '../node-utilities/SpreadElement'; +import { updateTSArrayType } from '../node-utilities/TSArrayType'; +import { updateETSNullType } from '../node-utilities/ETSNullType'; +import { updateTSThisType } from '../node-utilities/TSThisType'; +import { updateTSQualifiedName } from '../node-utilities/TSQualifiedName'; export const factory = { get createIdentifier(): (...args: Parameters) => Identifier { @@ -625,6 +633,30 @@ export const factory = { get updateSpreadElement(): (...args: Parameters) => SpreadElement { return updateSpreadElement; }, + get createTSArrayType(): (...args: Parameters) => TSArrayType { + return TSArrayType.createTSArrayType; + }, + get updateTSArrayType(): (...args: Parameters) => TSArrayType { + return updateTSArrayType; + }, + get createETSNullType(): (...args: Parameters) => ETSNullType { + return ETSNullType.createETSNullType; + }, + get updateETSNullType(): (...args: Parameters) => ETSNullType { + return updateETSNullType; + }, + get createTSThisType(): (...args: Parameters) => TSThisType { + return TSThisType.createTSThisType; + }, + get updateTSThisType(): (...args: Parameters) => TSThisType { + return updateTSThisType; + }, + get createTSQualifiedName(): (...args: Parameters) => TSQualifiedName { + return TSQualifiedName.createTSQualifiedName; + }, + get updateTSQualifiedName(): (...args: Parameters) => TSQualifiedName { + return updateTSQualifiedName; + }, /** @deprecated */ createTypeParameter1_(name: Identifier, constraint?: TypeNode, defaultType?: TypeNode) { return TSTypeParameter.createTSTypeParameter(Identifier.create1Identifier(name.name), constraint, defaultType); diff --git a/koala-wrapper/src/arkts-api/index.ts b/koala-wrapper/src/arkts-api/index.ts index f62d57430..c351f1b61 100644 --- a/koala-wrapper/src/arkts-api/index.ts +++ b/koala-wrapper/src/arkts-api/index.ts @@ -70,6 +70,7 @@ export * from '../generated/peers/BreakStatement'; export * from '../generated/peers/ContinueStatement'; export * from '../generated/peers/SwitchCaseStatement'; export * from '../generated/peers/SwitchStatement'; +export * from '../generated/peers/TSQualifiedName'; export * from './types'; export * from './utilities/private'; diff --git a/koala-wrapper/src/arkts-api/node-utilities/ETSNullType.ts b/koala-wrapper/src/arkts-api/node-utilities/ETSNullType.ts new file mode 100644 index 000000000..7e1b10940 --- /dev/null +++ b/koala-wrapper/src/arkts-api/node-utilities/ETSNullType.ts @@ -0,0 +1,26 @@ +/* + * Copyright (c) 2024 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 { ETSNullType } from '../../generated'; +import { attachModifiers, updateThenAttach } from '../utilities/private'; + +export function updateETSNullType( + original: ETSNullType +): ETSNullType { + /* TODO: no getter provided yet */ + + const update = updateThenAttach(ETSNullType.updateETSNullType, attachModifiers); + return update(original); +} diff --git a/koala-wrapper/src/arkts-api/node-utilities/TSArrayType.ts b/koala-wrapper/src/arkts-api/node-utilities/TSArrayType.ts new file mode 100644 index 000000000..fcbfdb5da --- /dev/null +++ b/koala-wrapper/src/arkts-api/node-utilities/TSArrayType.ts @@ -0,0 +1,32 @@ +/* + * Copyright (c) 2024 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 { TSArrayType, TypeNode } from '../../generated'; +import { isSameNativeObject } from '../peers/ArktsObject'; +import { attachModifiers, updateThenAttach } from '../utilities/private'; + +export function updateTSArrayType( + original: TSArrayType, + elementType?: TypeNode +): TSArrayType { + if ( + isSameNativeObject(elementType, original.elementType) + ) { + return original; + } + + const update = updateThenAttach(TSArrayType.updateTSArrayType, attachModifiers); + return update(original, elementType); +} diff --git a/koala-wrapper/src/arkts-api/node-utilities/TSQualifiedName.ts b/koala-wrapper/src/arkts-api/node-utilities/TSQualifiedName.ts new file mode 100644 index 000000000..655c3239c --- /dev/null +++ b/koala-wrapper/src/arkts-api/node-utilities/TSQualifiedName.ts @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2024 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 { Expression, Identifier, TSQualifiedName } from '../../generated'; +import { isSameNativeObject } from '../peers/ArktsObject'; +import { attachModifiers, updateThenAttach } from '../utilities/private'; + +export function updateTSQualifiedName( + original: TSQualifiedName, + left?: Expression, + right?: Identifier +): TSQualifiedName { + if (isSameNativeObject(left, original.left) && isSameNativeObject(right, original.right)) { + return original; + } + + const update = updateThenAttach(TSQualifiedName.updateTSQualifiedName, attachModifiers); + return update(original); +} diff --git a/koala-wrapper/src/arkts-api/node-utilities/TSThisType.ts b/koala-wrapper/src/arkts-api/node-utilities/TSThisType.ts new file mode 100644 index 000000000..77b1c0e60 --- /dev/null +++ b/koala-wrapper/src/arkts-api/node-utilities/TSThisType.ts @@ -0,0 +1,26 @@ +/* + * Copyright (c) 2024 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 { TSThisType } from '../../generated'; +import { attachModifiers, updateThenAttach } from '../utilities/private'; + +export function updateTSThisType( + original: TSThisType +): TSThisType { + /* TODO: no getter provided yet */ + + const update = updateThenAttach(TSThisType.updateTSThisType, attachModifiers); + return update(original); +} diff --git a/koala-wrapper/src/arkts-api/types.ts b/koala-wrapper/src/arkts-api/types.ts index 640493db9..9f37c8598 100644 --- a/koala-wrapper/src/arkts-api/types.ts +++ b/koala-wrapper/src/arkts-api/types.ts @@ -576,7 +576,7 @@ export class ETSParameterExpression extends Expression { global.generatedEs2panda._ETSParameterExpressionSetTypeAnnotation(global.context, this.peer, t.peer); } - get optional(): Boolean { + get optional(): boolean { return global.generatedEs2panda._ETSParameterExpressionIsOptionalConst(global.context, this.peer); } -- Gitee