From d0757a81efb048566f33428ac0149d2368486132 Mon Sep 17 00:00:00 2001 From: l00913061 Date: Fri, 6 Jun 2025 18:40:51 +0800 Subject: [PATCH] Adapt to SDK updates Signed-off-by: l00913061 Change-Id: Ib1b578940c6413ba519d6eef3067badc2e833480 --- arkui-plugins/common/predefines.ts | 28 ----- arkui-plugins/common/program-visitor.ts | 2 +- .../test/demo/interop/link_link_interop.ets | 118 ++++++++++++++++++ ...onsume.ets => provide_consume_interop.ets} | 0 ...ink-example.ets => state_link_interop.ets} | 4 +- .../test/demo/interop/state_prop_interop.ets | 93 ++++++++++++++ .../ui-plugins/interop/initstatevar.ts | 42 +++---- arkui-plugins/ui-plugins/interop/interop.ts | 84 ++++++------- .../ui-plugins/interop/legacy-transformer.ts | 4 +- .../ui-plugins/interop/predefines.ts | 63 ++++++++++ arkui-plugins/ui-plugins/interop/provide.ts | 103 ++++++++------- arkui-plugins/ui-plugins/interop/utils.ts | 49 ++++---- 12 files changed, 420 insertions(+), 170 deletions(-) create mode 100644 arkui-plugins/test/demo/interop/link_link_interop.ets rename arkui-plugins/test/demo/interop/{1.2Provide-1.1Consume.ets => provide_consume_interop.ets} (100%) rename arkui-plugins/test/demo/interop/{1.2State-1.1Link-example.ets => state_link_interop.ets} (97%) create mode 100644 arkui-plugins/test/demo/interop/state_prop_interop.ets create mode 100644 arkui-plugins/ui-plugins/interop/predefines.ts diff --git a/arkui-plugins/common/predefines.ts b/arkui-plugins/common/predefines.ts index 044a48b95..adbcd0ef3 100644 --- a/arkui-plugins/common/predefines.ts +++ b/arkui-plugins/common/predefines.ts @@ -169,34 +169,6 @@ export const INTERMEDIATE_IMPORT_SOURCE: Map = new Map { + this.stateVar.text += '~'; + }) + Child({stateVar: this.stateVar}) + } + } +} + +@Component +struct Child { + @Link stateVar; + build() { + Column() { + Button(this.stateVar.text) + .onClick((e: ClickEvent) => { + this.stateVar.text += '~'; + }) + Child1({stateVar: this.stateVar, text: this.stateVar}) + } + } +} + +class MyText { + text: string = 'MyText'; +} + + +//ArkT1.1 +import { MyText } from 'har2/src/main/ets/components/MainPage' + +@Component +export struct Child1{ + @Link stateVar: MyText; + @Link text: MyText; + build() { + Column() { + Button(this.stateVar.text) + .onClick(() => { + this.stateVar.text += '~'; + }) + Button(this.text.text) + .onClick(() => { + this.text.text = 'ArkTS1.1'; + }) + } + } +} + + +//transform 1.1struct 'Child1' to ArkUICompatible + +ArkUICompatible(__memo_context, ((__memo_id) + (252133223)), (() => { + let global = ESValue.getGlobal(); + let param = ESValue.instantiateEmptyObject(); + let createState = global.getProperty("createStateVariable"); + let stateVar_SetSource = ((value: MyText) => { + (this).stateVar = value; + }); + let stateVar_ProxyState = createState.invoke(ESValue.wrap((this).stateVar), ESValue.wrap(stateVar_SetSource)); + (this).__backing_stateVar!.setProxy(stateVar_ProxyState); + let stateVar_SetProxy = ((value: MyText) => { + stateVar_ProxyState.invokeMethod("set", ESValue.wrap(value)); + }); + (this).__backing_stateVar!.setProxyValue = stateVar_SetProxy; + let stateVar_NotifyCallback = ((propertyName: string) => { + stateVar_ProxyState.invokeMethod("notifyPropertyHasChangedPU"); + }); + (this).__backing_stateVar!.setNotifyCallback(stateVar_NotifyCallback); + param.setProperty("stateVar", stateVar_ProxyState); + param.setProperty("text", stateVar_ProxyState); + let extraInfo = ESValue.instantiateEmptyObject(); + extraInfo.setProperty("page", "har1/src/main/ets/components/MainPage"); + let esundefined = ESValue.wrap(undefined); + let blank = (() => {}); + let esblank = ESValue.wrap((blank as object)); + let viewStackProcessor = global.getProperty("ViewStackProcessor"); + let createId = viewStackProcessor.getProperty("AllocateNewElmetIdForNextComponent"); + let elmtId = createId.invoke(); + let har1 = ESValue.load("@normalized:N&entry&com.example.Interop2use1&har1/src/main/ets/components/MainPage&1.0.0"); + let structObject = har1.getProperty("Child1"); + let component = structObject.instantiate(esundefined, param, esundefined, elmtId, esblank, extraInfo); + let create = structObject.getProperty("create"); + create.invoke(component); + return { + component: component, + name: "Child1", + }; +}), ((instance: ESValue) => {})); \ No newline at end of file diff --git a/arkui-plugins/test/demo/interop/1.2Provide-1.1Consume.ets b/arkui-plugins/test/demo/interop/provide_consume_interop.ets similarity index 100% rename from arkui-plugins/test/demo/interop/1.2Provide-1.1Consume.ets rename to arkui-plugins/test/demo/interop/provide_consume_interop.ets diff --git a/arkui-plugins/test/demo/interop/1.2State-1.1Link-example.ets b/arkui-plugins/test/demo/interop/state_link_interop.ets similarity index 97% rename from arkui-plugins/test/demo/interop/1.2State-1.1Link-example.ets rename to arkui-plugins/test/demo/interop/state_link_interop.ets index cfdff0613..ec3778ef2 100644 --- a/arkui-plugins/test/demo/interop/1.2State-1.1Link-example.ets +++ b/arkui-plugins/test/demo/interop/state_link_interop.ets @@ -69,12 +69,12 @@ ArkUICompatible(__memo_context, ((__memo_id) + (252133223)), (() => { let global = ESValue.getGlobal(); let param = ESValue.instantiateEmptyObject(); let createState = global.getProperty("createStateVariable"); - let stateVar_SetSource = ((value: B) => { + let stateVar_SetSource = ((value: MyText) => { (this).stateVar = value; }); let stateVar_ProxyState = createState.invoke(ESValue.wrap((this).stateVar), ESValue.wrap(stateVar_SetSource)); (this).__backing_stateVar!.setProxy(stateVar_ProxyState); - let stateVar_SetProxy = ((value: B) => { + let stateVar_SetProxy = ((value: MyText) => { stateVar_ProxyState.invokeMethod("set", ESValue.wrap(value)); }); (this).__backing_stateVar!.setProxyValue = stateVar_SetProxy; diff --git a/arkui-plugins/test/demo/interop/state_prop_interop.ets b/arkui-plugins/test/demo/interop/state_prop_interop.ets new file mode 100644 index 000000000..99a073bbb --- /dev/null +++ b/arkui-plugins/test/demo/interop/state_prop_interop.ets @@ -0,0 +1,93 @@ +/* + * 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. + */ + + +// ArkTS1.2 +import { memo, __memo_context_type, __memo_id_type } from "@ohos.arkui.stateManagement" // should be insert by ui-plugins +import { ArkUICompatible, InteropComponent, Text, TextAttribute, Column, Component, Button, ButtonAttribute, ClickEvent, UserView, } from "@ohos.arkui.component" // TextAttribute should be insert by ui-plugins +import { State, StateDecoratedVariable, MutableState, stateOf, observableProxy, Observed, Track, Provide, Consume } from "@ohos.arkui.stateManagement" // should be insert by ui-plugins +import { MyText } from 'har2/src/main/ets/components/MainPage' +import { Child1 } from 'har1' + + +@Component +struct MyStateSample { + @State stateVar: MyText = new MyText(); + build() { + Column() { + Button(this.stateVar.text) + .onClick((e: ClickEvent) => { + this.stateVar.text += '~'; + }) + Child1({stateVar: this.stateVar, text: this.stateVar}) + } + } +} + +class MyText { + text: string = 'MyText'; +} + + +//ArkT1.1 +import { MyText } from 'har2/src/main/ets/components/MainPage' + +@Component +export struct Child1{ + @Prop stateVar: MyText; + @Prop text: MyText; + build() { + Column() { + Button(this.stateVar.text) + .onClick(() => { + this.stateVar.text += '~'; + }) + Button(this.text.text) + .onClick(() => { + this.text.text = 'ArkTS1.1'; + }) + } + } +} + + +//transform 1.1struct 'Child1' to ArkUICompatible + +ArkUICompatible(__memo_context, ((__memo_id) + (252133223)), (() => { + let global = ESValue.getGlobal(); + let param = ESValue.instantiateEmptyObject(); + let createState = global.getProperty("createStateVariable"); + param.setProperty("stateVar", (this).stateVar); + param.setProperty("text", (this).stateVar); + let extraInfo = ESValue.instantiateEmptyObject(); + extraInfo.setProperty("page", "har1/src/main/ets/components/MainPage"); + let esundefined = ESValue.wrap(undefined); + let blank = (() => {}); + let esblank = ESValue.wrap((blank as object)); + let viewStackProcessor = global.getProperty("ViewStackProcessor"); + let createId = viewStackProcessor.getProperty("AllocateNewElmetIdForNextComponent"); + let elmtId = createId.invoke(); + let har1 = ESValue.load("@normalized:N&entry&com.example.Interop2use1&har1/src/main/ets/components/MainPage&1.0.0"); + let structObject = har1.getProperty("Child1"); + let component = structObject.instantiate(esundefined, param, esundefined, elmtId, esblank, extraInfo); + let create = structObject.getProperty("create"); + create.invoke(component); + return { + component: component, + name: "Child1", + }; +}), ((instance: ESValue) => { + instance.invokeMethod("updateStateVars", ESValue.wrap({stateVar: this.stateVar, text: this.stateVar})); +})); \ No newline at end of file diff --git a/arkui-plugins/ui-plugins/interop/initstatevar.ts b/arkui-plugins/ui-plugins/interop/initstatevar.ts index a914ab4e3..9a8c143e9 100644 --- a/arkui-plugins/ui-plugins/interop/initstatevar.ts +++ b/arkui-plugins/ui-plugins/interop/initstatevar.ts @@ -16,7 +16,7 @@ import * as arkts from '@koalaui/libarkts'; -import { InteroperAbilityNames } from '../../common/predefines'; +import { ESValueMethodNames, InteroperAbilityNames } from './predefines'; import { annotation, backingField, isAnnotation } from '../../common/arkts-utils'; import { stateProxy, getPropertyESValue, getWrapValue, ifStateHasProxy, setPropertyESValue, hasLink, hasState, hasProvide, hasProp } from './utils'; @@ -90,7 +90,7 @@ function setCallbackForProxy(stateVar: () => arkts.Expression, type?: arkts.Type arkts.factory.createCallExpression( arkts.factory.createMemberExpression( arkts.factory.createIdentifier('createState'), - arkts.factory.createIdentifier('invoke'), + arkts.factory.createIdentifier(ESValueMethodNames.INVOKE), arkts.Es2pandaMemberExpressionKind.MEMBER_EXPRESSION_KIND_PROPERTY_ACCESS, false, false @@ -124,7 +124,7 @@ function createSourceBlock(): arkts.BlockStatement { arkts.factory.createCallExpression( arkts.factory.createMemberExpression( arkts.factory.createIdentifier('proxyState'), - arkts.factory.createIdentifier('invokeMethod'), + arkts.factory.createIdentifier(ESValueMethodNames.INVOKEMETHOD), arkts.Es2pandaMemberExpressionKind.MEMBER_EXPRESSION_KIND_PROPERTY_ACCESS, false, false @@ -149,7 +149,7 @@ function createNotifyBlock(): arkts.BlockStatement { arkts.factory.createCallExpression( arkts.factory.createMemberExpression( arkts.factory.createIdentifier('proxyState'), - arkts.factory.createIdentifier('invokeMethod'), + arkts.factory.createIdentifier(ESValueMethodNames.INVOKEMETHOD), arkts.Es2pandaMemberExpressionKind.MEMBER_EXPRESSION_KIND_PROPERTY_ACCESS, false, false @@ -196,10 +196,10 @@ function setCallbackForSource(type?: arkts.TypeNode): arkts.Statement[] { return [createValueCallback, createNotifyCallback]; } -function configureState(stateVar: () => arkts.Expression): arkts.Statement { +function bindCompatibleState(stateVar: () => arkts.Expression): arkts.Statement { return arkts.factory.createExpressionStatement( arkts.factory.createCallExpression( - arkts.factory.createIdentifier('configureState'), + arkts.factory.createIdentifier(InteroperAbilityNames.CONFIGURESTATE), undefined, [ stateVar(), @@ -214,7 +214,7 @@ function configureState(stateVar: () => arkts.Expression): arkts.Statement { function createProxyForState(stateVar: () => arkts.Expression, type?: arkts.TypeNode): arkts.Statement[] { const setProxy = setCallbackForProxy(stateVar, type); const setSource = setCallbackForSource(type); - const cfgState = configureState(stateVar); + const cfgState = bindCompatibleState(stateVar); return [...setProxy, ...setSource, cfgState]; } @@ -246,15 +246,11 @@ function setAndGetProxy(varName: string, type: arkts.TypeNode, stateVar: () => a const getProxy = createVariableLet( stateProxy(varName), arkts.factory.createCallExpression( - arkts.factory.createMemberExpression( - stateVar(), - arkts.factory.createIdentifier('getProxy'), - arkts.Es2pandaMemberExpressionKind.MEMBER_EXPRESSION_KIND_PROPERTY_ACCESS, - false, - false - ), + arkts.factory.createIdentifier(InteroperAbilityNames.GETPROXY), undefined, - undefined + [ + stateVar() + ] ) ); result.push(...setProxy, getProxy); @@ -271,15 +267,11 @@ function linkGetSource(varName: string, proxySet: Set): arkts.Statement[ const getState = createVariableLet( stateName, arkts.factory.createCallExpression( - arkts.factory.createMemberExpression( - backingLink, - arkts.factory.createIdentifier('getSource'), - arkts.Es2pandaMemberExpressionKind.MEMBER_EXPRESSION_KIND_PROPERTY_ACCESS, - false, - false - ), + arkts.factory.createIdentifier(InteroperAbilityNames.GETSOURCE), undefined, - undefined + [ + backingLink + ] ) ); result.push(getState); @@ -293,7 +285,7 @@ function linkGetSource(varName: string, proxySet: Set): arkts.Statement[ * @param value * @param type * @param proxySet - * @returns 处理Link装饰器所生成的互操作代码 + * @returns generate code to process @Link data interoperability */ export function processLink(keyName: string, value: arkts.Expression, type: arkts.TypeNode, proxySet: Set): arkts.Statement[] { const valueDecl = arkts.getDecl(value); @@ -341,7 +333,7 @@ export function processLink(keyName: string, value: arkts.Expression, type: arkt * * @param keyName * @param value - * @returns 处理一般情况下的属性赋值 + * @returns generate code to process regular data interoperability */ export function processNormal(keyName: string, value: arkts.AstNode): arkts.Statement[] { const result: arkts.Statement[] = []; diff --git a/arkui-plugins/ui-plugins/interop/interop.ts b/arkui-plugins/ui-plugins/interop/interop.ts index 20305dc9a..946dc441a 100644 --- a/arkui-plugins/ui-plugins/interop/interop.ts +++ b/arkui-plugins/ui-plugins/interop/interop.ts @@ -16,12 +16,12 @@ import * as arkts from '@koalaui/libarkts'; -import { InteroperAbilityNames } from '../../common/predefines'; +import { ESValueMethodNames, InteroperAbilityNames } from './predefines'; import { getCustomComponentOptionsName } from '../utils'; import { InteropContext } from '../component-transformer'; import { annotation, backingField, isAnnotation } from '../../common/arkts-utils'; import { processLink, processNormal } from './initstatevar'; -import { createProvideInterop, resetFindProvide } from './provide'; +import { createProvideInterop, setAndResetFindProvide } from './provide'; import { getPropertyESValue, getWrapValue, setPropertyESValue, hasLink, createEmptyESValue, hasProp } from './utils'; interface propertyInfo { @@ -75,7 +75,7 @@ function instantiateComponent(params: arkts.AstNode[]): arkts.VariableDeclaratio arkts.factory.createCallExpression( arkts.factory.createMemberExpression( arkts.factory.createIdentifier(InteroperAbilityNames.STRUCTOBJECT), - arkts.factory.createIdentifier(InteroperAbilityNames.INSTANTIATE), + arkts.factory.createIdentifier(ESValueMethodNames.INSTANTIATE), arkts.Es2pandaMemberExpressionKind.MEMBER_EXPRESSION_KIND_PROPERTY_ACCESS, false, false @@ -89,7 +89,7 @@ function instantiateComponent(params: arkts.AstNode[]): arkts.VariableDeclaratio } function paramsLambdaDeclaration(name: string, args?: arkts.ObjectExpression): arkts.Statement[] { - const result = []; + const result: arkts.Statement[] = []; result.push( arkts.factory.createVariableDeclaration( arkts.Es2pandaModifierFlags.MODIFIER_FLAGS_NONE, @@ -232,10 +232,10 @@ function createGlobal(): arkts.Statement { arkts.Es2pandaVariableDeclarationKind.VARIABLE_DECLARATION_KIND_LET, [arkts.factory.createVariableDeclarator( arkts.Es2pandaVariableDeclaratorFlag.VARIABLE_DECLARATOR_FLAG_LET, - arkts.factory.createIdentifier('global'), + arkts.factory.createIdentifier(InteroperAbilityNames.GLOBAL), arkts.factory.createCallExpression( arkts.factory.createMemberExpression( - arkts.factory.createIdentifier(InteroperAbilityNames.ESVALUE), + arkts.factory.createIdentifier(ESValueMethodNames.ESVALUE), arkts.factory.createIdentifier('getGlobal'), arkts.Es2pandaMemberExpressionKind.MEMBER_EXPRESSION_KIND_PROPERTY_ACCESS, false, @@ -250,7 +250,7 @@ function createGlobal(): arkts.Statement { function createELMTID(): arkts.Statement[] { const body: arkts.Statement[] = []; - const viewStackProcessor = getPropertyESValue('viewStackProcessor', 'global', 'ViewStackProcessor'); + const viewStackProcessor = getPropertyESValue('viewStackProcessor', InteroperAbilityNames.GLOBAL, 'ViewStackProcessor'); body.push(viewStackProcessor); const createId = getPropertyESValue('createId', 'viewStackProcessor', 'AllocateNewElmetIdForNextComponent'); body.push(createId); @@ -263,7 +263,7 @@ function createELMTID(): arkts.Statement[] { arkts.factory.createCallExpression( arkts.factory.createMemberExpression( arkts.factory.createIdentifier('createId'), - arkts.factory.createIdentifier('invoke'), + arkts.factory.createIdentifier(ESValueMethodNames.INVOKE), arkts.Es2pandaMemberExpressionKind.MEMBER_EXPRESSION_KIND_PROPERTY_ACCESS, false, false @@ -288,8 +288,8 @@ function createComponent(moduleName: string, className: string): arkts.Statement arkts.factory.createIdentifier(moduleName), arkts.factory.createCallExpression( arkts.factory.createMemberExpression( - arkts.factory.createIdentifier(InteroperAbilityNames.ESVALUE), - arkts.factory.createIdentifier(InteroperAbilityNames.LOAD), + arkts.factory.createIdentifier(ESValueMethodNames.ESVALUE), + arkts.factory.createIdentifier(ESValueMethodNames.LOAD), arkts.Es2pandaMemberExpressionKind.MEMBER_EXPRESSION_KIND_PROPERTY_ACCESS, false, false @@ -301,7 +301,7 @@ function createComponent(moduleName: string, className: string): arkts.Statement ] ); body.push(module); - const structObject = getPropertyESValue('structObject', moduleName, className); + const structObject = getPropertyESValue(InteroperAbilityNames.STRUCTOBJECT, moduleName, className); body.push(structObject); const component = instantiateComponent( [ @@ -319,20 +319,20 @@ function createComponent(moduleName: string, className: string): arkts.Statement function invokeViewPUCreate(): arkts.Statement[] { const body: arkts.Statement[] = []; - const createMethod = getPropertyESValue('create', 'structObject', 'create'); + const createMethod = getPropertyESValue('create', InteroperAbilityNames.STRUCTOBJECT, 'create'); body.push(createMethod); const viewPUCreate = arkts.factory.createExpressionStatement( arkts.factory.createCallExpression( arkts.factory.createMemberExpression( arkts.factory.createIdentifier('create'), - arkts.factory.createIdentifier('invoke'), + arkts.factory.createIdentifier(ESValueMethodNames.INVOKE), arkts.Es2pandaMemberExpressionKind.MEMBER_EXPRESSION_KIND_PROPERTY_ACCESS, false, false ), undefined, [ - arkts.factory.createIdentifier('component') + arkts.factory.createIdentifier(InteroperAbilityNames.COMPONENT) ] ) ); @@ -342,10 +342,10 @@ function invokeViewPUCreate(): arkts.Statement[] { function createWrapperBlock(context: InteropContext, varMap: Map, updateProp: arkts.Property[]): arkts.BlockStatement { - const className = context.className; - const path = context.path; - const args = context.arguments; - const index = path.indexOf('/'); + const className: string = context.className; + const path: string = context.path; + const args: arkts.ObjectExpression | undefined = context.arguments; + const index: number = path.indexOf('/'); if (index === -1) { throw new Error('Error path of Legacy Component.'); } @@ -353,7 +353,7 @@ function createWrapperBlock(context: InteropContext, varMap: Map, - updateProp: arkts.Property[]): arkts.ArrowFunctionExpression { +function createUpdater(updateProp: arkts.Property[]): arkts.ArrowFunctionExpression { const updateState = updateStateVars(updateProp); return arkts.factory.createArrowFunction( arkts.factory.createScriptFunction( @@ -433,7 +432,13 @@ function createUpdater(esvalue: arkts.ETSTypeReference, varMap: Map.instantiate_Interop. */ export function generateInstantiateInterop(context: InteropContext): arkts.CallExpression { return arkts.factory.createCallExpression( @@ -504,9 +509,9 @@ export function generateInstantiateInterop(context: InteropContext): arkts.CallE } /** - * After Checked阶段 + * * @param node - * @returns {boolean} 判断节点是否为带有互操作标识的CallExpression + * @returns {boolean} Checks if a given CallExpression represents a call to .instantiate_Interop. */ export function isArkUICompatible(node: arkts.AstNode): boolean { if (node instanceof arkts.CallExpression && node.expression instanceof arkts.MemberExpression && @@ -521,7 +526,7 @@ export function isArkUICompatible(node: arkts.AstNode): boolean { /** * * @param node - * @returns After Checked阶段,将带有互操作标识的1.1组件静态方法转换为ArkUICompatible函数 + * @returns After Checked, transform instantiate_Interop -> ArkUICompatible */ export function generateArkUICompatible(node: arkts.CallExpression): arkts.CallExpression { const classInterop = (node.expression as arkts.MemberExpression).object as arkts.Identifier; @@ -540,14 +545,9 @@ export function generateArkUICompatible(node: arkts.CallExpression): arkts.CallE }; const varMap: Map = generateVarMap(classInterop); - const esvalue = arkts.factory.createTypeReference( - arkts.factory.createTypeReferencePart( - arkts.factory.createIdentifier(InteroperAbilityNames.ESVALUE) - ) - ); const updateProp:arkts.Property[] = []; const initializer = createInitializer(context, varMap, updateProp); - const updater = createUpdater(esvalue, varMap, updateProp); + const updater = createUpdater(updateProp); return arkts.factory.updateCallExpression( node, arkts.factory.createIdentifier(InteroperAbilityNames.ARKUICOMPATIBLE), diff --git a/arkui-plugins/ui-plugins/interop/legacy-transformer.ts b/arkui-plugins/ui-plugins/interop/legacy-transformer.ts index f5bfb7810..3d78ff48e 100644 --- a/arkui-plugins/ui-plugins/interop/legacy-transformer.ts +++ b/arkui-plugins/ui-plugins/interop/legacy-transformer.ts @@ -20,7 +20,7 @@ import { getInteropPath } from '../../path'; const interop = require(getInteropPath()); const nullptr = interop.nullptr; import { AbstractVisitor, VisitorOptions } from '../../common/abstract-visitor'; -import { InteroperAbilityNames } from '../../common/predefines'; +import { ESValueMethodNames, InteroperAbilityNames } from './predefines'; import { getCustomComponentOptionsName } from '../utils'; import { annotation } from 'common/arkts-utils'; @@ -171,7 +171,7 @@ export class LegacyTransformer extends AbstractVisitor { processConstructor(node: arkts.MethodDefinition): arkts.MethodDefinition { const esvalue = arkts.factory.createTypeReference( arkts.factory.createTypeReferencePart( - arkts.factory.createIdentifier(InteroperAbilityNames.ESVALUE) + arkts.factory.createIdentifier(ESValueMethodNames.ESVALUE) ) ); const script = arkts.factory.createScriptFunction( diff --git a/arkui-plugins/ui-plugins/interop/predefines.ts b/arkui-plugins/ui-plugins/interop/predefines.ts new file mode 100644 index 000000000..c70c8e017 --- /dev/null +++ b/arkui-plugins/ui-plugins/interop/predefines.ts @@ -0,0 +1,63 @@ +/* + * 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. + */ + + +export enum InteroperAbilityNames { + ARKTS_1_1 = '1.1', + ARKTS_1_2 = '1.2', + ARKUICOMPATIBLE = 'ArkUICompatible', + ELMTID = 'elmtId', + NUMBER = 'number', + PARENT = 'parent', + INSTANCE = 'instance', + PARAM = 'param', + EXTRAINFO = 'extraInfo', + COMPONENT = 'component', + CONSTRUCTOR = 'constructor', + MODULE = 'module', + STRUCTOBJECT = 'structObject', + GLOBAL = 'global', + PARAMSLAMBDA = 'paramsLambda', + INTEROPCOMPONENT = 'interopComponent', + OHMURL = '@normalized:N&entry&com.example.Interop2use1&har1/src/main/ets/components/MainPage&1.0.0', + CONFIGURESTATE = 'bindCompatibleState', + GETSOURCE = 'findBindingSourceState', + GETPROXY = 'getCompatibleState' +} + + +export enum ESValueMethodNames { + ESVALUE = 'ESValue', + INITEMPTYOBJECT = 'instantiateEmptyObject', + SETPROPERTY = 'setProperty', + GETPROPERTY = 'getProperty', + INSTANTIATE = 'instantiate', + INVOKE = 'invoke', + INVOKEMETHOD = 'invokeMethod', + LOAD = 'load', + WRAP = 'wrap', + WRAPINT = 'wrapInt', + WRAPSTRING = 'wrapString', + UNWRAP = 'unwrap', +} + +export enum InteropProvideNames { + STATICPROVIDE = 'provide', + FINDPROVIDE = 'findProvide', + PROVIDEDPROPNAME = 'providedPropName', + SETFINDPROVIDE = 'setFindProvideInterop', + SETVIEWPUFINDPROVIDE = 'setViewPUFindProvideInterop', + FINDPROVIDECALLBACK = 'findProvideInterop', +} \ No newline at end of file diff --git a/arkui-plugins/ui-plugins/interop/provide.ts b/arkui-plugins/ui-plugins/interop/provide.ts index 0f37705f7..19732e624 100644 --- a/arkui-plugins/ui-plugins/interop/provide.ts +++ b/arkui-plugins/ui-plugins/interop/provide.ts @@ -18,15 +18,16 @@ import * as arkts from '@koalaui/libarkts'; import { getPropertyESValue } from './utils'; import { createVariableLet, setStateProxy } from './initstatevar'; +import { ESValueMethodNames, InteroperAbilityNames, InteropProvideNames } from './predefines'; function findProvide(): arkts.Statement { return createVariableLet( - 'provide', + InteropProvideNames.STATICPROVIDE, arkts.factory.createCallExpression( arkts.factory.createMemberExpression( arkts.factory.createThisExpression(), - arkts.factory.createIdentifier('findProvide'), + arkts.factory.createIdentifier(InteropProvideNames.FINDPROVIDE), arkts.Es2pandaMemberExpressionKind.MEMBER_EXPRESSION_KIND_PROPERTY_ACCESS, false, false @@ -39,7 +40,7 @@ function findProvide(): arkts.Statement { ) ], [ - arkts.factory.createIdentifier('providedPropName') + arkts.factory.createIdentifier(InteropProvideNames.PROVIDEDPROPNAME) ] ) ); @@ -48,7 +49,7 @@ function findProvide(): arkts.Statement { function setProvideProxy(): arkts.Statement[] { return setStateProxy( () => arkts.factory.createTSNonNullExpression( - arkts.factory.createIdentifier('provide') + arkts.factory.createIdentifier(InteropProvideNames.STATICPROVIDE) ) ); } @@ -57,17 +58,13 @@ function getProvideProxy(): arkts.Statement { return createVariableLet( 'proxy', arkts.factory.createCallExpression( - arkts.factory.createMemberExpression( - arkts.factory.createTSNonNullExpression( - arkts.factory.createIdentifier('provide') - ), - arkts.factory.createIdentifier('getProxy'), - arkts.Es2pandaMemberExpressionKind.MEMBER_EXPRESSION_KIND_PROPERTY_ACCESS, - false, - false - ), + arkts.factory.createIdentifier(InteroperAbilityNames.GETPROXY), undefined, - undefined + [ + arkts.factory.createTSNonNullExpression( + arkts.factory.createIdentifier(InteropProvideNames.STATICPROVIDE) + ) + ] ) ); } @@ -81,12 +78,12 @@ function returnProvide(): arkts.Statement { arkts.factory.createIdentifier('proxy'), arkts.factory.createTypeReference( arkts.factory.createTypeReferencePart( - arkts.factory.createIdentifier('ESValue') + arkts.factory.createIdentifier(ESValueMethodNames.ESVALUE) ) ), false ), - arkts.factory.createIdentifier('unwrap'), + arkts.factory.createIdentifier(ESValueMethodNames.UNWRAP), arkts.Es2pandaMemberExpressionKind.MEMBER_EXPRESSION_KIND_PROPERTY_ACCESS, false, false @@ -109,7 +106,7 @@ function createProvideBlock(): arkts.BlockStatement { function findProvideCallback(): arkts.Statement { const block = createProvideBlock(); const callback = createVariableLet( - 'findProvideInterop', + InteropProvideNames.FINDPROVIDECALLBACK, arkts.factory.createArrowFunction( arkts.factory.createScriptFunction( block, @@ -117,7 +114,7 @@ function findProvideCallback(): arkts.Statement { undefined, [ arkts.factory.createParameterDeclaration( - arkts.factory.createIdentifier('providedPropName', + arkts.factory.createIdentifier(InteropProvideNames.PROVIDEDPROPNAME, arkts.factory.createTypeReference( arkts.factory.createTypeReferencePart( arkts.factory.createIdentifier('string') @@ -143,47 +140,67 @@ function findProvideCallback(): arkts.Statement { } export function createProvideInterop(): arkts.Statement[] { - const func = getPropertyESValue( - 'setFindProvideInterop', - 'global', - 'setFindProvideInterop' + const viewPUFunc = getPropertyESValue( + InteropProvideNames.SETVIEWPUFINDPROVIDE, + InteroperAbilityNames.GLOBAL, + InteropProvideNames.SETVIEWPUFINDPROVIDE + ); + const componentFunc = getPropertyESValue( + InteropProvideNames.SETFINDPROVIDE, + InteroperAbilityNames.GLOBAL, + InteropProvideNames.SETFINDPROVIDE ); const callback = findProvideCallback(); const invokeFunc = arkts.factory.createExpressionStatement( arkts.factory.createCallExpression( arkts.factory.createMemberExpression( - arkts.factory.createIdentifier('setFindProvideInterop'), - arkts.factory.createIdentifier('invoke'), + arkts.factory.createIdentifier(InteropProvideNames.SETVIEWPUFINDPROVIDE), + arkts.factory.createIdentifier(ESValueMethodNames.INVOKE), arkts.Es2pandaMemberExpressionKind.MEMBER_EXPRESSION_KIND_PROPERTY_ACCESS, false, false ), undefined, [ - arkts.factory.createIdentifier('findProvideInterop') + arkts.factory.createIdentifier(InteropProvideNames.FINDPROVIDECALLBACK) ] ) ); - return [func, callback, invokeFunc]; + return [viewPUFunc, componentFunc, callback, invokeFunc]; } -/** - * - * @returns ViewPU.resetFindInterop() - */ -export function resetFindProvide(): arkts.Statement { - return arkts.factory.createCallExpression( - arkts.factory.createMemberExpression( - arkts.factory.createIdentifier('structObject'), - arkts.factory.createIdentifier('invokeMethod'), - arkts.Es2pandaMemberExpressionKind.MEMBER_EXPRESSION_KIND_PROPERTY_ACCESS, - false, - false - ), - undefined, - [ - arkts.factory.createStringLiteral('resetFindProvide') - ] +export function setAndResetFindProvide(): arkts.Statement[] { + const setComponent = arkts.factory.createExpressionStatement( + arkts.factory.createCallExpression( + arkts.factory.createMemberExpression( + arkts.factory.createIdentifier(InteropProvideNames.SETFINDPROVIDE), + arkts.factory.createIdentifier(ESValueMethodNames.INVOKE), + arkts.Es2pandaMemberExpressionKind.MEMBER_EXPRESSION_KIND_PROPERTY_ACCESS, + false, + false + ), + undefined, + [ + arkts.factory.createIdentifier(InteroperAbilityNames.COMPONENT), + arkts.factory.createIdentifier(InteropProvideNames.FINDPROVIDECALLBACK) + ] + ) + ); + const resetViewPU = arkts.factory.createExpressionStatement( + arkts.factory.createCallExpression( + arkts.factory.createMemberExpression( + arkts.factory.createIdentifier(InteroperAbilityNames.STRUCTOBJECT), + arkts.factory.createIdentifier(ESValueMethodNames.INVOKEMETHOD), + arkts.Es2pandaMemberExpressionKind.MEMBER_EXPRESSION_KIND_PROPERTY_ACCESS, + false, + false + ), + undefined, + [ + arkts.factory.createStringLiteral('resetFindInterop') + ] + ) ); + return [setComponent, resetViewPU]; } \ No newline at end of file diff --git a/arkui-plugins/ui-plugins/interop/utils.ts b/arkui-plugins/ui-plugins/interop/utils.ts index 70e997af6..c26e4051b 100644 --- a/arkui-plugins/ui-plugins/interop/utils.ts +++ b/arkui-plugins/ui-plugins/interop/utils.ts @@ -16,7 +16,7 @@ import * as arkts from '@koalaui/libarkts'; -import { InteroperAbilityNames } from '../../common/predefines'; +import { ESValueMethodNames, InteroperAbilityNames } from './predefines'; /** @@ -34,8 +34,8 @@ export function createEmptyESValue(result: string): arkts.VariableDeclaration { arkts.factory.createIdentifier(result), arkts.factory.createCallExpression( arkts.factory.createMemberExpression( - arkts.factory.createIdentifier(InteroperAbilityNames.ESVALUE), - arkts.factory.createIdentifier(InteroperAbilityNames.INITEMPTYOBJECT), + arkts.factory.createIdentifier(ESValueMethodNames.ESVALUE), + arkts.factory.createIdentifier(ESValueMethodNames.INITEMPTYOBJECT), arkts.Es2pandaMemberExpressionKind.MEMBER_EXPRESSION_KIND_PROPERTY_ACCESS, false, false @@ -56,8 +56,8 @@ export function createEmptyESValue(result: string): arkts.VariableDeclaration { export function getWrapValue(value: arkts.AstNode): arkts.AstNode { return arkts.factory.createCallExpression( arkts.factory.createMemberExpression( - arkts.factory.createIdentifier(InteroperAbilityNames.ESVALUE), - arkts.factory.createIdentifier(InteroperAbilityNames.WRAP), + arkts.factory.createIdentifier(ESValueMethodNames.ESVALUE), + arkts.factory.createIdentifier(ESValueMethodNames.WRAP), arkts.Es2pandaMemberExpressionKind.MEMBER_EXPRESSION_KIND_PROPERTY_ACCESS, false, false @@ -79,7 +79,7 @@ export function setPropertyESValue(object: string, key: string, value: arkts.Ast arkts.factory.createCallExpression( arkts.factory.createMemberExpression( arkts.factory.createIdentifier(object), - arkts.factory.createIdentifier(InteroperAbilityNames.SETPROPERTY), + arkts.factory.createIdentifier(ESValueMethodNames.SETPROPERTY), arkts.Es2pandaMemberExpressionKind.MEMBER_EXPRESSION_KIND_PROPERTY_ACCESS, false, false @@ -96,11 +96,11 @@ export function setPropertyESValue(object: string, key: string, value: arkts.Ast /** * * @param result - * @param object + * @param obj * @param key * @returns let result = object.getProperty(key) */ -export function getPropertyESValue(result: string, object: string, key: string): arkts.VariableDeclaration { +export function getPropertyESValue(result: string, obj: string, key: string): arkts.VariableDeclaration { return arkts.factory.createVariableDeclaration( arkts.Es2pandaModifierFlags.MODIFIER_FLAGS_NONE, arkts.Es2pandaVariableDeclarationKind.VARIABLE_DECLARATION_KIND_LET, @@ -110,8 +110,8 @@ export function getPropertyESValue(result: string, object: string, key: string): arkts.factory.createIdentifier(result), arkts.factory.createCallExpression( arkts.factory.createMemberExpression( - arkts.factory.createIdentifier(object), - arkts.factory.createIdentifier(InteroperAbilityNames.GETPROPERTY), + arkts.factory.createIdentifier(obj), + arkts.factory.createIdentifier(ESValueMethodNames.GETPROPERTY), arkts.Es2pandaMemberExpressionKind.MEMBER_EXPRESSION_KIND_PROPERTY_ACCESS, false, false @@ -126,23 +126,19 @@ export function getPropertyESValue(result: string, object: string, key: string): /** * - * @param stateName + * @param stateVar * @param block - * @returns if (stateName.getProxy() === undefined) { block } + * @returns if (getCompatibleState(stateVar) === undefined) { block } */ export function ifStateHasProxy(stateVar: () => arkts.Expression, block: arkts.BlockStatement): arkts.Statement { return arkts.factory.createIfStatement( arkts.factory.createBinaryExpression( arkts.factory.createCallExpression( - arkts.factory.createMemberExpression( - stateVar(), - arkts.factory.createIdentifier('getProxy'), - arkts.Es2pandaMemberExpressionKind.MEMBER_EXPRESSION_KIND_PROPERTY_ACCESS, - false, - true - ), - undefined, + arkts.factory.createIdentifier(InteroperAbilityNames.GETPROXY), undefined, + [ + stateVar() + ] ), arkts.factory.createUndefinedLiteral(), arkts.Es2pandaTokenType.TOKEN_TYPE_PUNCTUATOR_STRICT_EQUAL @@ -152,9 +148,9 @@ export function ifStateHasProxy(stateVar: () => arkts.Expression, block: arkts.B } /** - * - * @param decorators - * @returns 判断是否包含Link装饰器 + * Checks if an array of decorator names contains the 'Link' decorator. + * @param {string[]} decorators - Array of decorator names applied to a property. + * @returns {boolean} True if the 'Link' decorator is present, otherwise false. */ export function hasLink(decorators: string[]): boolean { return decorators.some(decorator => decorator === 'Link'); @@ -173,10 +169,9 @@ export function hasProvide(decorators: string[]): boolean { } /** - * - * @param stateVarName - * @param name - * @returns 带有状态变量标识的变量命名 + * Generates a state proxy variable name by appending "_State_Proxy" suffix. + * @param {string} stateVarName - Original state variable name to be proxied. + * @returns {string} Proxied variable name in the format: "{stateVarName}_State_Proxy". */ export function stateProxy(stateVarName: string): string { return `${stateVarName}_State_Proxy`; -- Gitee