diff --git a/arkui-plugins/memo-plugins/function-transformer.ts b/arkui-plugins/memo-plugins/function-transformer.ts index fb059b409db8920833821960f34c0ecdb1707498..5de9ad53f8e24422ab7a7494159c9926ce9fa678 100644 --- a/arkui-plugins/memo-plugins/function-transformer.ts +++ b/arkui-plugins/memo-plugins/function-transformer.ts @@ -48,7 +48,7 @@ import { isStandaloneArrowFunction, isThisAttributeAssignment, removeMemoAnnotation, - parametrizedNodeHasReceiver + parametrizedNodeHasReceiver, } from './utils'; import { ParameterTransformer } from './parameter-transformer'; import { ReturnTransformer } from './return-transformer'; @@ -310,7 +310,7 @@ export class FunctionTransformer extends AbstractVisitor { decl: arkts.MethodDefinition, ignoreSelf: boolean = false ): arkts.CallExpression { - let updatedArguments: arkts.AstNode[] = node.arguments.map((it, index) => { + let updatedArguments: arkts.Expression[] = node.arguments.map((it, index) => { const param = decl.scriptFunction.params.at(index); if (!param || !arkts.isEtsParameterExpression(param)) { return it; @@ -327,7 +327,7 @@ export class FunctionTransformer extends AbstractVisitor { if (!ignoreSelf) { this.checkMemoCallInMethod(decl); updatedArguments = [ - ...factory.createHiddenArguments(this.positionalIdTracker.id(decl.name.name)), + ...(factory.createHiddenArguments(this.positionalIdTracker.id(decl.name.name)) as arkts.Expression[]), ...updatedArguments, ]; } @@ -339,7 +339,7 @@ export class FunctionTransformer extends AbstractVisitor { updatedArguments = moveToFront(updatedArguments, 2); } this.modified = true; - return arkts.factory.updateCallExpression(node, node.expression, node.typeArguments, updatedArguments); + return arkts.factory.updateCallExpression(node, node.callee, updatedArguments, node.typeParams); } private updateDeclaredCallWithName(node: arkts.CallExpression, name: string): arkts.CallExpression { @@ -348,15 +348,15 @@ export class FunctionTransformer extends AbstractVisitor { } private updateAnonymousCallWithMemoParams(node: arkts.CallExpression): arkts.CallExpression { - let newExpression: arkts.AstNode = node.expression; - if (isStandaloneArrowFunction(node.expression)) { - newExpression = arkts.factory.updateArrowFunction( - node.expression, - this.signatureTransformer.visitor(node.expression.scriptFunction) + let newCallee = node.callee; + if (!!node.callee && isStandaloneArrowFunction(node.callee)) { + newCallee = arkts.factory.updateArrowFunction( + node.callee, + this.signatureTransformer.visitor(node.callee.scriptFunction) ); } const that = this; - const updatedArguments: arkts.AstNode[] = node.arguments.map((it) => { + const updatedArguments: arkts.Expression[] = node.arguments.map((it) => { if (arkts.isArrowFunctionExpression(it) && isMemoArrowFunction(it)) { that.enterAnonymousScope(it.scriptFunction); const res = that.updateScriptFunction(it.scriptFunction); @@ -367,7 +367,7 @@ export class FunctionTransformer extends AbstractVisitor { return it; }); this.modified ||= this.signatureTransformer.modified; - return arkts.factory.updateCallExpression(node, newExpression, node.typeArguments, updatedArguments); + return arkts.factory.updateCallExpression(node, newCallee, updatedArguments, node.typeParams); } private updateAnonymousMemoCall( @@ -394,21 +394,24 @@ export class FunctionTransformer extends AbstractVisitor { return arkts.factory.updateCallExpression( node, arkts.factory.updateArrowFunction(expression, res), - newNode.typeArguments, - [...factory.createHiddenArguments(this.positionalIdTracker.id()), ...newNode.arguments] + [ + ...factory.createHiddenArguments(this.positionalIdTracker.id()), + ...newNode.arguments, + ], + newNode.typeParams ); } private updateCallExpressionWithNoDecl(node: arkts.CallExpression): arkts.CallExpression { - if (isStandaloneArrowFunction(node.expression)) { - return this.updateAnonymousMemoCall(node, node.expression); + if (!!node.callee && isStandaloneArrowFunction(node.callee)) { + return this.updateAnonymousMemoCall(node, node.callee); } return this.updateAnonymousCallWithMemoParams(node); } private updateCallExpression(node: arkts.CallExpression): arkts.CallExpression { - const expr = node.expression; - const decl = getDeclResolveAlias(expr); + const expr = node.callee; + const decl = expr && getDeclResolveAlias(expr); if (!decl) { return this.updateCallExpressionWithNoDecl(node); } diff --git a/arkui-plugins/memo-plugins/memo-factory.ts b/arkui-plugins/memo-plugins/memo-factory.ts index 37eed959b1d779988e23d86a63d8bfc13f68966e..22fe95fdee0d62760dd1140e4da0f434b39d7bb6 100644 --- a/arkui-plugins/memo-plugins/memo-factory.ts +++ b/arkui-plugins/memo-plugins/memo-factory.ts @@ -129,17 +129,17 @@ export class factory { } // Arguments - static createContextArgument(): arkts.AstNode { + static createContextArgument(): arkts.Expression { return arkts.factory.createIdentifier(RuntimeNames.CONTEXT); } - static createIdArgument(hash: arkts.NumberLiteral | arkts.StringLiteral): arkts.AstNode { + static createIdArgument(hash: arkts.NumberLiteral | arkts.StringLiteral): arkts.Expression { return arkts.factory.createBinaryExpression( arkts.factory.createIdentifier(RuntimeNames.ID), hash, arkts.Es2pandaTokenType.TOKEN_TYPE_PUNCTUATOR_PLUS ); } - static createHiddenArguments(hash: arkts.NumberLiteral | arkts.StringLiteral): arkts.AstNode[] { + static createHiddenArguments(hash: arkts.NumberLiteral | arkts.StringLiteral): arkts.Expression[] { return [factory.createContextArgument(), factory.createIdArgument(hash)]; } @@ -166,8 +166,8 @@ export class factory { false, false ), + [arkts.factory.createNumericLiteral(id), originalIdent], undefined, - [arkts.factory.createNumericLiteral(id), originalIdent] ) ); } @@ -199,8 +199,8 @@ export class factory { false, false ), + [...updatedArgs] as arkts.Expression[], undefined, - [...updatedArgs] ); } @@ -225,10 +225,10 @@ export class factory { false, false ), - returnTypeAnnotation + [factory.createIdArgument(hash), arkts.factory.createNumericLiteral(cnt)], + arkts.TSTypeParameterInstantiation.createTSTypeParameterInstantiation(returnTypeAnnotation ? [returnTypeAnnotation] - : [arkts.factory.createPrimitiveType(arkts.Es2pandaPrimitiveType.PRIMITIVE_TYPE_VOID)], - [factory.createIdArgument(hash), arkts.factory.createNumericLiteral(cnt)] + : [arkts.factory.createPrimitiveType(arkts.Es2pandaPrimitiveType.PRIMITIVE_TYPE_VOID)]) ) ), ] @@ -243,8 +243,8 @@ export class factory { false, false ), + (arg ? [arg] : []) as arkts.Expression[], undefined, - arg ? [arg] : undefined ); } static createReturnThis(): arkts.BlockStatement { @@ -322,8 +322,8 @@ export class factory { false, false ), + [factory.createIdArgument(hash), factory.createLambdaWrapper(node)], undefined, - [factory.createIdArgument(hash), factory.createLambdaWrapper(node)] ); } @@ -391,9 +391,9 @@ export class factory { node: arkts.CallExpression, hash: arkts.NumberLiteral | arkts.StringLiteral ): arkts.CallExpression { - return arkts.factory.updateCallExpression(node, node.expression, node.typeArguments, [ + return arkts.factory.updateCallExpression(node, node.callee, [ ...factory.createHiddenArguments(hash), ...node.arguments, - ]); + ], node.typeParams); } } diff --git a/arkui-plugins/memo-plugins/parameter-transformer.ts b/arkui-plugins/memo-plugins/parameter-transformer.ts index 061e5b80b82944bbea6835b2883be3e88afa0174..3e66f775bcb1c2212b023a35a57479a61d4bfcbe 100644 --- a/arkui-plugins/memo-plugins/parameter-transformer.ts +++ b/arkui-plugins/memo-plugins/parameter-transformer.ts @@ -282,15 +282,15 @@ export class ParameterTransformer extends AbstractVisitor { if (arkts.isVariableDeclaration(beforeChildren)) { return this.updateVariableReDeclarationFromParam(beforeChildren); } - if (arkts.isCallExpression(beforeChildren) && arkts.isIdentifier(beforeChildren.expression)) { - const decl = arkts.getPeerDecl(beforeChildren.expression.originalPeer); + if (arkts.isCallExpression(beforeChildren) && !! beforeChildren.callee && arkts.isIdentifier(beforeChildren.callee)) { + const decl = arkts.getPeerDecl(beforeChildren.callee.originalPeer); if (decl && this.rewriteCalls?.has(decl.peer)) { const updateCall = this.rewriteCalls.get(decl.peer)!( beforeChildren.arguments.map((it) => this.visitor(it) as arkts.Expression) ); if (this.rewriteMemoInfos?.has(decl.peer)) { const memoInfo = this.rewriteMemoInfos.get(decl.peer)!; - return this.updateCallReDeclare(updateCall, beforeChildren.expression, memoInfo); + return this.updateCallReDeclare(updateCall, beforeChildren.callee, memoInfo); } return updateCall; } diff --git a/arkui-plugins/memo-plugins/utils.ts b/arkui-plugins/memo-plugins/utils.ts index 31cb1ff549ed69e08669616d60621cdbbd3be071..76c3a9e563b4877ab80976b9843448ca4536bf0b 100644 --- a/arkui-plugins/memo-plugins/utils.ts +++ b/arkui-plugins/memo-plugins/utils.ts @@ -265,7 +265,7 @@ export function isStandaloneArrowFunction(node: arkts.AstNode): node is arkts.Ar if (!arkts.isArrowFunctionExpression(node)) return false; // handling anonymous arrow function call - if (!!node.parent && arkts.isCallExpression(node.parent) && node.parent.expression.peer === node.peer) { + if (!!node.parent && arkts.isCallExpression(node.parent) && !!node.parent.callee && node.parent.callee.peer === node.peer) { return true; } @@ -273,7 +273,7 @@ export function isStandaloneArrowFunction(node: arkts.AstNode): node is arkts.Ar !!node.parent && !arkts.isVariableDeclarator(node.parent) && !arkts.isClassProperty(node.parent) && - !(arkts.isCallExpression(node.parent) && node.parent.expression) + !(arkts.isCallExpression(node.parent) && node.parent.callee) ); } diff --git a/arkui-plugins/ui-plugins/builder-lambda-translators/factory.ts b/arkui-plugins/ui-plugins/builder-lambda-translators/factory.ts index 8d3d688f13f4348eec115efb277e9c0852951ab0..4c61b81cc388725ccdefbd08bec9bc4c14e399d6 100644 --- a/arkui-plugins/ui-plugins/builder-lambda-translators/factory.ts +++ b/arkui-plugins/ui-plugins/builder-lambda-translators/factory.ts @@ -126,7 +126,7 @@ export class factory { * transform arguments in style node. */ static getTransformedStyle(call: arkts.CallExpression): arkts.Expression[] { - const decl = arkts.getDecl(call.expression); + const decl = call.callee ? arkts.getDecl(call.callee) : undefined; if (!decl || !arkts.isMethodDefinition(decl)) { return [...call.arguments]; } @@ -171,24 +171,24 @@ export class factory { return arkts.factory.createCallExpression( arkts.factory.createMemberExpression( lambdaBody, - callInfo.call.expression, + callInfo.call.callee!, arkts.Es2pandaMemberExpressionKind.MEMBER_EXPRESSION_KIND_PROPERTY_ACCESS, false, false ), - undefined, newArgs.map((arg) => { if (arkts.isArrowFunctionExpression(arg)) { return this.processArgArrowFunction(arg, projectConfig); } return arg; - }) + }), + undefined, ); } else { - return arkts.factory.createCallExpression(callInfo.call.expression, callInfo.call.typeArguments, [ + return arkts.factory.createCallExpression(callInfo.call.callee, [ lambdaBody, ...callInfo.call.arguments.slice(1), - ]); + ] as arkts.Expression[], callInfo.call.typeParams,); } } @@ -507,7 +507,7 @@ export class factory { if (!callIsGoodForBuilderLambda(leaf)) { return undefined; } - const node = leaf.expression; + const node = leaf.callee; const funcName = builderLambdaFunctionName(leaf); if (!funcName) { return undefined; @@ -515,7 +515,7 @@ export class factory { if (arkts.isIdentifier(node)) { return arkts.factory.createIdentifier(funcName); } - if (arkts.isMemberExpression(node)) { + if (node && arkts.isMemberExpression(node)) { return arkts.factory.createMemberExpression( node.object, arkts.factory.createIdentifier(funcName), @@ -562,17 +562,17 @@ export class factory { curIdx++; continue; } - const property: arkts.Identifier = instanceCalls[curIdx].call.expression as arkts.Identifier; + const property: arkts.Identifier = instanceCalls[curIdx].call.callee as arkts.Identifier; if (property.name === AnimationNames.ANIMATION) { const aniStart: arkts.CallExpression = arkts.factory.createCallExpression( arkts.factory.createIdentifier(AnimationNames.ANIMATION_START), - undefined, - instanceCalls[curIdx].call.arguments + instanceCalls[curIdx].call.arguments, + undefined ); const aniStop: arkts.CallExpression = arkts.factory.createCallExpression( arkts.factory.createIdentifier(AnimationNames.ANIMATION_STOP), - undefined, - instanceCalls[curIdx].call.arguments.map((arg) => arg.clone()) + instanceCalls[curIdx].call.arguments.map((arg) => arg.clone()), + undefined ); instanceCalls.splice(lastAniIdx, 0, { isReceiver: false, call: aniStart }); instanceCalls[curIdx + 1] = { isReceiver: false, call: aniStop }; @@ -596,18 +596,18 @@ export class factory { instanceCalls.push({ isReceiver: false, call: arkts.factory.createCallExpression( - (leaf.expression as arkts.MemberExpression).property, - leaf.typeArguments, - leaf.arguments + (leaf.callee as arkts.MemberExpression).property, + leaf.arguments, + leaf.typeParams, ), }); - leaf = (leaf.expression as arkts.MemberExpression).object as arkts.CallExpression; + leaf = (leaf.callee as arkts.MemberExpression).object as arkts.CallExpression; } if (isStyleWithReceiverCall(leaf)) { instanceCalls.push({ isReceiver: true, - call: arkts.factory.createCallExpression(leaf.expression, leaf.typeArguments, leaf.arguments), + call: arkts.factory.createCallExpression(leaf.callee, leaf.arguments, leaf.typeParams), }); leaf = leaf.arguments[0] as arkts.CallExpression; } @@ -640,7 +640,7 @@ export class factory { declInfo, projectConfig ); - return arkts.factory.updateCallExpression(node, replace, leaf.typeArguments, filterDefined(args)); + return arkts.factory.updateCallExpression(node, replace, filterDefined(args) as arkts.Expression[], leaf.typeParams); } /* diff --git a/arkui-plugins/ui-plugins/builder-lambda-translators/utils.ts b/arkui-plugins/ui-plugins/builder-lambda-translators/utils.ts index 7aac15fc1779275eb7aedafbf4e8e2cd6364c2a3..1e1e7d8eaca3c14559778e8c50f3c8c176e1b697 100644 --- a/arkui-plugins/ui-plugins/builder-lambda-translators/utils.ts +++ b/arkui-plugins/ui-plugins/builder-lambda-translators/utils.ts @@ -93,10 +93,13 @@ export function isFunctionWithReceiverCall(node: arkts.Identifier): boolean { * @param node call expression node */ export function isStyleChainedCall(node: arkts.CallExpression): boolean { + if (!node.callee) { + return false; + } return ( - arkts.isMemberExpression(node.expression) && - arkts.isIdentifier(node.expression.property) && - arkts.isCallExpression(node.expression.object) + arkts.isMemberExpression(node.callee) && + arkts.isIdentifier(node.callee.property) && + arkts.isCallExpression(node.callee.object) ); } @@ -106,9 +109,12 @@ export function isStyleChainedCall(node: arkts.CallExpression): boolean { * @param node call expression node */ export function isStyleWithReceiverCall(node: arkts.CallExpression): boolean { + if (!node.callee) { + return false; + } return ( - arkts.isIdentifier(node.expression) && - isFunctionWithReceiverCall(node.expression) && + arkts.isIdentifier(node.callee) && + isFunctionWithReceiverCall(node.callee) && !!node.arguments.length && arkts.isCallExpression(node.arguments[0]) ); @@ -155,10 +161,10 @@ export function getDeclForBuilderLambda(node: arkts.AstNode): arkts.AstNode | un while ( !!currNode && arkts.isCallExpression(currNode) && - !!currNode.expression && - arkts.isMemberExpression(currNode.expression) + !!currNode.callee && + arkts.isMemberExpression(currNode.callee) ) { - const _node: arkts.MemberExpression = currNode.expression; + const _node: arkts.MemberExpression = currNode.callee; if (!!_node.property && arkts.isIdentifier(_node.property) && isBuilderLambdaCall(_node.property)) { return node; @@ -178,8 +184,8 @@ export function getDeclForBuilderLambda(node: arkts.AstNode): arkts.AstNode | un } export function isBuilderLambdaCall(node: arkts.CallExpression | arkts.Identifier): boolean { - const expr = arkts.isIdentifier(node) ? node : node.expression; - const decl = arkts.getDecl(expr); + const expr = arkts.isIdentifier(node) ? node : node.callee; + const decl = expr ? arkts.getDecl(expr) : undefined; if (!decl) { return false; @@ -265,8 +271,8 @@ export function findBuilderLambdaInCall( } export function findBuilderLambdaDecl(node: arkts.CallExpression | arkts.Identifier): arkts.AstNode | undefined { - const expr = arkts.isIdentifier(node) ? node : node.expression; - const decl = arkts.getDecl(expr); + const expr = arkts.isIdentifier(node) ? node : node.callee; + const decl = expr ? arkts.getDecl(expr) : undefined; if (!decl) { return undefined; } @@ -326,8 +332,8 @@ export function isBuilderLambdaFunctionCall(decl: arkts.AstNode | undefined): bo } export function callIsGoodForBuilderLambda(leaf: arkts.CallExpression): boolean { - const node = leaf.expression; - return arkts.isIdentifier(node) || arkts.isMemberExpression(node); + const node = leaf.callee; + return arkts.isIdentifier(node) || (!!node && arkts.isMemberExpression(node)); } export function isSafeType(type: arkts.TypeNode | undefined): boolean { @@ -352,12 +358,12 @@ export function builderLambdaType(leaf: arkts.CallExpression): arkts.Identifier if (!callIsGoodForBuilderLambda(leaf)) { return undefined; } - const node = leaf.expression; + const node = leaf.callee; let name: arkts.Identifier | undefined; if (arkts.isIdentifier(node)) { name = node; } - if (arkts.isMemberExpression(node) && arkts.isIdentifier(node.object)) { + if (!!node && arkts.isMemberExpression(node) && arkts.isIdentifier(node.object)) { name = node.object; } return name; @@ -368,13 +374,14 @@ export function builderLambdaFunctionName(node: arkts.CallExpression): string | if (!annotation) { return undefined; } - if (arkts.isIdentifier(node.expression)) { - return node.expression.name; + if (arkts.isIdentifier(node.callee)) { + return node.callee.name; } if ( - arkts.isMemberExpression(node.expression) && - arkts.isIdentifier(node.expression.property) && - node.expression.property.name === BuilderLambdaNames.ORIGIN_METHOD_NAME + !!node.callee && + arkts.isMemberExpression(node.callee) && + arkts.isIdentifier(node.callee.property) && + node.callee.property.name === BuilderLambdaNames.ORIGIN_METHOD_NAME ) { return BuilderLambdaNames.TRANSFORM_METHOD_NAME; } @@ -419,7 +426,7 @@ export function isDoubleDollarCall( return false; } if ( - !(!!value.expression && arkts.isIdentifier(value.expression) && value.expression.name === Dollars.DOLLAR_DOLLAR) + !(!!value.callee && arkts.isIdentifier(value.callee) && value.callee.name === Dollars.DOLLAR_DOLLAR) ) { return false; } diff --git a/arkui-plugins/ui-plugins/component-transformer.ts b/arkui-plugins/ui-plugins/component-transformer.ts index 10a9c2b524d6e5589a9d6de1e092348f9961b481..ded026222fe0dc8f9239dc3fd01a0eec734dacca 100644 --- a/arkui-plugins/ui-plugins/component-transformer.ts +++ b/arkui-plugins/ui-plugins/component-transformer.ts @@ -473,7 +473,7 @@ export class ComponentTransformer extends AbstractVisitor { } processInteropCall(node: arkts.CallExpression): arkts.CallExpression { - const ident = node.expression; + const ident = node.callee; if (!(ident instanceof arkts.Identifier)) { return node; } diff --git a/arkui-plugins/ui-plugins/entry-translators/factory.ts b/arkui-plugins/ui-plugins/entry-translators/factory.ts index 09d1c85b7f988633145c62c6a30d163999883027..d03214a7bebeceac57d88d71b5096b6a84e339c5 100644 --- a/arkui-plugins/ui-plugins/entry-translators/factory.ts +++ b/arkui-plugins/ui-plugins/entry-translators/factory.ts @@ -80,7 +80,7 @@ export class factory { */ static generateEntryFunction(name: string): arkts.MethodDefinition { const exp = arkts.factory.createExpressionStatement( - arkts.factory.createCallExpression(arkts.factory.createIdentifier(name), undefined, []) + arkts.factory.createCallExpression(arkts.factory.createIdentifier(name), [], undefined) ); const key: arkts.Identifier = arkts.factory.createIdentifier(EntryWrapperNames.ENTRY_FUNC); const block = arkts.factory.createBlock([exp]); @@ -143,8 +143,8 @@ export class factory { const exp = arkts.factory.createExpressionStatement( arkts.factory.createCallExpression( arkts.factory.createIdentifier(name), + [], undefined, - [] ) ); const key: arkts.Identifier = arkts.factory.createIdentifier(EntryWrapperNames.ENTRY_FUNC); diff --git a/arkui-plugins/ui-plugins/interop/initstatevar.ts b/arkui-plugins/ui-plugins/interop/initstatevar.ts index 9a8c143e9c2f38cf35ac9cf8685e465bd74093e0..92035547f136aeb0ccbdcac2e8375cb05dce6588 100644 --- a/arkui-plugins/ui-plugins/interop/initstatevar.ts +++ b/arkui-plugins/ui-plugins/interop/initstatevar.ts @@ -74,10 +74,10 @@ function createProxyBlock(stateVar: () => arkts.Expression): arkts.BlockStatemen false, false ), - undefined, [ arkts.factory.createIdentifier('value') - ] + ], + undefined, ) ) ] @@ -95,7 +95,6 @@ function setCallbackForProxy(stateVar: () => arkts.Expression, type?: arkts.Type false, false ), - undefined, [ getWrapValue( arkts.factory.createCallExpression( @@ -111,7 +110,8 @@ function setCallbackForProxy(stateVar: () => arkts.Expression, type?: arkts.Type ) ), getWrapValue(arkts.factory.createIdentifier('setSource')) - ] + ], + undefined, ) ); return [createCallback, createProxyState]; @@ -129,13 +129,13 @@ function createSourceBlock(): arkts.BlockStatement { false, false ), - undefined, [ arkts.factory.createStringLiteral('set'), getWrapValue( arkts.factory.createIdentifier('value') ) - ] + ], + undefined, ) ) ] @@ -154,10 +154,10 @@ function createNotifyBlock(): arkts.BlockStatement { false, false ), - undefined, [ arkts.factory.createStringLiteral('notifyPropertyHasChangedPU') - ] + ], + undefined, ) ) ] @@ -200,13 +200,13 @@ function bindCompatibleState(stateVar: () => arkts.Expression): arkts.Statement return arkts.factory.createExpressionStatement( arkts.factory.createCallExpression( arkts.factory.createIdentifier(InteroperAbilityNames.CONFIGURESTATE), - undefined, [ stateVar(), arkts.factory.createIdentifier('proxyState'), arkts.factory.createIdentifier('setProxy'), arkts.factory.createIdentifier('notifyCallback'), ], + undefined, ) ); } @@ -247,10 +247,10 @@ function setAndGetProxy(varName: string, type: arkts.TypeNode, stateVar: () => a stateProxy(varName), arkts.factory.createCallExpression( arkts.factory.createIdentifier(InteroperAbilityNames.GETPROXY), - undefined, [ stateVar() - ] + ], + undefined, ) ); result.push(...setProxy, getProxy); @@ -268,10 +268,10 @@ function linkGetSource(varName: string, proxySet: Set): arkts.Statement[ stateName, arkts.factory.createCallExpression( arkts.factory.createIdentifier(InteroperAbilityNames.GETSOURCE), - undefined, [ backingLink - ] + ], + undefined, ) ); result.push(getState); diff --git a/arkui-plugins/ui-plugins/interop/interop.ts b/arkui-plugins/ui-plugins/interop/interop.ts index 946dc441a5c2bd89333423a0b33a86da65e828ba..f3a4b7fadb7de0eb13d24fdbdee7c3e3a9f8c41b 100644 --- a/arkui-plugins/ui-plugins/interop/interop.ts +++ b/arkui-plugins/ui-plugins/interop/interop.ts @@ -80,8 +80,8 @@ function instantiateComponent(params: arkts.AstNode[]): arkts.VariableDeclaratio false, false ), + params, undefined, - params ) ) ] @@ -294,8 +294,8 @@ function createComponent(moduleName: string, className: string): arkts.Statement false, false ), + [arkts.factory.create1StringLiteral(InteroperAbilityNames.OHMURL)], undefined, - [arkts.factory.create1StringLiteral(InteroperAbilityNames.OHMURL)] ) ) ] @@ -330,10 +330,10 @@ function invokeViewPUCreate(): arkts.Statement[] { false, false ), - undefined, [ arkts.factory.createIdentifier(InteroperAbilityNames.COMPONENT) - ] + ], + undefined, ) ); body.push(viewPUCreate); @@ -411,11 +411,11 @@ function updateStateVars(updateProp: arkts.Property[]): arkts.Statement { false, false ), - undefined, [ arkts.factory.createStringLiteral('updateStateVars'), getWrapValue(obj) - ] + ], + undefined, ); } @@ -503,8 +503,8 @@ export function generateInstantiateInterop(context: InteropContext): arkts.CallE false, false ), + generateStructInfo(context), undefined, - generateStructInfo(context) ); } @@ -514,9 +514,9 @@ export function generateInstantiateInterop(context: InteropContext): arkts.CallE * @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 && - node.expression.property instanceof arkts.Identifier && - node.expression.property.name === 'instantiate_Interop') { + if (node instanceof arkts.CallExpression && node.callee instanceof arkts.MemberExpression && + node.callee.property instanceof arkts.Identifier && + node.callee.property.name === 'instantiate_Interop') { return true; } return false; @@ -529,7 +529,7 @@ export function isArkUICompatible(node: arkts.AstNode): boolean { * @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; + const classInterop = (node.callee as arkts.MemberExpression).object as arkts.Identifier; const className = classInterop.name; const args = node.arguments; const path = (args[0] as arkts.StringLiteral).str; @@ -551,10 +551,10 @@ export function generateArkUICompatible(node: arkts.CallExpression): arkts.CallE return arkts.factory.updateCallExpression( node, arkts.factory.createIdentifier(InteroperAbilityNames.ARKUICOMPATIBLE), - undefined, [ initializer, updater, - ] + ], + undefined ); } \ 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 19732e624bb2257139483669cce356da77b294f1..91957bef6d7a4e7b0814afd2bb17e5a4273f7ba5 100644 --- a/arkui-plugins/ui-plugins/interop/provide.ts +++ b/arkui-plugins/ui-plugins/interop/provide.ts @@ -32,16 +32,12 @@ function findProvide(): arkts.Statement { false, false ), - [ + [arkts.factory.createIdentifier(InteropProvideNames.PROVIDEDPROPNAME)], + arkts.TSTypeParameterInstantiation.createTSTypeParameterInstantiation([ arkts.factory.createTypeReference( - arkts.factory.createTypeReferencePart( - arkts.factory.createIdentifier('Object') - ) - ) - ], - [ - arkts.factory.createIdentifier(InteropProvideNames.PROVIDEDPROPNAME) - ] + arkts.factory.createTypeReferencePart(arkts.factory.createIdentifier('Object')) + ), + ]) ) ); } @@ -59,12 +55,12 @@ function getProvideProxy(): arkts.Statement { 'proxy', arkts.factory.createCallExpression( arkts.factory.createIdentifier(InteroperAbilityNames.GETPROXY), - undefined, [ arkts.factory.createTSNonNullExpression( arkts.factory.createIdentifier(InteropProvideNames.STATICPROVIDE) ) - ] + ], + undefined, ) ); } @@ -160,10 +156,10 @@ export function createProvideInterop(): arkts.Statement[] { false, false ), - undefined, [ arkts.factory.createIdentifier(InteropProvideNames.FINDPROVIDECALLBACK) - ] + ], + undefined, ) ); return [viewPUFunc, componentFunc, callback, invokeFunc]; @@ -180,11 +176,11 @@ export function setAndResetFindProvide(): arkts.Statement[] { false, false ), - undefined, [ arkts.factory.createIdentifier(InteroperAbilityNames.COMPONENT), arkts.factory.createIdentifier(InteropProvideNames.FINDPROVIDECALLBACK) - ] + ], + undefined, ) ); const resetViewPU = arkts.factory.createExpressionStatement( @@ -196,10 +192,10 @@ export function setAndResetFindProvide(): arkts.Statement[] { false, false ), - undefined, [ arkts.factory.createStringLiteral('resetFindInterop') - ] + ], + undefined, ) ); return [setComponent, resetViewPU]; diff --git a/arkui-plugins/ui-plugins/interop/utils.ts b/arkui-plugins/ui-plugins/interop/utils.ts index c26e4051be20f232a056136a455d4e3fa4240bc0..7b8682d16b0f336eb24cfa2f8a65b5c3552b59c0 100644 --- a/arkui-plugins/ui-plugins/interop/utils.ts +++ b/arkui-plugins/ui-plugins/interop/utils.ts @@ -84,11 +84,11 @@ export function setPropertyESValue(object: string, key: string, value: arkts.Ast false, false ), - undefined, [ arkts.factory.createStringLiteral(key), value - ] + ], + undefined, ) ); } @@ -116,8 +116,8 @@ export function getPropertyESValue(result: string, obj: string, key: string): ar false, false ), + [arkts.factory.create1StringLiteral(key)], undefined, - [arkts.factory.create1StringLiteral(key)] ) ) ] @@ -135,10 +135,10 @@ export function ifStateHasProxy(stateVar: () => arkts.Expression, block: arkts.B arkts.factory.createBinaryExpression( arkts.factory.createCallExpression( arkts.factory.createIdentifier(InteroperAbilityNames.GETPROXY), - undefined, [ stateVar() - ] + ], + undefined, ), arkts.factory.createUndefinedLiteral(), arkts.Es2pandaTokenType.TOKEN_TYPE_PUNCTUATOR_STRICT_EQUAL diff --git a/arkui-plugins/ui-plugins/property-translators/base.ts b/arkui-plugins/ui-plugins/property-translators/base.ts index a553aaa7f79d95ae4714a6235e5d69d0701cbdb9..03a28368774a3a512d5e9dfa5afe9467f2fcc3d0 100644 --- a/arkui-plugins/ui-plugins/property-translators/base.ts +++ b/arkui-plugins/ui-plugins/property-translators/base.ts @@ -53,8 +53,8 @@ export abstract class PropertyTranslator { ): arkts.MethodDefinition { const right: arkts.CallExpression = arkts.factory.createCallExpression( arkts.factory.createIdentifier(StateManagementTypes.OBSERVABLE_PROXY), + [arkts.factory.createIdentifier('value')], undefined, - [arkts.factory.createIdentifier('value')] ); collectStateManagementTypeImport(StateManagementTypes.OBSERVABLE_PROXY); return createSetter(originalName, typeAnnotation, left, right); diff --git a/arkui-plugins/ui-plugins/property-translators/factory.ts b/arkui-plugins/ui-plugins/property-translators/factory.ts index 882a7b4ba4b20d7bee139341a333b4a6014a7848..6d3ba1dcd76d6a5ed99d54e735b56007c44d632a 100644 --- a/arkui-plugins/ui-plugins/property-translators/factory.ts +++ b/arkui-plugins/ui-plugins/property-translators/factory.ts @@ -20,6 +20,7 @@ import { factory as UIFactory } from '../ui-factory'; import { collectStateManagementTypeImport, getValueInAnnotation, hasDecorator, removeDecorator } from './utils'; import { addMemoAnnotation, findCanAddMemoFromTypeAnnotation, CustomComponentNames } from '../utils'; import { annotation } from '../../common/arkts-utils'; +import { ArkTSConfigContext } from 'test/utils/shared-types'; export class factory { /** @@ -89,7 +90,7 @@ export class factory { arkts.factory.createConditionalExpression( test, consequent, - isCall ? arkts.factory.createCallExpression(alternate, undefined, undefined) : alternate + isCall ? arkts.factory.createCallExpression(alternate, [], undefined) : alternate ) ); } @@ -171,9 +172,10 @@ export class factory { false, [ arkts.factory.createExpressionStatement( - arkts.factory.createCallExpression(factory.generateThisCall(callbackName), undefined, [ - arkts.factory.createIdentifier('_'), - ]) + arkts.factory.createCallExpression(factory.generateThisCall(callbackName), + [arkts.factory.createIdentifier('_')], + undefined, + ) ), ] ); @@ -211,8 +213,8 @@ export class factory { false, false ), + (args ? args : []) as arkts.Expression[], undefined, - args ); } @@ -253,8 +255,8 @@ export class factory { false, false ), - typeArguments ? [typeArguments] : undefined, - [...(argsContainsThis ? [arkts.factory.createThisExpression()] : []), ...args] + [...(argsContainsThis ? [arkts.factory.createThisExpression()] : []), ...args] as arkts.Expression[], + typeArguments ? arkts.factory.createTSTypeParameterInstantiation([typeArguments]) : undefined, ); } @@ -277,7 +279,7 @@ export class factory { return arkts.factory.createIfStatement( binaryItem, arkts.factory.createBlock([ - arkts.factory.createExpressionStatement(arkts.factory.createCallExpression(member, undefined, args)), + arkts.factory.createExpressionStatement(arkts.factory.createCallExpression(member, args as arkts.Expression[], undefined,)), ]) ); } @@ -391,15 +393,15 @@ export class factory { ? arkts.factory.createReturnStatement( arkts.factory.createCallExpression( factory.thisSubscribedWatchesMember(methodName), + [arkts.factory.createIdentifier(paramName)], undefined, - [arkts.factory.createIdentifier(paramName)] ) ) : arkts.factory.createExpressionStatement( arkts.factory.createCallExpression( factory.thisSubscribedWatchesMember(methodName), + [arkts.factory.createIdentifier(paramName)], undefined, - [arkts.factory.createIdentifier(paramName)] ) ), ]), @@ -566,7 +568,6 @@ export class factory { false, false ), - undefined, [ arkts.factory.createMemberExpression( arkts.factory.createThisExpression(), @@ -575,7 +576,8 @@ export class factory { false, false ), - ] + ], + undefined, ); collectStateManagementTypeImport(StateManagementTypes.OBSERVE); const consequent: arkts.BlockStatement = arkts.factory.createBlock([ @@ -588,7 +590,7 @@ export class factory { false, false ), - undefined, + [], undefined ) ), @@ -634,7 +636,6 @@ export class factory { return arkts.factory.createMemberExpression( arkts.factory.createCallExpression( arkts.factory.createIdentifier(StateManagementTypes.STORAGE_LINK_STATE), - property.typeAnnotation ? [property.typeAnnotation] : [], [ arkts.factory.createMemberExpression( arkts.factory.createThisExpression(), @@ -645,7 +646,8 @@ export class factory { ), arkts.factory.createStringLiteral(localStorageporpValueStr), property.value ?? arkts.factory.createUndefinedLiteral(), - ] + ], + property.typeAnnotation ? arkts.factory.createTSTypeParameterInstantiation([property.typeAnnotation]) : undefined, ), arkts.factory.createIdentifier('value'), arkts.Es2pandaMemberExpressionKind.MEMBER_EXPRESSION_KIND_PROPERTY_ACCESS, diff --git a/arkui-plugins/ui-plugins/property-translators/localstoragelink.ts b/arkui-plugins/ui-plugins/property-translators/localstoragelink.ts index cc1e0ba115a15e7ac71b385117c668dbc6686cbf..998bab071ec509c28c5506c685b5430aa37f5123 100755 --- a/arkui-plugins/ui-plugins/property-translators/localstoragelink.ts +++ b/arkui-plugins/ui-plugins/property-translators/localstoragelink.ts @@ -120,7 +120,6 @@ export class LocalStorageLinkTranslator extends PropertyTranslator implements In const call = arkts.factory.createCallExpression( arkts.factory.createIdentifier(StateManagementTypes.STORAGE_LINK_STATE), - this.property.typeAnnotation ? [this.property.typeAnnotation] : [], [ arkts.factory.createMemberExpression( arkts.factory.createThisExpression(), @@ -131,6 +130,7 @@ export class LocalStorageLinkTranslator extends PropertyTranslator implements In ), arkts.factory.createStringLiteral(localStorageLinkValueStr), this.property.value ?? arkts.factory.createUndefinedLiteral(), + arkts.factory.createTSTypeParameterInstantiation(this.property.typeAnnotation ? [this.property.typeAnnotation] : []), ] ); collectStateManagementTypeImport(StateManagementTypes.STORAGE_LINK_STATE); diff --git a/arkui-plugins/ui-plugins/property-translators/localstorageprop.ts b/arkui-plugins/ui-plugins/property-translators/localstorageprop.ts index 58eec31cc257158fb2b40e78e5832c5829e55e88..005f9de108eb88763161c3028fb983d40ddfc045 100644 --- a/arkui-plugins/ui-plugins/property-translators/localstorageprop.ts +++ b/arkui-plugins/ui-plugins/property-translators/localstorageprop.ts @@ -128,17 +128,16 @@ export class LocalStoragePropTranslator extends PropertyTranslator implements In ); const binaryItem = arkts.factory.createCallExpression( arkts.factory.createIdentifier(StateManagementTypes.STORAGE_LINK_STATE), - this.property.typeAnnotation ? [this.property.typeAnnotation] : [], [ insideMember, arkts.factory.createStringLiteral(localStorageporpValueStr), this.property.value ?? arkts.factory.createUndefinedLiteral(), - ] + ], + arkts.factory.createTSTypeParameterInstantiation(this.property.typeAnnotation ? [this.property.typeAnnotation] : []), ); collectStateManagementTypeImport(StateManagementTypes.STORAGE_LINK_STATE); const call = arkts.factory.createCallExpression( arkts.factory.createIdentifier(StateManagementTypes.PROP_STATE), - this.property.typeAnnotation ? [this.property.typeAnnotation] : [], [ arkts.factory.createMemberExpression( binaryItem, @@ -147,7 +146,8 @@ export class LocalStoragePropTranslator extends PropertyTranslator implements In false, false ), - ] + ], + arkts.factory.createTSTypeParameterInstantiation(this.property.typeAnnotation ? [this.property.typeAnnotation] : []), ); collectStateManagementTypeImport(StateManagementTypes.PROP_STATE); return arkts.factory.createAssignmentExpression( @@ -187,8 +187,8 @@ export class LocalStoragePropTranslator extends PropertyTranslator implements In false, false ), + [StorageLinkStateValue], undefined, - [StorageLinkStateValue] ) ), ]); diff --git a/arkui-plugins/ui-plugins/property-translators/observedTrack.ts b/arkui-plugins/ui-plugins/property-translators/observedTrack.ts index 28d0762e4cf5c86cf6941f186b4f3db1cd69ed09..e783243b12d6629db7fcd6f8a4ef7b6e1d552b21 100644 --- a/arkui-plugins/ui-plugins/property-translators/observedTrack.ts +++ b/arkui-plugins/ui-plugins/property-translators/observedTrack.ts @@ -90,7 +90,6 @@ export class ObservedTrackTranslator { false, false ), - undefined, [ arkts.factory.createMemberExpression( arkts.factory.createThisExpression(), @@ -99,7 +98,8 @@ export class ObservedTrackTranslator { false, false ), - ] + ], + undefined, ) ); const returnMember: arkts.ReturnStatement = arkts.factory.createReturnStatement(this.genThisBacking(newName)); @@ -243,7 +243,7 @@ export class ObservedTrackTranslator { false, false ), - undefined, + [], undefined ) ); @@ -257,8 +257,8 @@ export class ObservedTrackTranslator { false, false ), + [arkts.factory.createStringLiteral(originalName)], undefined, - [arkts.factory.createStringLiteral(originalName)] ) ); diff --git a/arkui-plugins/ui-plugins/property-translators/utils.ts b/arkui-plugins/ui-plugins/property-translators/utils.ts index 08c0fb11f8fb2e180223ba141313f5b9f59d47b0..2d999d78056cb84ad63fdefa25e46dc53db20ff2 100644 --- a/arkui-plugins/ui-plugins/property-translators/utils.ts +++ b/arkui-plugins/ui-plugins/property-translators/utils.ts @@ -374,8 +374,7 @@ export function generateGetOrSetCall(beforCall: arkts.AstNode, type: GetSetTypes false, false ), - undefined, - type === 'set' ? [arkts.factory.createIdentifier('value')] : undefined, + type === 'set' ? [arkts.factory.createIdentifier('value')] : [], undefined ); } diff --git a/arkui-plugins/ui-plugins/struct-translators/factory.ts b/arkui-plugins/ui-plugins/struct-translators/factory.ts index eae984fb72590612c683924122b9cb5eca6b0751..e7c7ced2d57916425a145bf0c13b0c35ebb896dd 100644 --- a/arkui-plugins/ui-plugins/struct-translators/factory.ts +++ b/arkui-plugins/ui-plugins/struct-translators/factory.ts @@ -454,10 +454,10 @@ export class factory { projectConfig: ProjectConfig | undefined, resourceInfo: ResourceInfo ): arkts.CallExpression { - if (!arkts.isIdentifier(resourceNode.expression) || !projectConfig) { + if (!arkts.isIdentifier(resourceNode.callee) || !projectConfig) { return resourceNode; } - const resourceKind: Dollars = resourceNode.expression.name as Dollars; + const resourceKind: Dollars = resourceNode.callee.name as Dollars; if (arkts.isStringLiteral(resourceNode.arguments[0])) { return factory.processStringLiteralResourceNode( resourceNode, @@ -588,8 +588,8 @@ export class factory { return arkts.factory.updateCallExpression( resourceNode, arkts.factory.createIdentifier(transformedKey), + args as arkts.Expression[], undefined, - args ); } diff --git a/arkui-plugins/ui-plugins/struct-translators/utils.ts b/arkui-plugins/ui-plugins/struct-translators/utils.ts index eba0ce6a4de45b96dcb7de653bdd3b6931c8b81e..3958ab107d2c2509d755f3962d4e59a50b080bd0 100644 --- a/arkui-plugins/ui-plugins/struct-translators/utils.ts +++ b/arkui-plugins/ui-plugins/struct-translators/utils.ts @@ -87,14 +87,14 @@ export function isEtsGlobalClass(node: arkts.ClassDeclaration): boolean { export function isResourceNode(node: arkts.CallExpression, ignoreDecl: boolean = false): boolean { if ( !( - arkts.isIdentifier(node.expression) && - (node.expression.name === Dollars.DOLLAR_RESOURCE || node.expression.name === Dollars.DOLLAR_RAWFILE) + arkts.isIdentifier(node.callee) && + (node.callee.name === Dollars.DOLLAR_RESOURCE || node.callee.name === Dollars.DOLLAR_RAWFILE) ) ) { return false; } if (!ignoreDecl) { - const decl = arkts.getDecl(node.expression); + const decl = arkts.getDecl(node.callee); if (!decl) { return false; } @@ -111,8 +111,8 @@ export function isMemoCall(node: arkts.AstNode): node is arkts.CallExpression { if (!arkts.isCallExpression(node)) { return false; } - const expr: arkts.AstNode = node.expression; - const decl: arkts.AstNode | undefined = arkts.getDecl(expr); + const expr = node.callee; + const decl = expr ? arkts.getDecl(expr) : undefined; if (!decl) { return false; diff --git a/arkui-plugins/ui-syntax-plugins/rules/build-root-node.ts b/arkui-plugins/ui-syntax-plugins/rules/build-root-node.ts index 48c5884534766cfe477b09c66650e708c0b67924..175adde4fddc311b010f0514cf41ac053c9e6136 100644 --- a/arkui-plugins/ui-syntax-plugins/rules/build-root-node.ts +++ b/arkui-plugins/ui-syntax-plugins/rules/build-root-node.ts @@ -85,13 +85,15 @@ class BuildRootNodeRule extends AbstractUISyntaxRule { private getComponentName(callExpression: arkts.CallExpression): string { if ( - arkts.isMemberExpression(callExpression.expression) && - arkts.isCallExpression(callExpression.expression.object) && - arkts.isIdentifier(callExpression.expression.object.expression) + !!callExpression.callee && + arkts.isMemberExpression(callExpression.callee) && + arkts.isCallExpression(callExpression.callee.object) && + !! callExpression.callee.object.callee && + arkts.isIdentifier(callExpression.callee.object.callee) ) { - return getIdentifierName(callExpression.expression.object.expression); - } else if (arkts.isIdentifier(callExpression.expression)) { - return getIdentifierName(callExpression.expression); + return getIdentifierName(callExpression.callee.object.callee); + } else if (!!callExpression.callee && arkts.isIdentifier(callExpression.callee)) { + return getIdentifierName(callExpression.callee); } return ''; } diff --git a/arkui-plugins/ui-syntax-plugins/rules/check-construct-private-parameter.ts b/arkui-plugins/ui-syntax-plugins/rules/check-construct-private-parameter.ts index d3e4045cf2d414766fc01af7c17115dfd2dfdd34..9ac47a253ef637208ec74f4522f3ff57abc94351 100644 --- a/arkui-plugins/ui-syntax-plugins/rules/check-construct-private-parameter.ts +++ b/arkui-plugins/ui-syntax-plugins/rules/check-construct-private-parameter.ts @@ -52,10 +52,10 @@ function checkPrivateVariables( }); }); } - if (!arkts.isCallExpression(node) || !arkts.isIdentifier(node.expression)) { + if (!arkts.isCallExpression(node) || !node.callee || !arkts.isIdentifier(node.callee)) { return; } - const componentName = node.expression.name; + const componentName = node.callee.name; // If the initialization is for a component with private properties if (!privatePropertyMap.has(componentName)) { return; diff --git a/arkui-plugins/ui-syntax-plugins/rules/computed-decorator-check.ts b/arkui-plugins/ui-syntax-plugins/rules/computed-decorator-check.ts index f13ea578af0d2a6b7323f9bcfb12069ee7fdef0d..22015dd471fdec7b4e725129ee99175002bb127d 100644 --- a/arkui-plugins/ui-syntax-plugins/rules/computed-decorator-check.ts +++ b/arkui-plugins/ui-syntax-plugins/rules/computed-decorator-check.ts @@ -139,10 +139,10 @@ function validateCallExpression( context: UISyntaxRuleContext ): void { // Check if it's a $$(...) call - if (!arkts.isIdentifier(currentNode.expression)) { + if (!currentNode.callee || !arkts.isIdentifier(currentNode.callee)) { return; } - if (getIdentifierName(currentNode.expression) === '$$') { + if (getIdentifierName(currentNode.callee) === '$$') { currentNode.arguments.forEach(argument => { if (arkts.isMemberExpression(argument)) { const getterName = getIdentifierName(argument.property); diff --git a/arkui-plugins/ui-syntax-plugins/rules/construct-parameter-literal.ts b/arkui-plugins/ui-syntax-plugins/rules/construct-parameter-literal.ts index 6d5b75bee215f50f1e74c3c0c1404924e8de1f28..9bfcd3cc63031d737a78c212d3b27bfad4ba5d85 100644 --- a/arkui-plugins/ui-syntax-plugins/rules/construct-parameter-literal.ts +++ b/arkui-plugins/ui-syntax-plugins/rules/construct-parameter-literal.ts @@ -61,10 +61,10 @@ function initMap(node: arkts.AstNode, linkMap: Map): void { function checkInitializeWithLiteral(node: arkts.AstNode, context: UISyntaxRuleContext, linkMap: Map ): void { - if (!arkts.isCallExpression(node) || !arkts.isIdentifier(node.expression)) { + if (!arkts.isCallExpression(node) || !node.callee || !arkts.isIdentifier(node.callee)) { return; } - const componentName = node.expression.name; + const componentName = node.callee.name; // Only assignments to properties decorated with Link or ObjectLink trigger rule checks if (!linkMap.has(componentName)) { return; diff --git a/arkui-plugins/ui-syntax-plugins/rules/consumer-provider-decorator-check.ts b/arkui-plugins/ui-syntax-plugins/rules/consumer-provider-decorator-check.ts index d95a5104ba518130f4f27ce35dea46e6d1e7576a..9110a8662aa17dcd0163f0e717fa4c4721a5c2ed 100644 --- a/arkui-plugins/ui-syntax-plugins/rules/consumer-provider-decorator-check.ts +++ b/arkui-plugins/ui-syntax-plugins/rules/consumer-provider-decorator-check.ts @@ -319,10 +319,10 @@ function reportValidateProvider( // Verify that the @Consumer-decorated property is initialized function validateConsumerInitialization(node: arkts.CallExpression, componentv2WithConsumer: MultiMap, context: UISyntaxRuleContext): void { - if (!arkts.isIdentifier(node.expression)) { + if (!node.callee || !arkts.isIdentifier(node.callee)) { return; } - const callExpName: string = node.expression.name; + const callExpName: string = node.callee.name; if (componentv2WithConsumer.has(callExpName)) { const queue: Array = [node]; while (queue.length > 0) { @@ -340,10 +340,10 @@ function validateConsumerInitialization(node: arkts.CallExpression, componentv2W function validateProviderInitialization(node: arkts.CallExpression, componentv2WithProvider: MultiMap, context: UISyntaxRuleContext): void { - if (!arkts.isIdentifier(node.expression)) { + if (!node.callee || !arkts.isIdentifier(node.callee)) { return; } - const callExpName: string = node.expression.name; + const callExpName: string = node.callee.name; if (componentv2WithProvider.has(callExpName)) { const queue: Array = [node]; while (queue.length > 0) { diff --git a/arkui-plugins/ui-syntax-plugins/rules/nested-relationship.ts b/arkui-plugins/ui-syntax-plugins/rules/nested-relationship.ts index 18f8273e0c088a34078127a6467264d8f9be717a..25860d750cb27e0d37ad0f51bd1cb42139d74e17 100644 --- a/arkui-plugins/ui-syntax-plugins/rules/nested-relationship.ts +++ b/arkui-plugins/ui-syntax-plugins/rules/nested-relationship.ts @@ -34,15 +34,15 @@ function checkValidParentComponent(node: arkts.AstNode, context: UISyntaxRuleCon return; } let curNode = node.parent.parent; - while (!arkts.isCallExpression(curNode) || !arkts.isIdentifier(curNode.expression) || - !isBuildInComponent(context, curNode.expression.name)) { + while (!arkts.isCallExpression(curNode) || !curNode.callee || !arkts.isIdentifier(curNode.callee) || + !isBuildInComponent(context, curNode.callee.name)) { if (!curNode.parent) { return; } curNode = curNode.parent; } // If the parent component of the current component is not within the valid range, an error is reported - const parentComponentName = curNode.expression.name; + const parentComponentName = curNode.callee.name; if (!context.componentsInfo.validParentComponent.get(componentName)!.includes(parentComponentName)) { context.report({ node: node, @@ -75,7 +75,7 @@ function checkValidChildComponent(node: arkts.AstNode, context: UISyntaxRuleCont return; } let parentNode = node.parent; - if (!arkts.isCallExpression(parentNode) || !arkts.isIdentifier(parentNode.expression)) { + if (!arkts.isCallExpression(parentNode) || !parentNode.callee || !arkts.isIdentifier(parentNode.callee)) { return; } // If the BlockStatement contains a child component that should not exist under the component, an error will be reported @@ -87,11 +87,11 @@ function checkValidChildComponent(node: arkts.AstNode, context: UISyntaxRuleCont if (!arkts.isExpressionStatement(statement) || !statement.expression) { return; } - if (!arkts.isCallExpression(statement.expression) || !statement.expression.expression || - !arkts.isIdentifier(statement.expression.expression)) { + if (!arkts.isCallExpression(statement.expression) || !statement.expression.callee || + !arkts.isIdentifier(statement.expression.callee)) { return; } - const componentName = getIdentifierName(statement.expression.expression); + const componentName = getIdentifierName(statement.expression.callee); const childComponentListArray: string[] = context.componentsInfo.validChildComponent.get(parentComponentName)!; if (!childComponentListArray.includes(componentName) && isBuildInComponent(context, componentName)) { const childComponentList: string = listToString(childComponentListArray); diff --git a/arkui-plugins/ui-syntax-plugins/rules/nested-reuse-component-check.ts b/arkui-plugins/ui-syntax-plugins/rules/nested-reuse-component-check.ts index 90d19982b8647947da1dd1f09ee7755ca9733a69..80a3ec0faa3a1da9908d268b0f66fa88d9142cb9 100644 --- a/arkui-plugins/ui-syntax-plugins/rules/nested-reuse-component-check.ts +++ b/arkui-plugins/ui-syntax-plugins/rules/nested-reuse-component-check.ts @@ -57,15 +57,15 @@ function checkHasRepeatOrTemplate(node: arkts.CallExpression): { hasRepeat: bool let hasRepeat: boolean = false; let hasTemplate: boolean = false; while (arkts.isCallExpression(node) && - node.expression && arkts.isMemberExpression(node.expression) && - node.expression.object && arkts.isCallExpression(node.expression.object)) { - if (arkts.isIdentifier(node.expression.property) && getIdentifierName(node.expression.property) === TEMPLATE) { + node.callee && arkts.isMemberExpression(node.callee) && + node.callee.object && arkts.isCallExpression(node.callee.object)) { + if (arkts.isIdentifier(node.callee.property) && getIdentifierName(node.callee.property) === TEMPLATE) { hasTemplate = true; } - node = node.expression.object; + node = node.callee.object; } - if (arkts.isCallExpression(node) && arkts.isIdentifier(node.expression)) { - hasRepeat = getIdentifierName(node.expression) === COMPONENT_REPEAT; + if (arkts.isCallExpression(node) && !!node.callee && arkts.isIdentifier(node.callee)) { + hasRepeat = getIdentifierName(node.callee) === COMPONENT_REPEAT; } return { hasRepeat, hasTemplate }; } @@ -104,14 +104,14 @@ function checkNoReusableV1InReusableV2( context: UISyntaxRuleContext, reusableStructName: string[] ): void { - if (!arkts.isCallExpression(node) || !arkts.isIdentifier(node.expression)) { + if (!arkts.isCallExpression(node) || !node.callee || !arkts.isIdentifier(node.callee)) { return; } - if (reusableStructName.includes(node.expression.name)) { + if (reusableStructName.includes(node.callee.name)) { // Traverse upwards to find the custom component. let struceNode: arkts.AstNode = node; while (!arkts.isStructDeclaration(struceNode)) { - struceNode = struceNode.parent; + struceNode = struceNode.parent!; } const annotationsList = struceNode.definition.annotations; // Check that the current component is decorated by the @ComponentV2 decorator @@ -152,15 +152,15 @@ function checkNestedReuseComponent( context: UISyntaxRuleContext, reusableV2StructName: string[], ): void { - if (!arkts.isCallExpression(node) || !arkts.isIdentifier(node.expression)) { + if (!arkts.isCallExpression(node) || !node.callee || !arkts.isIdentifier(node.callee)) { return; } - if (reusableV2StructName.includes(node.expression.name)) { + if (reusableV2StructName.includes(node.callee.name)) { // Traverse upwards to find the custom component. let struceNode: arkts.AstNode = node; let hasReportedError = false; while (!arkts.isStructDeclaration(struceNode)) { - struceNode = struceNode.parent; + struceNode = struceNode.parent!; if (!hasReportedError) { hasReportedError = checkNoReusableV2InRepeatTemplate(struceNode, node, context); } diff --git a/koala-wrapper/src/arkts-api/factory/nodeFactory.ts b/koala-wrapper/src/arkts-api/factory/nodeFactory.ts index f9ad2411845d976924a1b0ccd47a7d8968e1dbe4..aa764cd3039a754afa01146850f38f76059699f9 100644 --- a/koala-wrapper/src/arkts-api/factory/nodeFactory.ts +++ b/koala-wrapper/src/arkts-api/factory/nodeFactory.ts @@ -17,7 +17,6 @@ import { updateNodeByNode } from '../utilities/private'; import { ArrowFunctionExpression, AssignmentExpression, - CallExpression, ETSParameterExpression, EtsScript, ExpressionStatement, @@ -77,12 +76,13 @@ import { ArrayExpression, AnnotationDeclaration, TryStatement, + CallExpression, TSClassImplements, } from '../../generated'; import { Es2pandaModifierFlags } from '../../generated/Es2pandaEnums'; import { classPropertySetOptional, hasModifierFlag } from '../utilities/public'; import { updateIdentifier } from '../node-utilities/Identifier'; -import { updateCallExpression } from '../node-utilities/CallExpression'; +import { updateCallExpression, createCallExpression } from '../node-utilities/CallExpression'; import { updateExpressionStatement } from '../node-utilities/ExpressionStatement'; import { updateMemberExpression } from '../node-utilities/MemberExpression'; import { updateFunctionDeclaration } from '../node-utilities/FunctionDeclaration'; @@ -144,8 +144,8 @@ export const factory = { get updateIdentifier(): (...args: Parameters) => Identifier { return updateIdentifier; }, - get createCallExpression(): (...args: Parameters) => CallExpression { - return CallExpression.create; + get createCallExpression(): (...args: Parameters) => CallExpression { + return createCallExpression; }, get updateCallExpression(): (...args: Parameters) => CallExpression { return updateCallExpression; diff --git a/koala-wrapper/src/arkts-api/factory/nodeTests.ts b/koala-wrapper/src/arkts-api/factory/nodeTests.ts index 62c02275a505a51ae282d041066c946d32d22dd1..41cb3bb871a04522a6082da7a8174acb5e4ad577 100644 --- a/koala-wrapper/src/arkts-api/factory/nodeTests.ts +++ b/koala-wrapper/src/arkts-api/factory/nodeTests.ts @@ -16,7 +16,6 @@ import { global } from "../static/global" import { ArrowFunctionExpression, - CallExpression, ETSParameterExpression, EtsScript, ExpressionStatement, @@ -34,10 +33,6 @@ import { import { MemberExpression } from "../to-be-generated/MemberExpression" import { AstNode } from "../peers/AstNode" -export function isCallExpression(node: AstNode): node is CallExpression { - return node instanceof CallExpression -} - export function isMemberExpression(node: AstNode): node is MemberExpression { return node instanceof MemberExpression } diff --git a/koala-wrapper/src/arkts-api/index.ts b/koala-wrapper/src/arkts-api/index.ts index f0a9a91d143027d46b4a4f793c0adf8cdf5b838c..9375e4c216029870276a3703d795f068092bb41a 100644 --- a/koala-wrapper/src/arkts-api/index.ts +++ b/koala-wrapper/src/arkts-api/index.ts @@ -63,6 +63,7 @@ export * from "../generated/peers/TSArrayType" export * from "../generated/peers/ArrayExpression" export * from "../generated/peers/TryStatement" export * from "../generated/peers/ETSNullType" +export * from "../generated/peers/CallExpression" export * from "./types" export * from "./utilities/private" diff --git a/koala-wrapper/src/arkts-api/node-utilities/CallExpression.ts b/koala-wrapper/src/arkts-api/node-utilities/CallExpression.ts index d1489441acb897ed397d6a1d0a89098b216fd891..f0a62ec22c8778c11179d0c3a8feaaeb932bfc23 100644 --- a/koala-wrapper/src/arkts-api/node-utilities/CallExpression.ts +++ b/koala-wrapper/src/arkts-api/node-utilities/CallExpression.ts @@ -13,33 +13,71 @@ * limitations under the License. */ -import { TypeNode } from '../../generated'; -import { isSameNativeObject } from '../peers/ArktsObject'; -import { AstNode } from '../peers/AstNode'; -import { CallExpression } from '../types'; -import { attachModifiers, updateThenAttach } from '../utilities/private'; +import { nullptr } from "@koalaui/interop"; +import { + BlockStatement, + CallExpression, + Expression, + TSTypeParameterInstantiation, +} from "../../generated"; +import { isSameNativeObject } from "../peers/ArktsObject"; +import { + attachModifiers, + updateThenAttach, + updateNodeByNode, + passNode, +} from "../utilities/private"; + +export function createCallExpression( + callee: Expression | undefined, + _arguments: readonly Expression[], + typeParams: TSTypeParameterInstantiation | undefined, + optional_arg: boolean = false, + trailingComma: boolean = false, + trailingBlock: BlockStatement | undefined = undefined +): CallExpression { + const res = CallExpression.createCallExpression( + callee, + _arguments, + typeParams, + optional_arg, + trailingComma + ); + if (trailingBlock) { + res.setTrailingBlock(trailingBlock); + } + return res; +} export function updateCallExpression( original: CallExpression, - expression: AstNode, - typeArguments: readonly TypeNode[] | undefined, - args: readonly AstNode[] | undefined, - isOptional?: boolean, - trailingComma?: boolean + callee: Expression | undefined, + _arguments: readonly Expression[], + typeParams: TSTypeParameterInstantiation | undefined, + optional_arg: boolean = false, + trailingComma: boolean = false, + trailingBlock: BlockStatement | undefined = undefined ): CallExpression { if ( - isSameNativeObject(expression, original.expression) && - isSameNativeObject(typeArguments, original.typeArguments) && - isSameNativeObject(args, original.arguments) + isSameNativeObject(callee, original.callee) && + isSameNativeObject(_arguments, original.arguments) && + isSameNativeObject(typeParams, original.typeParams) && + isSameNativeObject(optional_arg, original.isOptional) && + isSameNativeObject(trailingComma, original.hasTrailingComma) && + isSameNativeObject(trailingBlock, original.trailingBlock) ) { return original; } - - const update = updateThenAttach( - CallExpression.update, - attachModifiers, - (node: CallExpression, original: CallExpression) => - !!original.trailingBlock ? node.setTralingBlock(original.trailingBlock) : node + const update = updateThenAttach(updateNodeByNode, attachModifiers); + return update( + createCallExpression( + callee, + _arguments, + typeParams, + optional_arg, + trailingComma, + trailingBlock + ), + original ); - return update(original, expression, typeArguments, args, isOptional, trailingComma); } diff --git a/koala-wrapper/src/arkts-api/peers/ArktsObject.ts b/koala-wrapper/src/arkts-api/peers/ArktsObject.ts index bfa1e6e090070bf9cec0c22de33a385cb478a88b..a5f10c410fa5998fe1b5cf93b083c933f684bc36 100644 --- a/koala-wrapper/src/arkts-api/peers/ArktsObject.ts +++ b/koala-wrapper/src/arkts-api/peers/ArktsObject.ts @@ -21,6 +21,7 @@ export abstract class ArktsObject { } readonly peer: KNativePointer; + public onUpdate(node: ArktsObject): void {} } export function isSameNativeObject( diff --git a/koala-wrapper/src/arkts-api/peers/AstNode.ts b/koala-wrapper/src/arkts-api/peers/AstNode.ts index 54b699cd2138dc151da9c666271f34793e2149ec..5040c9b95190452079e23c89a46f5a11d7cf7b63 100644 --- a/koala-wrapper/src/arkts-api/peers/AstNode.ts +++ b/koala-wrapper/src/arkts-api/peers/AstNode.ts @@ -126,6 +126,10 @@ export abstract class AstNode extends ArktsObject { ); } + public override onUpdate(node: AstNode): void { + global.generatedEs2panda._AstNodeSetOriginalNode(global.context, node.peer, this.originalPeer); + } + public get isExport(): boolean { return global.generatedEs2panda._AstNodeIsExportedConst(global.context, this.peer); } diff --git a/koala-wrapper/src/arkts-api/types.ts b/koala-wrapper/src/arkts-api/types.ts index be1c316516d4398d11e7ace0bdc4be48dbdfd972..cb3d19c24f7560ff33248566c7a4bd25a301a05e 100644 --- a/koala-wrapper/src/arkts-api/types.ts +++ b/koala-wrapper/src/arkts-api/types.ts @@ -153,100 +153,6 @@ export class ExpressionStatement extends AstNode { } } -// TODO: -// the CallExpression idl Create signature doesn't include the trailing block at all. -// Need to clarify with the compiler people if they will provide create signature with a trailing block argument. -export class CallExpression extends Expression { - constructor(peer: KPtr) { - assertValidPeer(peer, Es2pandaAstNodeType.AST_NODE_TYPE_CALL_EXPRESSION); - super(peer); - this.expression = unpackNonNullableNode( - global.generatedEs2panda._CallExpressionCallee(global.context, this.peer) - ); - this.typeParams = unpackNode(global.generatedEs2panda._CallExpressionTypeParams(global.context, this.peer)); - this.typeArguments = this.typeParams - ? unpackNodeArray( - global.generatedEs2panda._TSTypeParameterInstantiationParamsConst( - global.context, - this.typeParams.peer - ) - ) - : undefined; - this.arguments = unpackNodeArray(global.generatedEs2panda._CallExpressionArguments(global.context, this.peer)); - } - - static create( - expression: AstNode, - typeArguments: readonly TypeNode[] | undefined, - args: readonly AstNode[] | undefined, - isOptional: boolean = false, - trailingComma: boolean = false - ): CallExpression { - const peer = global.generatedEs2panda._CreateCallExpression( - global.context, - passNode(expression), - passNodeArray(args), - args?.length ?? 0, - typeArguments - ? passNode(TSTypeParameterInstantiation.createTSTypeParameterInstantiation(typeArguments)) - : nullptr, - isOptional, - trailingComma - ); - return new CallExpression(peer); - } - - static update( - node: CallExpression, - expression: AstNode, - typeArguments: readonly TypeNode[] | undefined, - args: readonly AstNode[] | undefined, - isOptional: boolean = false, - trailingComma: boolean = false - ): CallExpression { - const peer = global.es2panda._UpdateCallExpression( - global.context, - node.peer, - passNode(expression), - passNodeArray(args), - args?.length ?? 0, - typeArguments - ? passNode(TSTypeParameterInstantiation.createTSTypeParameterInstantiation(typeArguments)) - : nullptr, - isOptional, - trailingComma - ); - return new CallExpression(peer); - } - - get trailingBlock(): BlockStatement | undefined { - return unpackNode(global.generatedEs2panda._CallExpressionTrailingBlockConst(global.context, this.peer)); - } - - setTralingBlock(trailingBlock: BlockStatement | undefined): this { - if (!trailingBlock) return this; - global.generatedEs2panda._CallExpressionSetTrailingBlock(global.context, this.peer, trailingBlock.peer); - return this; - } - - /** @deprecated */ - setCallee(callee?: Expression): this { - global.generatedEs2panda._CallExpressionSetCallee(global.context, this.peer, passNode(callee)); - return this; - } - - /** @deprecated */ - setTypeParams(typeParams?: TSTypeParameterInstantiation): this { - global.generatedEs2panda._CallExpressionSetTypeParams(global.context, this.peer, passNode(typeParams)); - return this; - } - - readonly expression: AstNode; // Expression - readonly typeArguments: readonly TypeNode[] | undefined; - readonly arguments: readonly Expression[]; - readonly typeParams: TSTypeParameterInstantiation | undefined; -} - export class AssignmentExpression extends AstNode { constructor(peer: KPtr) { assertValidPeer(peer, Es2pandaAstNodeType.AST_NODE_TYPE_ASSIGNMENT_EXPRESSION); @@ -903,7 +809,6 @@ const pairs: [Es2pandaAstNodeType, { new (peer: KNativePointer): AstNode }][] = [Es2pandaAstNodeType.AST_NODE_TYPE_BLOCK_STATEMENT, BlockStatement], [Es2pandaAstNodeType.AST_NODE_TYPE_ETS_PARAMETER_EXPRESSION, ETSParameterExpression], [Es2pandaAstNodeType.AST_NODE_TYPE_TS_TYPE_PARAMETER_DECLARATION, TSTypeParameterDeclaration], - [Es2pandaAstNodeType.AST_NODE_TYPE_CALL_EXPRESSION, CallExpression], [Es2pandaAstNodeType.AST_NODE_TYPE_MEMBER_EXPRESSION, MemberExpression], [Es2pandaAstNodeType.AST_NODE_TYPE_IF_STATEMENT, IfStatement], [Es2pandaAstNodeType.AST_NODE_TYPE_ARROW_FUNCTION_EXPRESSION, ArrowFunctionExpression], diff --git a/koala-wrapper/src/arkts-api/utilities/private.ts b/koala-wrapper/src/arkts-api/utilities/private.ts index 30db3e4720c4b3f71d8b06dd0ff5d8727721ed8e..947e6464969ca0f489e6bd74ffce470e5e83222b 100644 --- a/koala-wrapper/src/arkts-api/utilities/private.ts +++ b/koala-wrapper/src/arkts-api/utilities/private.ts @@ -27,7 +27,7 @@ import { import { NativePtrDecoder } from './nativePtrDecoder'; import { Es2pandaModifierFlags, Es2pandaScriptFunctionFlags } from '../../generated/Es2pandaEnums'; import { classByPeer } from '../class-by-peer'; -import type { AstNode } from '../peers/AstNode'; +import { AstNode } from '../peers/AstNode'; import { ArktsObject } from '../peers/ArktsObject'; import { Es2pandaAstNodeType } from '../../Es2pandaEnums'; @@ -154,16 +154,12 @@ export function updatePeerByNode(peer: KNativePointer, origin } // TODO: update scopes and other data -export function updateNodeByNode(node: T, original: AstNode): T { +export function updateNodeByNode(node: T, original: T): T { if (original.peer === nullptr) { throwError('update called on NULLPTR'); } - global.generatedEs2panda._AstNodeSetOriginalNode(global.context, node.peer, original.peer); - global.generatedEs2panda._AstNodeSetParent( - global.context, - node.peer, - global.generatedEs2panda._AstNodeParent(global.context, original.peer) - ); + original.onUpdate(node); + global.generatedEs2panda._AstNodeSetParent(global.context, node.peer, global.generatedEs2panda._AstNodeParent(global.context, original.peer)); global.es2panda._AstNodeUpdateChildren(global.context, node.peer); return node; } @@ -175,14 +171,14 @@ export function nodeType(node: AstNode): Es2pandaAstNodeType { /** * @deprecated */ -export function compose( +export function compose( create: (...args: ARGS) => T, update: (node: T, original: T) => T = updateNodeByNode ): (node: T, ...args: ARGS) => T { return (node: T, ...args: ARGS) => update(create(...args), node); } -export function updateThenAttach( +export function updateThenAttach( update: (original: T, ...args: ARGS) => T, ...attachFuncs: ((node: T, original: T) => T)[] ): (node: T, ...args: ARGS) => T { @@ -195,7 +191,9 @@ export function updateThenAttach( }; } -export function attachModifiers(node: T, original: T): T { - node.modifiers = original.modifiers; +export function attachModifiers(node: T, original: T): T { + if (node instanceof AstNode && original instanceof AstNode) { + node.modifiers = original.modifiers; + } return node; } diff --git a/koala-wrapper/src/arkts-api/visitor.ts b/koala-wrapper/src/arkts-api/visitor.ts index b0a45fbda56a9a5f8d73833a7a64d9568876a392..6448f48870de171c4cdb6fa00a88a6602b275b0d 100644 --- a/koala-wrapper/src/arkts-api/visitor.ts +++ b/koala-wrapper/src/arkts-api/visitor.ts @@ -48,10 +48,11 @@ import { isArrayExpression, isTryStatement, isBinaryExpression, + TSTypeParameterInstantiation, + isCallExpression, } from '../generated'; import { isEtsScript, - isCallExpression, isFunctionDeclaration, isExpressionStatement, isStructDeclaration, @@ -116,12 +117,12 @@ function visitOuterExpression(node: AstNode, visitor: Visitor): AstNode { updated = true; const call = factory.updateCallExpression( node, - nodeVisitor(node.expression, visitor), - nodesVisitor(node.typeArguments, visitor), - nodesVisitor(node.arguments, visitor) + nodeVisitor(node.callee, visitor), + nodesVisitor(node.arguments, visitor), + nodeVisitor(node.typeParams, visitor) ); if (!!node.trailingBlock) { - call.setTralingBlock(nodeVisitor(node.trailingBlock, visitor)); + call.setTrailingBlock(nodeVisitor(node.trailingBlock, visitor)); } return call; } else if (isArrowFunctionExpression(node)) {