diff --git a/arkui-plugins/common/program-visitor.ts b/arkui-plugins/common/program-visitor.ts index 946ce5723ba323b6b81120758ff663cad2f6dc49..e1b21f77a8e4d8faef11fc94b18e215c268ba4da 100644 --- a/arkui-plugins/common/program-visitor.ts +++ b/arkui-plugins/common/program-visitor.ts @@ -19,7 +19,7 @@ import { matchPrefix } from './arkts-utils'; import { debugDump, getDumpFileName } from './debug'; import { InteroperAbilityNames, ARKUI_COMPONENT_IMPORT_NAME, KIT_ARKUI_NAME } from './predefines'; import { PluginContext } from './plugin-context'; -import { LegacyTransformer } from '../ui-plugins/legacy-transformer'; +import { LegacyTransformer } from '../ui-plugins/interop/legacy-transformer'; import { ComponentTransformer } from '../ui-plugins/component-transformer'; export interface ProgramVisitorOptions extends VisitorOptions { diff --git a/arkui-plugins/ui-plugins/checked-transformer.ts b/arkui-plugins/ui-plugins/checked-transformer.ts index 89041465889448544f6e8dd2f4f087277b34fbc3..1a8e67d150e057d1f7921208f8b39e3cfe5e6add 100644 --- a/arkui-plugins/ui-plugins/checked-transformer.ts +++ b/arkui-plugins/ui-plugins/checked-transformer.ts @@ -35,7 +35,7 @@ import { isBuilderLambda, isBuilderLambdaMethodDecl } from './builder-lambda-tra import { isEntryWrapperClass } from './entry-translators/utils'; import { ImportCollector } from './import-collector'; import { PropertyCache } from './property-translators/utils'; -import { isArkUICompatible, updateArkUICompatible } from './interop'; +import { isArkUICompatible, generateArkUICompatible } from './interop/interop'; export class CheckedTransformer extends AbstractVisitor { private scope: ScopeInfoCollection; @@ -108,7 +108,7 @@ export class CheckedTransformer extends AbstractVisitor { } else if (arkts.isCallExpression(node) && isResourceNode(node)) { return structFactory.transformResource(node, this.projectConfig); } else if (isArkUICompatible(node)) { - return updateArkUICompatible(node as arkts.CallExpression); + return generateArkUICompatible(node as arkts.CallExpression); } else if (arkts.isTSInterfaceDeclaration(node)) { return structFactory.tranformInterfaceMembers(node, this.externalSourceName); } else if (findCanAddMemoFromArrowFunction(node)) { diff --git a/arkui-plugins/ui-plugins/component-transformer.ts b/arkui-plugins/ui-plugins/component-transformer.ts index cf856101a364a52830cf0acbbaeff9cb7a8a4993..68d16da4d75de3987b4e3399b8cc9b2b2234cac3 100644 --- a/arkui-plugins/ui-plugins/component-transformer.ts +++ b/arkui-plugins/ui-plugins/component-transformer.ts @@ -40,7 +40,7 @@ import { import { factory } from './ui-factory'; import { factory as propertyFactory } from './property-translators/factory'; import { StructMap } from '../common/program-visitor'; -import { generateTempCallFunction } from './interop'; +import { generateInstantiateInterop } from './interop/interop'; export interface ComponentTransformerOptions extends VisitorOptions { arkui?: string; @@ -68,6 +68,7 @@ export class ComponentTransformer extends AbstractVisitor { private hasLegacy: boolean = false; private legacyStructMap: Map = new Map(); private legacyCallMap: Map = new Map(); + private legacyData: Set = new Set(); constructor(options?: ComponentTransformerOptions) { const _options: ComponentTransformerOptions = options ?? {}; @@ -87,6 +88,7 @@ export class ComponentTransformer extends AbstractVisitor { this.hasLegacy = false; this.legacyStructMap = new Map(); this.legacyCallMap = new Map(); + this.legacyData = new Set(); } enter(node: arkts.AstNode) { @@ -372,7 +374,7 @@ export class ComponentTransformer extends AbstractVisitor { this.hasLegacy = true; } - processImport(node: arkts.ETSImportDeclaration): void { + processInteropImport(node: arkts.ETSImportDeclaration): void { const source = node.source?.str!; const specifiers = node.specifiers as arkts.ImportSpecifier[]; if (this.legacyStructMap.has(source)) { @@ -381,14 +383,35 @@ export class ComponentTransformer extends AbstractVisitor { return; } for (const specifier of specifiers) { - const name = specifier.local?.name; - if (!!name && structMap[name]) { + const name = (specifier as arkts.ImportSpecifier)!.local!.name; + if (structMap[name]) { this.legacyCallMap.set(name, structMap[name]); } } } } + processInteropCall(node: arkts.CallExpression) { + const ident = node.expression; + if (!(ident instanceof arkts.Identifier)) { + return node; + } + const className = ident.name; + if (this.legacyCallMap.has(className)) { + const path = this.legacyCallMap.get(className)!; + const args = node.arguments; + const context: InteropContext = { + className: className, + path: path, + arguments: args && args.length === 1 && args[0] instanceof arkts.ObjectExpression + ? args[0] + : undefined + }; + return generateInstantiateInterop(context); + } + return node; + } + visitor(node: arkts.AstNode): arkts.AstNode { this.enter(node); const newNode = this.visitEachChild(node); @@ -404,25 +427,15 @@ export class ComponentTransformer extends AbstractVisitor { this.exit(newNode); return updateNode; } + // process interop code if (!this.hasLegacy) { return newNode; } if (arkts.isETSImportDeclaration(newNode)) { - this.processImport(newNode); + this.processInteropImport(newNode); } - if (arkts.isCallExpression(newNode) && arkts.isIdentifier(newNode.expression)) { - const className = newNode.expression.name; - if (this.legacyCallMap.has(className)) { - const path = this.legacyCallMap.get(className)!; - const args = newNode.arguments; - const context: InteropContext = { - className: className, - path: path, - arguments: - args && args.length === 1 && args[0] instanceof arkts.ObjectExpression ? args[0] : undefined, - }; - return generateTempCallFunction(context); - } + if (arkts.isCallExpression(newNode)) { + return this.processInteropCall(newNode); } return newNode; } diff --git a/arkui-plugins/ui-plugins/initstatevar.ts b/arkui-plugins/ui-plugins/interop/initstatevar.ts similarity index 37% rename from arkui-plugins/ui-plugins/initstatevar.ts rename to arkui-plugins/ui-plugins/interop/initstatevar.ts index 3264db1a243506492937198b261acd3bf95b1d9b..daec0378a7f621c5f21e1295daffb7b721c14e05 100644 --- a/arkui-plugins/ui-plugins/initstatevar.ts +++ b/arkui-plugins/ui-plugins/interop/initstatevar.ts @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022-2025 Huawei Device Co., Ltd. + * 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 @@ -16,23 +16,12 @@ import * as arkts from '@koalaui/libarkts'; -import { InteroperAbilityNames } from '../common/predefines'; -import { annotation, backingField, isAnnotation } from '../common/arkts-utils'; -import { getPropertyESValue, getWrapValue, setPropertyESValue } from './interop'; +import { InteroperAbilityNames } from '../../common/predefines'; +import { annotation, backingField, isAnnotation } from '../../common/arkts-utils'; +import { stateProxy, getPropertyESValue, getWrapValue, ifStateHasProxy, setPropertyESValue, hasLink, hasState, hasProvide, hasProp } from './utils'; -export function processNormal(keyName: string, value: arkts.AstNode): arkts.Statement[] { - const result: arkts.Statement[] = []; - const setProperty = setPropertyESValue( - InteroperAbilityNames.PARAM, - keyName, - getWrapValue(value) - ); - result.push(setProperty); - return result; -} - -export function createVariableLet(varName: string, expression: arkts.AstNode): arkts.VariableDeclaration { +function createVariableLet(varName: string, expression: arkts.AstNode): arkts.VariableDeclaration { return arkts.factory.createVariableDeclaration( arkts.Es2pandaModifierFlags.MODIFIER_FLAGS_NONE, arkts.Es2pandaVariableDeclarationKind.VARIABLE_DECLARATION_KIND_LET, @@ -43,7 +32,7 @@ export function createVariableLet(varName: string, expression: arkts.AstNode): a )] ); } -export function setValueCallback(name: string, type: arkts.TypeNode, block: arkts.BlockStatement): arkts.AstNode { +function setValueCallback(name: string, block: arkts.BlockStatement, type?: arkts.TypeNode): arkts.AstNode { return createVariableLet(name, arkts.factory.createArrowFunction( arkts.factory.createScriptFunction( @@ -52,9 +41,16 @@ export function setValueCallback(name: string, type: arkts.TypeNode, block: arkt undefined, [ arkts.factory.createParameterDeclaration( - arkts.factory.createIdentifier('value', type), - undefined, - ), + arkts.factory.createIdentifier( + 'value', + type ?? arkts.factory.createTypeReference( + arkts.factory.createTypeReferencePart( + arkts.factory.createIdentifier('Object') + ) + ) + ), + undefined + ) ], undefined, false @@ -66,29 +62,31 @@ export function setValueCallback(name: string, type: arkts.TypeNode, block: arkt ); } -function createProxyBlock(varName: string): arkts.BlockStatement { +function createProxyBlock(stateVar: () => arkts.Expression): arkts.BlockStatement { return arkts.factory.createBlock( [ arkts.factory.createExpressionStatement( - arkts.factory.createAssignmentExpression( + arkts.factory.createCallExpression( arkts.factory.createMemberExpression( - arkts.factory.createThisExpression(), - arkts.factory.createIdentifier(varName), + stateVar(), + arkts.factory.createIdentifier('set'), arkts.Es2pandaMemberExpressionKind.MEMBER_EXPRESSION_KIND_PROPERTY_ACCESS, false, false ), - arkts.Es2pandaTokenType.TOKEN_TYPE_PUNCTUATOR_SUBSTITUTION, - arkts.factory.createIdentifier('value') + undefined, + [ + arkts.factory.createIdentifier('value') + ] ) ) ] ); } -export function setCallbackForProxy(varName: string, type: arkts.TypeNode): arkts.Statement[] { - const createCallback = setValueCallback(addStatePrefix(varName, 'SetSource'), type, createProxyBlock(varName)); - const createProxyState = createVariableLet(addStatePrefix(varName, 'ProxyState'), +function setCallbackForProxy(stateVar: () => arkts.Expression, type?: arkts.TypeNode): arkts.Statement[] { + const createCallback = setValueCallback('setSource', createProxyBlock(stateVar), type); + const createProxyState = createVariableLet('proxyState', arkts.factory.createCallExpression( arkts.factory.createMemberExpression( arkts.factory.createIdentifier('createState'), @@ -100,49 +98,32 @@ export function setCallbackForProxy(varName: string, type: arkts.TypeNode): arkt undefined, [ getWrapValue( - arkts.factory.createMemberExpression( - arkts.factory.createThisExpression(), - arkts.factory.createIdentifier(varName), - arkts.Es2pandaMemberExpressionKind.MEMBER_EXPRESSION_KIND_PROPERTY_ACCESS, - false, - false + arkts.factory.createCallExpression( + arkts.factory.createMemberExpression( + stateVar(), + arkts.factory.createIdentifier('get'), + arkts.Es2pandaMemberExpressionKind.MEMBER_EXPRESSION_KIND_PROPERTY_ACCESS, + false, + false + ), + undefined, + [] ) ), - getWrapValue(arkts.factory.createIdentifier(addStatePrefix(varName, 'SetSource'))) + getWrapValue(arkts.factory.createIdentifier('setSource')) ] ) ); - const setProxy = arkts.factory.createExpressionStatement( - arkts.factory.createCallExpression( - arkts.factory.createMemberExpression( - arkts.factory.createTSNonNullExpression( - arkts.factory.createMemberExpression( - arkts.factory.createThisExpression(), - arkts.factory.createIdentifier(backingField(varName)), - arkts.Es2pandaMemberExpressionKind.MEMBER_EXPRESSION_KIND_PROPERTY_ACCESS, - false, - false - ) - ), - arkts.factory.createIdentifier('setProxy'), - arkts.Es2pandaMemberExpressionKind.MEMBER_EXPRESSION_KIND_PROPERTY_ACCESS, - false, - false - ), - undefined, - [arkts.factory.createIdentifier(addStatePrefix(varName, 'ProxyState'))], - ) - ); - return [createCallback, createProxyState, setProxy]; + return [createCallback, createProxyState]; } -function createSourceBlock(varName: string): arkts.BlockStatement { +function createSourceBlock(): arkts.BlockStatement { return arkts.factory.createBlock( [ arkts.factory.createExpressionStatement( arkts.factory.createCallExpression( arkts.factory.createMemberExpression( - arkts.factory.createIdentifier(addStatePrefix(varName, 'ProxyState')), + arkts.factory.createIdentifier('proxyState'), arkts.factory.createIdentifier('invokeMethod'), arkts.Es2pandaMemberExpressionKind.MEMBER_EXPRESSION_KIND_PROPERTY_ACCESS, false, @@ -161,13 +142,13 @@ function createSourceBlock(varName: string): arkts.BlockStatement { ); } -function createNotifyBlock(varName: string): arkts.BlockStatement { +function createNotifyBlock(): arkts.BlockStatement { return arkts.factory.createBlock( [ arkts.factory.createExpressionStatement( arkts.factory.createCallExpression( arkts.factory.createMemberExpression( - arkts.factory.createIdentifier(addStatePrefix(varName, 'ProxyState')), + arkts.factory.createIdentifier('proxyState'), arkts.factory.createIdentifier('invokeMethod'), arkts.Es2pandaMemberExpressionKind.MEMBER_EXPRESSION_KIND_PROPERTY_ACCESS, false, @@ -183,9 +164,10 @@ function createNotifyBlock(varName: string): arkts.BlockStatement { ); } -function setNotifyForSource(varName: string): arkts.Statement[] { - const block = createNotifyBlock(varName); - const createCallback = createVariableLet(addStatePrefix(varName, 'NotifyCallback'), +function setCallbackForSource(type?: arkts.TypeNode): arkts.Statement[] { + const createValueCallback = setValueCallback('setProxy', createSourceBlock(), type); + const block = createNotifyBlock(); + const createNotifyCallback = createVariableLet('notifyCallback', arkts.factory.createArrowFunction( arkts.factory.createScriptFunction( block, @@ -211,80 +193,278 @@ function setNotifyForSource(varName: string): arkts.Statement[] { ) ) ); - const setCallback = arkts.factory.createExpressionStatement( + return [createValueCallback, createNotifyCallback]; +} + +function configureState(stateVar: () => arkts.Expression): arkts.Statement { + return arkts.factory.createExpressionStatement( + arkts.factory.createCallExpression( + arkts.factory.createIdentifier('configureState'), + undefined, + [ + stateVar(), + arkts.factory.createIdentifier('proxyState'), + arkts.factory.createIdentifier('setProxy'), + arkts.factory.createIdentifier('notifyCallback'), + ], + ) + ); +} + +function createProxyForState(stateVar: () => arkts.Expression, type?: arkts.TypeNode): arkts.Statement[] { + const setProxy = setCallbackForProxy(stateVar, type); + const setSource = setCallbackForSource(type); + const cfgState = configureState(stateVar); + return [...setProxy, ...setSource, cfgState]; +} + +function createProvideBlock(): arkts.BlockStatement { + const provide = createVariableLet( + 'provide', arkts.factory.createCallExpression( arkts.factory.createMemberExpression( - arkts.factory.createTSNonNullExpression( - arkts.factory.createMemberExpression( - arkts.factory.createThisExpression(), - arkts.factory.createIdentifier(backingField(varName)), - arkts.Es2pandaMemberExpressionKind.MEMBER_EXPRESSION_KIND_PROPERTY_ACCESS, - false, - false + arkts.factory.createThisExpression(), + arkts.factory.createIdentifier('findProvide'), + arkts.Es2pandaMemberExpressionKind.MEMBER_EXPRESSION_KIND_PROPERTY_ACCESS, + false, + false + ), + [ + arkts.factory.createTypeReference( + arkts.factory.createTypeReferencePart( + arkts.factory.createIdentifier('Object') ) - ), - arkts.factory.createIdentifier('setNotifyCallback'), + ) + ], + [ + arkts.factory.createIdentifier('providedPropName') + ] + ) + ); + const setProxy = setStateProxy( + () => arkts.factory.createTSNonNullExpression( + arkts.factory.createIdentifier('provide') + ) + ); + const getProxy = createVariableLet( + 'proxy', + arkts.factory.createCallExpression( + arkts.factory.createMemberExpression( + arkts.factory.createIdentifier('provide'), + arkts.factory.createIdentifier('getProxy'), arkts.Es2pandaMemberExpressionKind.MEMBER_EXPRESSION_KIND_PROPERTY_ACCESS, false, false ), undefined, - [arkts.factory.createIdentifier(addStatePrefix(varName, 'NotifyCallback'))], + undefined ) ); - return [createCallback, setCallback]; + const returnStatement = arkts.factory.createReturnStatement( + arkts.factory.createCallExpression( + arkts.factory.createMemberExpression( + arkts.factory.createIdentifier('proxy'), + arkts.factory.createIdentifier('unwrap'), + arkts.Es2pandaMemberExpressionKind.MEMBER_EXPRESSION_KIND_PROPERTY_ACCESS, + false, + false + ), + undefined, + undefined + ) + ); + return arkts.factory.createBlock([provide, ...setProxy, getProxy, returnStatement]); } -export function setCallbackForSource(varName: string, type: arkts.TypeNode): arkts.Statement[] { - const createCallback = setValueCallback(addStatePrefix(varName, 'SetProxy'), type, createSourceBlock(varName)); - const setFunc = arkts.factory.createExpressionStatement( - arkts.factory.createAssignmentExpression( - arkts.factory.createMemberExpression( - arkts.factory.createTSNonNullExpression( - arkts.factory.createMemberExpression( - arkts.factory.createThisExpression(), - arkts.factory.createIdentifier(backingField(varName)), - arkts.Es2pandaMemberExpressionKind.MEMBER_EXPRESSION_KIND_PROPERTY_ACCESS, - false, - false - ) +export function createProvideInterop(): arkts.Statement[] { + const func = getPropertyESValue( + 'setFindProvideInterop', + 'global', + 'setFindProvideInterop' + ); + const block = createProvideBlock(); + const callback = createVariableLet( + 'findProvideInterop', + arkts.factory.createArrowFunction( + arkts.factory.createScriptFunction( + block, + arkts.factory.createFunctionSignature( + undefined, + [ + arkts.factory.createParameterDeclaration( + arkts.factory.createIdentifier('providedPropName', + arkts.factory.createTypeReference( + arkts.factory.createTypeReferencePart( + arkts.factory.createIdentifier('string') + ) + ) + ), + undefined, + ), + ], + undefined, + false ), - arkts.factory.createIdentifier('setProxyValue'), + arkts.Es2pandaScriptFunctionFlags.SCRIPT_FUNCTION_FLAGS_ARROW, + arkts.Es2pandaModifierFlags.MODIFIER_FLAGS_NONE, + ) + ) + ); + const invokeFunc = arkts.factory.createExpressionStatement( + arkts.factory.createCallExpression( + arkts.factory.createMemberExpression( + arkts.factory.createIdentifier('setFindProvideInterop'), + arkts.factory.createIdentifier('invoke'), arkts.Es2pandaMemberExpressionKind.MEMBER_EXPRESSION_KIND_PROPERTY_ACCESS, false, false ), - arkts.Es2pandaTokenType.TOKEN_TYPE_PUNCTUATOR_SUBSTITUTION, - arkts.factory.createIdentifier(addStatePrefix(varName, 'SetProxy')) + undefined, + [ + arkts.factory.createIdentifier('findProvideInterop') + ] ) ); - const setNotify = setNotifyForSource(varName); - return [createCallback, setFunc, ...setNotify]; + return [func, callback, invokeFunc]; } -export function processLink(keyName: string, value: arkts.AstNode, type: arkts.TypeNode, proxySet: Set): arkts.Statement[] { - const varName = ((value as arkts.MemberExpression).property as arkts.Identifier).name; - const result: arkts.Statement[] = []; - if (!proxySet.has(varName)) { - proxySet.add(varName); - const setProxy = setCallbackForProxy(varName, type); - result.push(...setProxy); - const setSource = setCallbackForSource(varName, type); - result.push(...setSource); - } - const setParam = setPropertyESValue( - 'param', - keyName, - arkts.factory.createIdentifier(addStatePrefix(varName, 'ProxyState')) +/** + * + * @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 setStateProxy(stateVar: () => arkts.Expression, type?: arkts.TypeNode): arkts.Statement[] { + const statements = createProxyForState(stateVar, type) + const ifProxy = ifStateHasProxy(stateVar, arkts.factory.createBlock(statements)); + return [ifProxy]; +} + +function createBackingFieldExpression(varName: string): arkts.TSNonNullExpression { + return arkts.factory.createTSNonNullExpression( + arkts.factory.createMemberExpression( + arkts.factory.createThisExpression(), + arkts.factory.createIdentifier(backingField(varName)), + arkts.Es2pandaMemberExpressionKind.MEMBER_EXPRESSION_KIND_PROPERTY_ACCESS, + false, + false + ) ); - result.push(setParam); - return result; } -export function hasLink(decorators: string[]): boolean { - return decorators.some(decorator => decorator === 'Link'); + +/** + * + * @param keyName + * @param value + * @param type + * @param proxySet + * @returns 处理Link装饰器所生成的互操作代码 + */ +export function processLink(keyName: string, value: arkts.Expression, type: arkts.TypeNode, proxySet: Set): arkts.Statement[] { + const valueDecl = arkts.getDecl(value); + const result: arkts.Statement[] = []; + if (valueDecl instanceof arkts.ClassProperty) { + const annotations = valueDecl.annotations; + const decorators: string[] = annotations.map(annotation => { + return (annotation.expr as arkts.Identifier).name; + }); + + let varName: string; + let stateVar: () => arkts.Expression; + + if (hasState(decorators) || hasProvide(decorators) || hasProp(decorators)) { + varName = ((value as arkts.MemberExpression).property as arkts.Identifier).name; + stateVar = () => createBackingFieldExpression(varName); + } else if (hasLink(decorators)) { + varName = ((value as arkts.MemberExpression).property as arkts.Identifier).name; + const backingLink = createBackingFieldExpression(varName); + const stateName = `${varName}_State`; + if (!proxySet.has(stateName)) { + proxySet.add(stateName); + const getState = createVariableLet( + stateName, + arkts.factory.createCallExpression( + arkts.factory.createMemberExpression( + backingLink, + arkts.factory.createIdentifier('geSource'), + arkts.Es2pandaMemberExpressionKind.MEMBER_EXPRESSION_KIND_PROPERTY_ACCESS, + false, + false + ), + undefined, + undefined + ) + ); + result.push(getState); + } + stateVar = () => arkts.factory.createTSNonNullExpression( + arkts.factory.createIdentifier(stateName) + ); + } else { + throw Error('unsupported decorator for Link') + } + + if (!proxySet.has(stateProxy(varName))) { + proxySet.add(stateProxy(varName)); + const setProxy = setStateProxy(stateVar, type); + 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 + ), + undefined, + undefined + ) + ); + result.push(...setProxy, getProxy); + } + + const setParam = setPropertyESValue( + 'param', + keyName, + arkts.factory.createIdentifier(stateProxy(varName)) + ); + result.push(setParam); + } else { + throw Error('unsupported value for Link'); + } + return result; } -function addStatePrefix(stateVarName: string, name: string): string { - return `${stateVarName}_${name}`; +/** + * + * @param keyName + * @param value + * @returns 处理一般情况下的属性赋值 + */ +export function processNormal(keyName: string, value: arkts.AstNode): arkts.Statement[] { + const result: arkts.Statement[] = []; + const setProperty = setPropertyESValue( + InteroperAbilityNames.PARAM, + keyName, + getWrapValue(value) + ); + result.push(setProperty); + return result; } \ No newline at end of file diff --git a/arkui-plugins/ui-plugins/interop.ts b/arkui-plugins/ui-plugins/interop/interop.ts similarity index 79% rename from arkui-plugins/ui-plugins/interop.ts rename to arkui-plugins/ui-plugins/interop/interop.ts index d6c43d1c7d5c14fed395139969d516ae5d12ec13..267a8d69fe932dbd9ada2f6b45653ddc1ba80632 100644 --- a/arkui-plugins/ui-plugins/interop.ts +++ b/arkui-plugins/ui-plugins/interop/interop.ts @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022-2025 Huawei Device Co., Ltd. + * 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 @@ -16,104 +16,20 @@ import * as arkts from '@koalaui/libarkts'; -import { InteroperAbilityNames } from '../common/predefines'; -import { getCustomComponentOptionsName } from './utils'; -import { InteropContext } from './component-transformer'; -import { annotation, backingField, isAnnotation } from '../common/arkts-utils'; -import { hasLink, processLink, processNormal } from './initstatevar'; +import { InteroperAbilityNames } from '../../common/predefines'; +import { getCustomComponentOptionsName } from '../utils'; +import { InteropContext } from '../component-transformer'; +import { annotation, backingField, isAnnotation } from '../../common/arkts-utils'; +import { createProvideInterop, processLink, processNormal, resetFindProvide } from './initstatevar'; +import { getPropertyESValue, getWrapValue, setPropertyESValue, hasLink, createEmptyESValue, hasProp } from './utils'; interface propertyInfo { decorators: string[], type: arkts.TypeNode, } -export function createEmptyESValue(name: string): arkts.VariableDeclaration { - return arkts.factory.createVariableDeclaration( - arkts.Es2pandaModifierFlags.MODIFIER_FLAGS_NONE, - arkts.Es2pandaVariableDeclarationKind.VARIABLE_DECLARATION_KIND_LET, - [ - arkts.factory.createVariableDeclarator( - arkts.Es2pandaVariableDeclaratorFlag.VARIABLE_DECLARATOR_FLAG_LET, - arkts.factory.createIdentifier(name), - arkts.factory.createCallExpression( - arkts.factory.createMemberExpression( - arkts.factory.createIdentifier(InteroperAbilityNames.ESVALUE), - arkts.factory.createIdentifier(InteroperAbilityNames.INITEMPTYOBJECT), - arkts.Es2pandaMemberExpressionKind.MEMBER_EXPRESSION_KIND_PROPERTY_ACCESS, - false, - false - ), - undefined, - undefined - ) - ) - ] - ); -} - -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.Es2pandaMemberExpressionKind.MEMBER_EXPRESSION_KIND_PROPERTY_ACCESS, - false, - false - ), - undefined, - [value] - ); -} - -export function setPropertyESValue(name: string, key: string, wrapValue: arkts.AstNode): arkts.ExpressionStatement { - return arkts.factory.createExpressionStatement( - arkts.factory.createCallExpression( - arkts.factory.createMemberExpression( - arkts.factory.createIdentifier(name), - arkts.factory.createIdentifier(InteroperAbilityNames.SETPROPERTY), - arkts.Es2pandaMemberExpressionKind.MEMBER_EXPRESSION_KIND_PROPERTY_ACCESS, - false, - false - ), - undefined, - [ - arkts.factory.createStringLiteral(key), - wrapValue - ] - ) - ); -} - -export function getPropertyESValue(result: string, object: string, key: string): arkts.VariableDeclaration { - return arkts.factory.createVariableDeclaration( - arkts.Es2pandaModifierFlags.MODIFIER_FLAGS_NONE, - arkts.Es2pandaVariableDeclarationKind.VARIABLE_DECLARATION_KIND_LET, - [ - arkts.factory.createVariableDeclarator( - arkts.Es2pandaVariableDeclaratorFlag.VARIABLE_DECLARATOR_FLAG_LET, - arkts.factory.createIdentifier(result), - arkts.factory.createCallExpression( - arkts.factory.createMemberExpression( - arkts.factory.createIdentifier(object), - arkts.factory.createIdentifier(InteroperAbilityNames.GETPROPERTY), - arkts.Es2pandaMemberExpressionKind.MEMBER_EXPRESSION_KIND_PROPERTY_ACCESS, - false, - false - ), - undefined, - [arkts.factory.create1StringLiteral(key)] - ) - ) - ] - ); -} - -function initialArgs(args: arkts.ObjectExpression, varMap: Map): arkts.Statement[] { - const result: arkts.Statement[] = [ - createEmptyESValue(InteroperAbilityNames.PARAM), - getPropertyESValue('createState', 'global', 'createStateVariable') - ]; - +function initialArgs(args: arkts.ObjectExpression, varMap: Map, updateProp: arkts.Property[]): arkts.Statement[] { + const result: arkts.Statement[] = []; const proxySet = new Set(); for (const property of args.properties) { @@ -125,14 +41,22 @@ function initialArgs(args: arkts.ObjectExpression, varMap: Map): arkts.BlockStatement { +function createWrapperBlock(context: InteropContext, varMap: Map, + updateProp: arkts.Property[]): arkts.BlockStatement { const className = context.className; const path = context.path; const args = context.arguments; @@ -438,10 +349,16 @@ function createWrapperBlock(context: InteropContext, varMap: Map): arkts.ArrowFunctionExpression { - const block = createWrapperBlock(context, varMap); +function createInitializer(context: InteropContext, varMap: Map, + updateProp: arkts.Property[]): arkts.ArrowFunctionExpression { + const block = createWrapperBlock(context, varMap, updateProp); return arkts.factory.createArrowFunction( arkts.factory.createScriptFunction( block, @@ -477,12 +396,36 @@ function createInitializer(context: InteropContext, varMap: Map): arkts.ArrowFunctionExpression { +function updateStateVars(updateProp: arkts.Property[]): arkts.Statement { + const obj = arkts.factory.createObjectExpression( + arkts.Es2pandaAstNodeType.AST_NODE_TYPE_OBJECT_EXPRESSION, + updateProp, + false + ) + return arkts.factory.createCallExpression( + arkts.factory.createMemberExpression( + arkts.factory.createIdentifier('component'), + arkts.factory.createIdentifier('invokeMethod'), + arkts.Es2pandaMemberExpressionKind.MEMBER_EXPRESSION_KIND_PROPERTY_ACCESS, + false, + false + ), + undefined, + [ + arkts.factory.createStringLiteral('updateStateVars'), + getWrapValue(obj) + ] + ) +} + +function createUpdater(esvalue: arkts.ETSTypeReference, varMap: Map, + updateProp: arkts.Property[]): arkts.ArrowFunctionExpression { + const updateState = updateStateVars(updateProp); return arkts.factory.createArrowFunction( arkts.factory.createScriptFunction( arkts.factory.createBlock( [ - + updateState ] ), arkts.factory.createFunctionSignature( @@ -524,42 +467,6 @@ function generateVarMap(node: arkts.Identifier): Map { return result; } -export function updateArkUICompatible(node: arkts.CallExpression): arkts.CallExpression { - const classInterop = (node.expression as arkts.MemberExpression).object as arkts.Identifier; - const className = classInterop.name; - const args = node.arguments; - const path = (args[0] as arkts.StringLiteral).str; - const line = args[1] instanceof arkts.UndefinedLiteral ? undefined : (args[1] as arkts.NumberLiteral).value; - const col = args[2] instanceof arkts.UndefinedLiteral ? undefined : (args[2] as arkts.NumberLiteral).value; - const options = args[3] instanceof arkts.UndefinedLiteral ? undefined : args[3] as arkts.ObjectExpression; - const context: InteropContext = { - className: className, - path: path, - line: line, - col: col, - arguments: options - }; - - const varMap: Map = generateVarMap(classInterop); - const esvalue = arkts.factory.createTypeReference( - arkts.factory.createTypeReferencePart( - arkts.factory.createIdentifier(InteroperAbilityNames.ESVALUE) - ) - ); - const initializer = createInitializer(context, varMap); - const updater = createUpdater(esvalue, varMap); - return arkts.factory.updateCallExpression( - node, - arkts.factory.createIdentifier(InteroperAbilityNames.ARKUICOMPATIBLE), - undefined, - [ - initializer, - updater, - ] - ); -} - - function generateStructInfo(context: InteropContext): arkts.AstNode[] { const result: arkts.AstNode[] = [ arkts.factory.createStringLiteral(context.path), @@ -571,7 +478,17 @@ function generateStructInfo(context: InteropContext): arkts.AstNode[] { } -export function generateTempCallFunction(context: InteropContext): arkts.CallExpression { +/** + * After Parsed阶段 + * @param {Object} context - 组件上下文信息 + * @param {string} context.className - 组件类名 + * @param {string} context.path - 组件文件路径 + * @param {number} [context.line] - 组件在文件中的行号(可选) + * @param {number} [context.col] - 组件在文件中的列号(可选) + * @param {Object} [context.arguments] - 传递给组件的额外参数(可选) + * @returns {Object} 返回带有互操作标识的1.1组件静态方法,用于承载相关信息 + */ +export function generateInstantiateInterop(context: InteropContext): arkts.CallExpression { return arkts.factory.createCallExpression( arkts.factory.createMemberExpression( arkts.factory.createIdentifier(context.className), @@ -585,6 +502,11 @@ export function generateTempCallFunction(context: InteropContext): arkts.CallExp ); } +/** + * After Checked阶段 + * @param node + * @returns {boolean} 判断节点是否为带有互操作标识的CallExpression + */ export function isArkUICompatible(node: arkts.AstNode): boolean { if (node instanceof arkts.CallExpression && node.expression instanceof arkts.MemberExpression && node.expression.property instanceof arkts.Identifier && @@ -592,4 +514,46 @@ export function isArkUICompatible(node: arkts.AstNode): boolean { return true; } return false; +} + + +/** + * + * @param node + * @returns After Checked阶段,将带有互操作标识的1.1组件静态方法转换为ArkUICompatible函数 + */ +export function generateArkUICompatible(node: arkts.CallExpression): arkts.CallExpression { + const classInterop = (node.expression as arkts.MemberExpression).object as arkts.Identifier; + const className = classInterop.name; + const args = node.arguments; + const path = (args[0] as arkts.StringLiteral).str; + const line = args[1] instanceof arkts.UndefinedLiteral ? undefined : (args[1] as arkts.NumberLiteral).value; + const col = args[2] instanceof arkts.UndefinedLiteral ? undefined : (args[2] as arkts.NumberLiteral).value; + const options = args[3] instanceof arkts.UndefinedLiteral ? undefined : args[3] as arkts.ObjectExpression; + const context: InteropContext = { + className: className, + path: path, + line: line, + col: col, + arguments: options + }; + + 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); + return arkts.factory.updateCallExpression( + node, + arkts.factory.createIdentifier(InteroperAbilityNames.ARKUICOMPATIBLE), + undefined, + [ + initializer, + updater, + ] + ); } \ No newline at end of file diff --git a/arkui-plugins/ui-plugins/legacy-transformer.ts b/arkui-plugins/ui-plugins/interop/legacy-transformer.ts similarity index 83% rename from arkui-plugins/ui-plugins/legacy-transformer.ts rename to arkui-plugins/ui-plugins/interop/legacy-transformer.ts index 2791e019222c5f9bb6579589f04b76242be873d0..872f60966ed2bd13a0cada015bfa13d56b159032 100644 --- a/arkui-plugins/ui-plugins/legacy-transformer.ts +++ b/arkui-plugins/ui-plugins/interop/legacy-transformer.ts @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022-2025 Huawei Device Co., Ltd. + * 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 @@ -13,21 +13,32 @@ * limitations under the License. */ + + import * as arkts from '@koalaui/libarkts'; -import { getInteropPath } from '../path'; +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 { getCustomComponentOptionsName } from './utils'; +import { AbstractVisitor, VisitorOptions } from '../../common/abstract-visitor'; +import { InteroperAbilityNames } from '../../common/predefines'; +import { getCustomComponentOptionsName } from '../utils'; +import { annotation } from 'common/arkts-utils'; interface LegacyTransformerOptions extends VisitorOptions { structList?: string[] } +type ScopeInfo = { + name: string; + isEntry?: boolean; + isComponent?: boolean; + isReusable?: boolean; +}; + export class LegacyTransformer extends AbstractVisitor { private structList: string[] = []; private componentInterfaceCollection: arkts.TSInterfaceDeclaration[] = []; + private scopeInfos: ScopeInfo[] = []; constructor(options?: LegacyTransformerOptions) { const _options: LegacyTransformerOptions = options ?? {}; @@ -35,9 +46,12 @@ export class LegacyTransformer extends AbstractVisitor { this.structList = _options.structList ?? []; } + // TODO: check reset reset(): void { super.reset(); + this.structList = []; this.componentInterfaceCollection = []; + this.scopeInfos = []; } getList(): string[] { @@ -145,10 +159,6 @@ export class LegacyTransformer extends AbstractVisitor { arkts.Es2pandaModifierFlags.MODIFIER_FLAGS_NONE ); - console.log('print legacyclass definition' + newDefinition.dumpSrc()); - - - //TODO: need check if (arkts.isStructDeclaration(node)) { const _node = arkts.factory.createClassDeclaration(newDefinition); _node.modifiers = node.modifiers; @@ -230,19 +240,42 @@ export class LegacyTransformer extends AbstractVisitor { return node; } + enter(node: arkts.AstNode) { + if (arkts.isStructDeclaration(node) && !!node.definition.ident) { + const scopeInfo: ScopeInfo = { name: node.definition.ident.name }; + this.scopeInfos.push(scopeInfo); + } + } + + exit(node: arkts.AstNode) { + if (arkts.isStructDeclaration(node) || arkts.isClassDeclaration(node)) { + if (!node.definition || !node.definition.ident || this.scopeInfos.length === 0) return; + if (this.scopeInfos[this.scopeInfos.length - 1]?.name === node.definition.ident.name) { + this.scopeInfos.pop(); + } + } + } + visitor(node: arkts.AstNode): arkts.AstNode { + this.enter(node); const newNode = this.visitEachChild(node); if (arkts.isEtsScript(newNode)) { return this.processEtsScript(newNode); } if (arkts.isStructDeclaration(newNode)) { - const className = node.definition?.ident?.name; - const memberMap = this.collectComponentMembers(node as arkts.StructDeclaration, className); + const definition = newNode.definition!; + const annotations = definition.annotations; + if (annotations.some(annotation => annotation instanceof arkts.Identifier && annotation.name === 'Component')) { + 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; } - if (arkts.isMethodDefinition(newNode)) { + if (this.scopeInfos.length > 0 && arkts.isMethodDefinition(newNode)) { const kind = newNode.kind; if (kind === arkts.Es2pandaMethodDefinitionKind.METHOD_DEFINITION_KIND_CONSTRUCTOR) { const updateNode = this.processConstructor(newNode); diff --git a/arkui-plugins/ui-plugins/interop/utils.ts b/arkui-plugins/ui-plugins/interop/utils.ts new file mode 100644 index 0000000000000000000000000000000000000000..6fbeea549edb0d46ef9bfcb10d0231ef1d8abbd3 --- /dev/null +++ b/arkui-plugins/ui-plugins/interop/utils.ts @@ -0,0 +1,184 @@ +/* + * 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 { InteroperAbilityNames } from '../../common/predefines'; + + +/** + * + * @param result + * @returns let result = ESValue.instantiateEmptyObject() + */ +export function createEmptyESValue(result: string): arkts.VariableDeclaration { + return arkts.factory.createVariableDeclaration( + arkts.Es2pandaModifierFlags.MODIFIER_FLAGS_NONE, + arkts.Es2pandaVariableDeclarationKind.VARIABLE_DECLARATION_KIND_LET, + [ + arkts.factory.createVariableDeclarator( + arkts.Es2pandaVariableDeclaratorFlag.VARIABLE_DECLARATOR_FLAG_LET, + arkts.factory.createIdentifier(result), + arkts.factory.createCallExpression( + arkts.factory.createMemberExpression( + arkts.factory.createIdentifier(InteroperAbilityNames.ESVALUE), + arkts.factory.createIdentifier(InteroperAbilityNames.INITEMPTYOBJECT), + arkts.Es2pandaMemberExpressionKind.MEMBER_EXPRESSION_KIND_PROPERTY_ACCESS, + false, + false + ), + undefined, + undefined + ) + ) + ] + ); +} + +/** + * + * @param value + * @returns ESValue.wrap(value) + */ +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.Es2pandaMemberExpressionKind.MEMBER_EXPRESSION_KIND_PROPERTY_ACCESS, + false, + false + ), + undefined, + [value] + ); +} + +/** + * + * @param object + * @param key + * @param value + * @returns object.setProperty(key, value) + */ +export function setPropertyESValue(object: string, key: string, value: arkts.AstNode): arkts.ExpressionStatement { + return arkts.factory.createExpressionStatement( + arkts.factory.createCallExpression( + arkts.factory.createMemberExpression( + arkts.factory.createIdentifier(object), + arkts.factory.createIdentifier(InteroperAbilityNames.SETPROPERTY), + arkts.Es2pandaMemberExpressionKind.MEMBER_EXPRESSION_KIND_PROPERTY_ACCESS, + false, + false + ), + undefined, + [ + arkts.factory.createStringLiteral(key), + value + ] + ) + ); +} + +/** + * + * @param result + * @param object + * @param key + * @returns let result = object.getProperty(key) + */ +export function getPropertyESValue(result: string, object: string, key: string): arkts.VariableDeclaration { + return arkts.factory.createVariableDeclaration( + arkts.Es2pandaModifierFlags.MODIFIER_FLAGS_NONE, + arkts.Es2pandaVariableDeclarationKind.VARIABLE_DECLARATION_KIND_LET, + [ + arkts.factory.createVariableDeclarator( + arkts.Es2pandaVariableDeclaratorFlag.VARIABLE_DECLARATOR_FLAG_LET, + arkts.factory.createIdentifier(result), + arkts.factory.createCallExpression( + arkts.factory.createMemberExpression( + arkts.factory.createIdentifier(object), + arkts.factory.createIdentifier(InteroperAbilityNames.GETPROPERTY), + arkts.Es2pandaMemberExpressionKind.MEMBER_EXPRESSION_KIND_PROPERTY_ACCESS, + false, + false + ), + undefined, + [arkts.factory.create1StringLiteral(key)] + ) + ) + ] + ); +} + +/** + * + * @param stateName + * @param block + * @returns if (stateName.getProxy() === undefined) { block } + */ +export function ifStateHasProxy(stateVar: () => arkts.Expression, block: arkts.BlockStatement) { + 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, + undefined, + ), + arkts.factory.createUndefinedLiteral(), + arkts.Es2pandaTokenType.TOKEN_TYPE_PUNCTUATOR_STRICT_EQUAL + ), + block + ); +} + +/** + * + * @param decorators + * @returns 判断是否包含Link装饰器 + */ +export function hasLink(decorators: string[]): boolean { + return decorators.some(decorator => decorator === 'Link'); +} + +export function hasState(decorators: string[]): boolean { + return decorators.some(decorator => decorator === 'State'); +} + +export function hasProp(decorators: string[]): boolean { + return decorators.some(decorator => decorator === 'Prop'); +} + +export function hasProvide(decorators: string[]): boolean { + return decorators.some(decorator => decorator === 'Provide'); +} + +/** + * + * @param stateVarName + * @param name + * @returns 带有状态变量标识的变量命名 + */ +export function stateProxy(stateVarName: string): string { + return `${stateVarName}_State_Proxy`; +} + diff --git a/koala-wrapper/native/src/generated/bridges.cc b/koala-wrapper/native/src/generated/bridges.cc index d89b383f9462046f70aebb5ed3cebe73e231b121..de9e783128181dc6a114f4d2c6da7cf5d0fe42d6 100644 --- a/koala-wrapper/native/src/generated/bridges.cc +++ b/koala-wrapper/native/src/generated/bridges.cc @@ -6643,6 +6643,33 @@ KNativePointer impl_UpdateImportDeclaration(KNativePointer context, KNativePoint } KOALA_INTEROP_6(UpdateImportDeclaration, KNativePointer, KNativePointer, KNativePointer, KNativePointer, KNativePointerArray, KUInt, KInt); +KBoolean impl_ETSImportDeclarationIsDynamicConst(KNativePointer context, KNativePointer receiver) +{ + const auto _context = reinterpret_cast(context); + const auto _receiver = reinterpret_cast(receiver); + auto result = GetImpl()->ETSImportDeclarationIsDynamicConst(_context, _receiver); + return result; +} +KOALA_INTEROP_2(ETSImportDeclarationIsDynamicConst, KBoolean, KNativePointer, KNativePointer); + +KNativePointer impl_ETSImportDeclarationDeclPathConst(KNativePointer context, KNativePointer receiver) +{ + const auto _context = reinterpret_cast(context); + const auto _receiver = reinterpret_cast(receiver); + auto result = GetImpl()->ETSImportDeclarationDeclPathConst(_context, _receiver); + return new std::string(result); +} +KOALA_INTEROP_2(ETSImportDeclarationDeclPathConst, KNativePointer, KNativePointer, KNativePointer); + +KNativePointer impl_ETSImportDeclarationOhmUrlConst(KNativePointer context, KNativePointer receiver) +{ + const auto _context = reinterpret_cast(context); + const auto _receiver = reinterpret_cast(receiver); + auto result = GetImpl()->ETSImportDeclarationOhmUrlConst(_context, _receiver); + return new std::string(result); +} +KOALA_INTEROP_2(ETSImportDeclarationOhmUrlConst, KNativePointer, KNativePointer, KNativePointer); + KNativePointer impl_ImportDeclarationSourceConst(KNativePointer context, KNativePointer receiver) { const auto _context = reinterpret_cast(context); diff --git a/koala-wrapper/src/generated/Es2pandaNativeModule.ts b/koala-wrapper/src/generated/Es2pandaNativeModule.ts index 7dcfda5a9e6fd221976438214656a28cdb7b1448..32761be1a5c71d1fe9e4fcb2330aa94fecf9f27c 100644 --- a/koala-wrapper/src/generated/Es2pandaNativeModule.ts +++ b/koala-wrapper/src/generated/Es2pandaNativeModule.ts @@ -2149,6 +2149,15 @@ export class Es2pandaNativeModule { _UpdateETSImportDeclaration(context: KNativePointer, original: KNativePointer, source: KNativePointer, specifiers: BigUint64Array, specifiersSequenceLength: KUInt, importKind: KInt): KNativePointer { throw new Error("'UpdateETSImportDeclaration was not overloaded by native module initialization") } + _ETSImportDeclarationIsDynamicConst(context: KNativePointer, receiver: KNativePointer): KBoolean { + throw new Error("'ETSImportDeclarationHasDeclConst was not overloaded by native module initialization") + } + _ETSImportDeclarationDeclPathConst(context: KNativePointer, receiver: KNativePointer): KStringPtr { + throw new Error("'ETSImportDeclarationHasDeclConst was not overloaded by native module initialization") + } + _ETSImportDeclarationOhmUrlConst(context: KNativePointer, receiver: KNativePointer): KStringPtr { + throw new Error("'ETSImportDeclarationHasDeclConst was not overloaded by native module initialization") + } _ETSImportDeclarationHasDeclConst(context: KNativePointer, receiver: KNativePointer): KBoolean { throw new Error("'ETSImportDeclarationHasDeclConst was not overloaded by native module initialization") } diff --git a/koala-wrapper/src/generated/peers/ETSImportDeclaration.ts b/koala-wrapper/src/generated/peers/ETSImportDeclaration.ts index 919394d2ab7089a6335718a296ed630d625a7ed3..e4eba7bcd731e500f87788ef691db41ef9f0e333 100644 --- a/koala-wrapper/src/generated/peers/ETSImportDeclaration.ts +++ b/koala-wrapper/src/generated/peers/ETSImportDeclaration.ts @@ -61,6 +61,15 @@ export class ETSImportDeclaration extends ImportDeclaration { get resolvedSource(): StringLiteral | undefined { return unpackNode(global.generatedEs2panda._ETSImportDeclarationResolvedSourceConst(global.context, this.peer)) } + get isDynamic(): boolean { + return global.generatedEs2panda._ETSImportDeclarationIsDynamicConst(global.context, this.peer); + } + get declPath(): string { + return unpackString(global.generatedEs2panda._ETSImportDeclarationDeclPathConst(global.context, this.peer)); + } + get ohmUrl(): string { + return unpackString(global.generatedEs2panda._ETSImportDeclarationOhmUrlConst(global.context, this.peer)); + } } export function isETSImportDeclaration(node: AstNode): node is ETSImportDeclaration { return node instanceof ETSImportDeclaration