From b6986fb3e97be9cf2d178dfc083d6c4c4c1d0191 Mon Sep 17 00:00:00 2001 From: yuxiaofei9 Date: Thu, 11 Sep 2025 17:54:40 +0800 Subject: [PATCH] Component V2 support transfer Signed-off-by: yuxiaofei9 --- .../ui-plugins/checked-transformer.ts | 3 +- arkui-plugins/ui-plugins/interop/interop.ts | 50 +++++++++++-------- .../ui-plugins/interop/legacy-transformer.ts | 16 +++--- .../ui-plugins/struct-translators/factory.ts | 5 +- .../struct-translators/struct-transformer.ts | 2 +- 5 files changed, 46 insertions(+), 30 deletions(-) diff --git a/arkui-plugins/ui-plugins/checked-transformer.ts b/arkui-plugins/ui-plugins/checked-transformer.ts index 6ad631797..eb183a528 100644 --- a/arkui-plugins/ui-plugins/checked-transformer.ts +++ b/arkui-plugins/ui-plugins/checked-transformer.ts @@ -201,7 +201,8 @@ export class CheckedTransformer extends AbstractVisitor { } else if (arkts.isClassDeclaration(node)) { return structFactory.transformNormalClass(node, this.externalSourceName); } else if (arkts.isCallExpression(node)) { - return structFactory.transformCallExpression(node, this.projectConfig, this.resourceInfo); + return structFactory.transformCallExpression(node, this.projectConfig, this.resourceInfo, + this.scope.customComponents.length === 0); } else if (arkts.isTSInterfaceDeclaration(node)) { return structFactory.tranformInterfaceMembers(node, this.externalSourceName); } else if ( diff --git a/arkui-plugins/ui-plugins/interop/interop.ts b/arkui-plugins/ui-plugins/interop/interop.ts index 554444410..0ca8becc9 100644 --- a/arkui-plugins/ui-plugins/interop/interop.ts +++ b/arkui-plugins/ui-plugins/interop/interop.ts @@ -151,13 +151,17 @@ function newComponent(className: string): arkts.Statement { ); } -function createComponent(className: string): arkts.Statement[] { +function createComponent(className: string, isV2: boolean): arkts.Statement[] { + let viewCreateMethod = 'viewPUCreate'; + if (isV2) { + viewCreateMethod = 'viewV2Create'; + } const component = newComponent(className); - const ViewPU = getPropertyESValue('viewPUCreate', InteroperAbilityNames.GLOBAL, 'viewPUCreate'); + const View = getPropertyESValue(viewCreateMethod, InteroperAbilityNames.GLOBAL, viewCreateMethod); const create = arkts.factory.createExpressionStatement( arkts.factory.createCallExpression( arkts.factory.createMemberExpression( - arkts.factory.createIdentifier('viewPUCreate'), + arkts.factory.createIdentifier(viewCreateMethod), arkts.factory.createIdentifier('invoke'), arkts.Es2pandaMemberExpressionKind.MEMBER_EXPRESSION_KIND_PROPERTY_ACCESS, false, @@ -169,12 +173,12 @@ function createComponent(className: string): arkts.Statement[] { ] ) ); - return [component, ViewPU, create]; + return [component, View, create]; } function createWrapperBlock(context: InteropContext, varMap: Map, - updateProp: arkts.Property[]): arkts.BlockStatement { + updateProp: arkts.Property[], isV2: boolean): arkts.BlockStatement { const className: string = context.className; const path: string = context.path; const args: arkts.ObjectExpression | undefined = context.arguments; @@ -187,21 +191,21 @@ function createWrapperBlock(context: InteropContext, varMap: Map, - updateProp: arkts.Property[]): arkts.ArrowFunctionExpression { - const block = createWrapperBlock(context, varMap, updateProp); + updateProp: arkts.Property[], isV2: boolean): arkts.ArrowFunctionExpression { + const block = createWrapperBlock(context, varMap, updateProp, isV2); return arkts.factory.createArrowFunction( arkts.factory.createScriptFunction( block, @@ -415,7 +419,7 @@ export function isArkUICompatible(node: arkts.AstNode): boolean { * @param node * @returns After Checked, transform instantiate_Interop -> ArkUICompatible */ -export function generateArkUICompatible(node: arkts.CallExpression): arkts.CallExpression { +export function generateArkUICompatible(node: arkts.CallExpression, globalBuilder: boolean): arkts.CallExpression { const classInterop = (node.expression as arkts.MemberExpression).object as arkts.Identifier; const className = classInterop.name; const args = node.arguments; @@ -433,9 +437,15 @@ export function generateArkUICompatible(node: arkts.CallExpression): arkts.CallE content: content, }; + const decl = arkts.getDecl(classInterop); + if (!(decl instanceof arkts.ClassDefinition)) { + throw Error("can't find legacy class declaration"); + } const varMap: Map = generateVarMap(context, classInterop); const updateProp: arkts.Property[] = []; - const initializer = createInitializer(context, varMap, updateProp); + const isComponentV2 = decl.annotations.some( + annotation => annotation.expr instanceof arkts.Identifier && annotation.expr.name === 'ComponentV2'); + const initializer = createInitializer(context, varMap, updateProp, isComponentV2); const updater = createUpdater(updateProp); const result = arkts.factory.updateCallExpression( node, @@ -444,7 +454,7 @@ export function generateArkUICompatible(node: arkts.CallExpression): arkts.CallE [ initializer, updater, - arkts.factory.createThisExpression(), + globalBuilder ? arkts.factory.createUndefinedLiteral() : arkts.factory.createThisExpression(), ] ); arkts.NodeCache.getInstance().collect(result); diff --git a/arkui-plugins/ui-plugins/interop/legacy-transformer.ts b/arkui-plugins/ui-plugins/interop/legacy-transformer.ts index 1b831a9b0..3dd898850 100644 --- a/arkui-plugins/ui-plugins/interop/legacy-transformer.ts +++ b/arkui-plugins/ui-plugins/interop/legacy-transformer.ts @@ -246,7 +246,10 @@ export class LegacyTransformer extends AbstractVisitor { enter(node: arkts.AstNode): void { if (arkts.isStructDeclaration(node) && !!node.definition.ident) { - const scopeInfo: ScopeInfo = { name: node.definition.ident.name }; + const isCustomComponent = node.definition.annotations.some( + annotation => annotation.expr instanceof arkts.Identifier && + (annotation.expr.name === 'Component' || annotation.expr.name === 'ComponentV2')); + const scopeInfo: ScopeInfo = { name: node.definition.ident.name, isComponent: isCustomComponent}; this.scopeInfos.push(scopeInfo); } } @@ -321,16 +324,17 @@ export class LegacyTransformer extends AbstractVisitor { if (arkts.isStructDeclaration(newNode)) { const definition = newNode.definition!; const annotations = definition.annotations; - if (annotations.some(annotation => annotation instanceof arkts.Identifier && annotation.name === 'Component')) { + if (annotations.some(annotation => annotation instanceof arkts.Identifier && + (annotation.expr.name === 'Component' || annotation.expr.name === 'ComponentV2'))) { return newNode; } const className = newNode.definition?.ident?.name!; const memberMap = this.collectComponentMembers(newNode as arkts.StructDeclaration, className); this.componentInterfaceCollection.push(this.generateComponentInterface(className, node.modifiers, memberMap)); - const updateNode = this.processComponent(newNode); - this.exit(newNode); - return updateNode; - } + const updateNode = this.processComponent(newNode); + this.exit(newNode); + return updateNode; + } if (this.scopeInfos.length > 0 && arkts.isMethodDefinition(newNode)) { const kind = newNode.kind; if (kind === arkts.Es2pandaMethodDefinitionKind.METHOD_DEFINITION_KIND_CONSTRUCTOR) { diff --git a/arkui-plugins/ui-plugins/struct-translators/factory.ts b/arkui-plugins/ui-plugins/struct-translators/factory.ts index a7ebee0c7..5298ac686 100644 --- a/arkui-plugins/ui-plugins/struct-translators/factory.ts +++ b/arkui-plugins/ui-plugins/struct-translators/factory.ts @@ -1085,13 +1085,14 @@ export class factory { static transformCallExpression( node: arkts.CallExpression, projectConfig: ProjectConfig | undefined, - resourceInfo: ResourceInfo + resourceInfo: ResourceInfo, + isGlobalBuilder: boolean ): arkts.CallExpression { if (arkts.isCallExpression(node) && isResourceNode(node)) { return this.transformResource(node, projectConfig, resourceInfo); } if (isArkUICompatible(node)) { - return generateArkUICompatible(node as arkts.CallExpression); + return generateArkUICompatible(node as arkts.CallExpression, isGlobalBuilder); } return node; } diff --git a/arkui-plugins/ui-plugins/struct-translators/struct-transformer.ts b/arkui-plugins/ui-plugins/struct-translators/struct-transformer.ts index 722453b7a..711d78ee1 100644 --- a/arkui-plugins/ui-plugins/struct-translators/struct-transformer.ts +++ b/arkui-plugins/ui-plugins/struct-translators/struct-transformer.ts @@ -101,7 +101,7 @@ export class StructTransformer extends AbstractVisitor { } else if (arkts.isCallExpression(node) && isResourceNode(node)) { return factory.transformResource(node, this.projectConfig, this.resourceInfo); } else if (isArkUICompatible(node)) { - return generateArkUICompatible(node as arkts.CallExpression); + return generateArkUICompatible(node as arkts.CallExpression, this.scope.customComponents.length === 0); } else if (arkts.isTSInterfaceDeclaration(node)) { return factory.tranformInterfaceMembers(node, this.externalSourceName); } -- Gitee