diff --git a/ui2abc/libarkts/generator/options.json5 b/ui2abc/libarkts/generator/options.json5 index c7ab0e12aead74c147db60b14ddd5567510ef8fe..80bd512f72b742911d8ad18cd0ecb538141f4939 100644 --- a/ui2abc/libarkts/generator/options.json5 +++ b/ui2abc/libarkts/generator/options.json5 @@ -261,13 +261,22 @@ methods: [ { name: "setChildrenParentPtr", - definition: "methodDefinitionSetChildrenParentPtr", + definition: "extension_MethodDefinitionSetChildrenParentPtr", }, { name: "onUpdate", - definition: "methodDefinitionOnUpdate", + definition: "extension_MethodDefinitionOnUpdate", }, ] }, + { + interface: "ETSModule", + methods: [ + { + name: "getNamespaceFlag", + definition: "extension_ETSModuleGetNamespaceFlag", + } + ] + } ], } diff --git a/ui2abc/libarkts/src-host/es2panda.ts b/ui2abc/libarkts/src-host/es2panda.ts index a32e540b7d343b543c535d5ee384b0ad95d99816..8213e712eee1ecbf1bf48d4e5948a45b20c2e3bd 100644 --- a/ui2abc/libarkts/src-host/es2panda.ts +++ b/ui2abc/libarkts/src-host/es2panda.ts @@ -369,8 +369,6 @@ function invokeSimultaneous( compilerConfig.destroy() } -const exportsFromInitialFile: string[] = [] - function generateDeclFromCurrentContext(filePath: string) { proceedToState(Es2pandaContextState.ES2PANDA_STATE_PARSED) console.log(`Emitting to ${filePath}`) @@ -380,7 +378,6 @@ function generateDeclFromCurrentContext(filePath: string) { .visitor(global.compilerContext!.program.ast) .dumpSrc() ), - ...exportsFromInitialFile ].join('\n') fs.mkdirSync(path.dirname(filePath), { recursive: true }) fs.writeFileSync(filePath, out) diff --git a/ui2abc/libarkts/src/arkts-api/ChainExpressionFilter.ts b/ui2abc/libarkts/src/arkts-api/ChainExpressionFilter.ts index 4976aa6c78b86727adea6753a53fdcede11e3546..3d22c7c46fd7d0c09de50fca8ad5409c5393e170 100644 --- a/ui2abc/libarkts/src/arkts-api/ChainExpressionFilter.ts +++ b/ui2abc/libarkts/src/arkts-api/ChainExpressionFilter.ts @@ -13,7 +13,7 @@ * limitations under the License. */ -import { ChainExpression, Expression, isChainExpression, isMemberExpression, MemberExpression } from "src/generated"; +import { BlockStatement, ChainExpression, Expression, isChainExpression, isMemberExpression, MemberExpression } from "src/generated"; import { AbstractVisitor } from "./AbstractVisitor"; import { AstNode } from "./peers/AstNode" import { factory } from "./factory/nodeFactory"; @@ -65,6 +65,7 @@ export class ChainExpressionFilter extends AbstractVisitor { } + visitor(beforeChildren: BlockStatement): BlockStatement visitor(beforeChildren: AstNode): AstNode { const node = this.visitEachChild(beforeChildren) if (isChainExpression(node)) { diff --git a/ui2abc/libarkts/src/arkts-api/ImportStorage.ts b/ui2abc/libarkts/src/arkts-api/ImportStorage.ts index 50f7d3485c46d2371e7b76b7739080cc4c5de052..f5cfa327291ae9ffdc2b44747cec248b0ab5d5cd 100644 --- a/ui2abc/libarkts/src/arkts-api/ImportStorage.ts +++ b/ui2abc/libarkts/src/arkts-api/ImportStorage.ts @@ -15,10 +15,10 @@ import { KNativePointer } from "@koalaui/interop" import { ETSModule, ImportDeclaration, isETSImportDeclaration, Program, Statement } from "../generated" -import { updateETSModuleByStatements } from "./utilities/public" import { passNode, passNodeArray, unpackNonNullableNode } from "./utilities/private" import { global } from "./static/global" import { Es2pandaImportFlags, Es2pandaImportKinds } from "../generated/Es2pandaEnums" +import { factory } from "./factory/nodeFactory" export class ImportStorage { // TODO: migrate to wrappers instead of pointers @@ -70,9 +70,15 @@ export class ImportStorage { } // Drop import statements generated by compiler in the beginning of the ETSModule - updateETSModuleByStatements( - this.program.ast as ETSModule, - newStatements, + const module = this.program.ast as ETSModule + this.program.setAst( + factory.updateETSModule( + module, + newStatements, + module.ident, + module.getNamespaceFlag(), + module.program, + ) ) } } diff --git a/ui2abc/libarkts/src/arkts-api/InferVoidReturnType.ts b/ui2abc/libarkts/src/arkts-api/InferVoidReturnType.ts index 74ff219b6d08c5abc2414df5c9ad4b0aa88fc749..f25337500afdfd17aaadab8e49299f60dd4808c0 100644 --- a/ui2abc/libarkts/src/arkts-api/InferVoidReturnType.ts +++ b/ui2abc/libarkts/src/arkts-api/InferVoidReturnType.ts @@ -14,7 +14,7 @@ */ import { factory } from "./factory/nodeFactory" -import { isReturnStatement, isScriptFunction, ScriptFunction } from "../generated" +import { BlockStatement, isReturnStatement, isScriptFunction, Program, ScriptFunction } from "../generated" import { AbstractVisitor } from "./AbstractVisitor" import { AstNode } from "./peers/AstNode" import { Es2pandaPrimitiveType, Es2pandaScriptFunctionFlags } from "src/generated/Es2pandaEnums" @@ -50,6 +50,7 @@ function checkReturns(node: AstNode): boolean { } class InferVoidReturnType extends AbstractVisitor { + visitor(node: BlockStatement): BlockStatement visitor(node: AstNode): AstNode { const result = this.visitEachChild(node) if (isScriptFunction(result) && @@ -77,13 +78,8 @@ class InferVoidReturnType extends AbstractVisitor { } return result } - - static instance?: InferVoidReturnType } -export function inferVoidReturnType(node: AstNode) { - if (!InferVoidReturnType.instance) { - InferVoidReturnType.instance = new InferVoidReturnType() - } - InferVoidReturnType.instance.visitor(node) +export function inferVoidReturnType(program: Program) { + program.setAst(new InferVoidReturnType().visitor(program.ast)) } diff --git a/ui2abc/libarkts/src/arkts-api/factory/nodeFactory.ts b/ui2abc/libarkts/src/arkts-api/factory/nodeFactory.ts index f783231da2b9a65aad48c8083dda00696dd8f784..b6e26ca801958f2413fd23c00495c3b4db3f1c75 100644 --- a/ui2abc/libarkts/src/arkts-api/factory/nodeFactory.ts +++ b/ui2abc/libarkts/src/arkts-api/factory/nodeFactory.ts @@ -16,6 +16,7 @@ import { ClassDefinition, ETSImportDeclaration, + ETSModule, ETSStructDeclaration, ETSTuple, ETSTypeReferencePart, @@ -35,7 +36,7 @@ import { updateTSTypeParameter } from "../node-utilities/TSTypeParameter" import { updateETSTypeReferencePart } from "../node-utilities/TSTypeReferencePart" import { updateETSImportDeclaration } from "../node-utilities/ETSImportDeclaration" import { updateVariableDeclarator } from "../node-utilities/VariableDeclarator" -import { updateClassDefinition } from "../node-utilities/ClassDefinition" +import { createClassDefinition, updateClassDefinition } from "../node-utilities/ClassDefinition" import { updateETSStructDeclaration } from "../node-utilities/ETSStructDeclaration" import { createClassProperty, updateClassProperty } from "../node-utilities/ClassProperty" import { createETSFunctionType, updateETSFunctionType } from "../node-utilities/ETSFunctionType" @@ -52,10 +53,14 @@ import { createTSTypeAliasDeclaration, updateTSTypeAliasDeclaration } from "../n import { createClassDeclaration, updateClassDeclaration } from "../node-utilities/ClassDeclaration" import { createBlockStatement, updateBlockStatement } from "../node-utilities/BlockStatement" import { updateAnnotationUsage } from "../node-utilities/AnnotationUsage" +import { updateETSModule } from "../node-utilities/ETSModule" export const factory = { ...generatedFactory, + createETSModule: ETSModule.createETSModule, + updateETSModule, + createCallExpression, updateCallExpression, @@ -89,7 +94,7 @@ export const factory = { createETSStructDeclaration: ETSStructDeclaration.createETSStructDeclaration, updateETSStructDeclaration, - createClassDefinition: ClassDefinition.createClassDefinition, + createClassDefinition, updateClassDefinition, createClassDeclaration, diff --git a/ui2abc/libarkts/src/arkts-api/node-utilities/ClassDefinition.ts b/ui2abc/libarkts/src/arkts-api/node-utilities/ClassDefinition.ts index 9f7cc78c255c7e32f6b6274b4ffe008ab562ef4e..eeaa79bd7eec10c92841b98c8986aaf6ae71767c 100644 --- a/ui2abc/libarkts/src/arkts-api/node-utilities/ClassDefinition.ts +++ b/ui2abc/libarkts/src/arkts-api/node-utilities/ClassDefinition.ts @@ -14,6 +14,7 @@ */ import { + AnnotationUsage, ClassDefinition, Expression, Identifier, @@ -29,6 +30,35 @@ import { AstNode } from "../peers/AstNode" import { Es2pandaClassDefinitionModifiers, Es2pandaModifierFlags } from "../../generated/Es2pandaEnums" import { throwError } from "../../utils" +export function createClassDefinition( + ident: Identifier | undefined, + typeParams: TSTypeParameterDeclaration | undefined, + superTypeParams: TSTypeParameterInstantiation | undefined, + _implements: readonly TSClassImplements[], + ctor: MethodDefinition | undefined, + superClass: Expression | undefined, + body: readonly AstNode[], + modifiers: Es2pandaClassDefinitionModifiers, + flags: Es2pandaModifierFlags, + annotations?: readonly AnnotationUsage[], +) { + const res = ClassDefinition.createClassDefinition( + ident, + typeParams, + superTypeParams, + _implements, + ctor, + superClass, + body, + modifiers, + flags, + ) + if (annotations) { + res.setAnnotations(annotations) + } + return res +} + export function updateClassDefinition( original: ClassDefinition, ident: Identifier | undefined, @@ -39,7 +69,8 @@ export function updateClassDefinition( superClass: Expression | undefined, body: readonly AstNode[], modifiers: Es2pandaClassDefinitionModifiers, - flags: Es2pandaModifierFlags + flags: Es2pandaModifierFlags, + annotations?: readonly AnnotationUsage[], ): ClassDefinition { if (original.ctor !== undefined && !isMethodDefinition(original.ctor)) { throwError(`class definition constructor is not method definition: ${ctor?.dump()}`) @@ -53,11 +84,12 @@ export function updateClassDefinition( && (isSameNativeObject(body, original.body)) && (isSameNativeObject(modifiers, original.modifiers)) && (isSameNativeObject(flags, original.modifierFlags)) + && (isSameNativeObject(annotations, original.annotations)) ) { return original } return updateNodeByNode( - ClassDefinition.createClassDefinition( + createClassDefinition( ident, typeParams, superTypeParams, @@ -66,8 +98,9 @@ export function updateClassDefinition( superClass, body, modifiers, - flags - ).setAnnotations(original.annotations), + flags, + annotations + ), original ) } diff --git a/ui2abc/libarkts/src/arkts-api/node-utilities/ETSModule.ts b/ui2abc/libarkts/src/arkts-api/node-utilities/ETSModule.ts new file mode 100644 index 0000000000000000000000000000000000000000..c875efab0bfb15a8eb20042b31cf5321c0ea887f --- /dev/null +++ b/ui2abc/libarkts/src/arkts-api/node-utilities/ETSModule.ts @@ -0,0 +1,44 @@ +/* + * Copyright (c) 2024 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { ETSModule, Identifier, Program, Statement } from "../../generated" +import { isSameNativeObject } from "../peers/ArktsObject" +import { updateNodeByNode } from "../utilities/private" +import { Es2pandaModuleFlag } from "../../generated/Es2pandaEnums" + +export function updateETSModule( + original: ETSModule, + statementList: readonly Statement[], + ident: Identifier | undefined, + flag: Es2pandaModuleFlag, + program?: Program, +) { + if (isSameNativeObject(statementList, original.statements) + && isSameNativeObject(ident, original.ident) + && isSameNativeObject(flag, original.getNamespaceFlag()) + && isSameNativeObject(program, original.program) + ) { + return original + } + return updateNodeByNode( + ETSModule.createETSModule( + statementList, + ident, + flag, + program, + ), + original, + ) +} diff --git a/ui2abc/libarkts/src/arkts-api/static/global.ts b/ui2abc/libarkts/src/arkts-api/static/global.ts index 24929ad5002535300fb6d8f352167330b9de115b..84e7ff3d854e6b0ef19f541505d0e674f2456863 100644 --- a/ui2abc/libarkts/src/arkts-api/static/global.ts +++ b/ui2abc/libarkts/src/arkts-api/static/global.ts @@ -22,6 +22,22 @@ import { Context } from "../peers/Context" import { Profiler } from "./profiler" import { ArkTsConfig } from "../../generated" +export class UpdateTracker { + stack: boolean[] = [] + + push() { + this.stack.push(false) + } + + update() { + this.stack[this.stack.length - 1] = true + } + + check() { + return this.stack.pop() + } +} + export class global { public static filePath: string = "./plugins/input/main.ets" @@ -76,4 +92,7 @@ export class global { // Check node type values during node creation public static validatePeerTypes = false + + // Keep track of update info to optimize performance + public static updateTracker: UpdateTracker = new UpdateTracker() } diff --git a/ui2abc/libarkts/src/arkts-api/utilities/method-definition.ts b/ui2abc/libarkts/src/arkts-api/utilities/extensions.ts similarity index 68% rename from ui2abc/libarkts/src/arkts-api/utilities/method-definition.ts rename to ui2abc/libarkts/src/arkts-api/utilities/extensions.ts index 03ce9107a982fc99e572b6d24ed28e91d2e7828b..e0f421fe5bd25ad9c1145eaf147d04c87f5e97ea 100644 --- a/ui2abc/libarkts/src/arkts-api/utilities/method-definition.ts +++ b/ui2abc/libarkts/src/arkts-api/utilities/extensions.ts @@ -13,10 +13,20 @@ * limitations under the License. */ -import type { MethodDefinition } from "../../generated" +import type { + ETSModule, + MethodDefinition +} from "../../generated" +import { Es2pandaModuleFlag } from "../../generated/Es2pandaEnums" import { global } from "../../reexport-for-generated" -export function methodDefinitionSetChildrenParentPtr(this: MethodDefinition) { +export function extension_ETSModuleGetNamespaceFlag(this: ETSModule): Es2pandaModuleFlag { + return (this.isETSScript ? Es2pandaModuleFlag.MODULE_FLAG_ETSSCRIPT : 0) + + (this.isNamespace ? Es2pandaModuleFlag.MODULE_FLAG_NAMESPACE : 0) + + (this.isNamespaceChainLastNode ? Es2pandaModuleFlag.MODULE_FLAG_NAMESPACE_CHAIN_LAST_NODE : 0) +} + +export function extension_MethodDefinitionSetChildrenParentPtr(this: MethodDefinition) { global.es2panda._AstNodeSetChildrenParentPtr(global.context, this.peer) const overloads = this.overloads for (const overload of overloads) { @@ -25,7 +35,7 @@ export function methodDefinitionSetChildrenParentPtr(this: MethodDefinition) { } } -export function methodDefinitionOnUpdate(this: MethodDefinition, original: MethodDefinition): void { +export function extension_MethodDefinitionOnUpdate(this: MethodDefinition, original: MethodDefinition): void { this.setChildrenParentPtr() // TODO Update modifiers only for specific AST nodes in the generated factory code this.modifierFlags = original.modifierFlags diff --git a/ui2abc/libarkts/src/arkts-api/utilities/public.ts b/ui2abc/libarkts/src/arkts-api/utilities/public.ts index 9b9d3b6dbfb539581ac6d830cdc4b88792ccffa1..df96fda2be96e752f379a41d22d21c22c3e2060f 100644 --- a/ui2abc/libarkts/src/arkts-api/utilities/public.ts +++ b/ui2abc/libarkts/src/arkts-api/utilities/public.ts @@ -37,6 +37,11 @@ import { Context } from "../peers/Context" import { NodeCache } from "../node-cache" import { listPrograms } from "../plugins" +/** + * TODO: Replace or remove with better naming + * + * @deprecated + */ export function createETSModuleFromContext(): ETSModule { let program = global.es2panda._ContextProgram(global.context) if (program == nullptr) { @@ -50,6 +55,12 @@ export function createETSModuleFromContext(): ETSModule { return new ETSModule(ast) } +/** + * Now used only in tests + * TODO: Remove or replace with better method + * + * @deprecated + */ export function createETSModuleFromSource( source: string, state: Es2pandaContextState = Es2pandaContextState.ES2PANDA_STATE_PARSED, @@ -70,17 +81,6 @@ export function metaDatabase(fileName: string): string { return `${fileName}.meta.json` } -export function updateETSModuleByStatements( - node: ETSModule, - statements: readonly AstNode[], -): ETSModule { - if (isSameNativeObject(statements, node.statements)) { - return node - } - global.generatedEs2panda._BlockStatementSetStatements(global.context, node.peer, passNodeArray(statements), statements.length) - return node -} - export function checkErrors() { if (global.es2panda._ContextState(global.context) === Es2pandaContextState.ES2PANDA_STATE_ERROR) { console.log() @@ -116,13 +116,13 @@ export function rebindSubtree(node: AstNode): void { checkErrors() } -export function recheckContext(context: KNativePointer): void { +export function recheckContext(context?: KNativePointer): void { global.es2panda._AstNodeRecheck( - context, + context ?? global.context, global.es2panda._ProgramAst( - context, + context ?? global.context, global.es2panda._ContextProgram( - context + context ?? global.context, ) ) ) diff --git a/ui2abc/libarkts/src/arkts-api/visitor.ts b/ui2abc/libarkts/src/arkts-api/visitor.ts index 221521bae090da7e7653dfc07024477b0d226f04..27101c806aa35f6fa5850c5ce553e618ce7ce375 100644 --- a/ui2abc/libarkts/src/arkts-api/visitor.ts +++ b/ui2abc/libarkts/src/arkts-api/visitor.ts @@ -14,6 +14,8 @@ */ import { + AnnotationUsage, + Expression, isArrayExpression, isArrowFunctionExpression, isAssignmentExpression, @@ -65,13 +67,15 @@ import { isUpdateExpression, isVariableDeclaration, isVariableDeclarator, - isWhileStatement + isWhileStatement, + MethodDefinition, + Statement, + TSClassImplements } from "../generated" import { Es2pandaImportKinds } from "../generated/Es2pandaEnums" import { factory } from "./factory/nodeFactory" import { AstNode } from "./peers/AstNode" import { global } from "./static/global" -import { updateETSModuleByStatements } from "./utilities/public" type Visitor = (node: AstNode, options?: object) => AstNode @@ -129,7 +133,11 @@ function nodeVisitor(node: T, visitor: Visitor): if (node === undefined) { return node } - return visitor(node) as T + const result = visitor(node) as T + if (node != result) { + global.updateTracker.update() + } + return result } // TODO: rethink (remove as) @@ -137,7 +145,13 @@ function nodesVisitor(n if (nodes === undefined) { return nodes } - return nodes.map(node => visitor(node) as T) + return nodes.map(node => { + const result = visitor(node) as T + if (node != result) { + global.updateTracker.update() + } + return result + }) } export function visitEachChild( @@ -146,90 +160,151 @@ export function visitEachChild( ): AstNode { global.profiler.nodeVisited() if (isETSModule(node)) { - return updateETSModuleByStatements( - node, - nodesVisitor(node.statements, visitor) + global.updateTracker.push() + const newStatements: readonly Statement[] = nodesVisitor(node.statements, visitor) + const newIdent = nodeVisitor(node.ident, visitor) + if (!global.updateTracker.check()) { + return node + } + return factory.createETSModule( + newStatements, + newIdent, + node.getNamespaceFlag(), + node.program, ) } if (isCallExpression(node)) { - return factory.updateCallExpression( - node, - nodeVisitor(node.callee, visitor), - nodesVisitor(node.arguments, visitor), - nodeVisitor(node.typeParams, visitor), + global.updateTracker.push() + const newCallee = nodeVisitor(node.callee, visitor) + const newArguments: readonly Expression[] = nodesVisitor(node.arguments, visitor) + const newTypeParams = nodeVisitor(node.typeParams, visitor) + const newTrailingBlock = nodeVisitor(node.trailingBlock, visitor) + if (!global.updateTracker.check()) { + return node + } + return factory.createCallExpression( + newCallee, + newArguments, + newTypeParams, node.isOptional, node.hasTrailingComma, - nodeVisitor(node.trailingBlock, visitor) + newTrailingBlock, ) } if (isFunctionDeclaration(node)) { - return factory.updateFunctionDeclaration( - node, - nodeVisitor(node.function, visitor), - nodesVisitor(node.annotations, visitor), + global.updateTracker.push() + const newFunction = nodeVisitor(node.function, visitor) + const newAnnotations: readonly AnnotationUsage[] = nodesVisitor(node.annotations, visitor) + if (!global.updateTracker.check()) { + return node + } + return factory.createFunctionDeclaration( + newFunction, + newAnnotations, node.isAnonymous, ) } if (isBlockStatement(node)) { - return factory.updateBlockStatement( - node, - nodesVisitor(node.statements, visitor), + global.updateTracker.push() + const newStatements: readonly Statement[] = nodesVisitor(node.statements, visitor) + if (!global.updateTracker.check()) { + return node + } + return factory.createBlockStatement( + newStatements, ) } if (isBlockExpression(node)) { - return factory.updateBlockExpression( - node, - nodesVisitor(node.statements, visitor), + global.updateTracker.push() + const newStatements: readonly Statement[] = nodesVisitor(node.statements, visitor) + if (!global.updateTracker.check()) { + return node + } + return factory.createBlockExpression( + newStatements, ) } if (isChainExpression(node)) { - return factory.updateChainExpression( - node, - nodeVisitor(node.expression, visitor), + global.updateTracker.push() + const newExpression = nodeVisitor(node.expression, visitor) + if (!global.updateTracker.check()) { + return node + } + return factory.createChainExpression( + newExpression, ) } if (isExpressionStatement(node)) { - return factory.updateExpressionStatement( - node, - nodeVisitor(node.expression, visitor) + global.updateTracker.push() + const newExpression = nodeVisitor(node.expression, visitor) + if (!global.updateTracker.check()) { + return node + } + return factory.createExpressionStatement( + newExpression, ) } if (isETSStructDeclaration(node)) { - return factory.updateETSStructDeclaration( - node, - nodeVisitor(node.definition, visitor) + global.updateTracker.push() + const newDefinition = nodeVisitor(node.definition, visitor) + if (!global.updateTracker.check()) { + return node + } + return factory.createETSStructDeclaration( + newDefinition ) } if (isClassDeclaration(node)) { - return factory.updateClassDeclaration( - node, - nodeVisitor(node.definition, visitor), + global.updateTracker.push() + const newDefinition = nodeVisitor(node.definition, visitor) + if (!global.updateTracker.check()) { + return node + } + return factory.createClassDeclaration( + newDefinition, node.modifierFlags, ) } if (isClassDefinition(node)) { - return factory.updateClassDefinition( - node, - nodeVisitor(node.ident, visitor), - nodeVisitor(node.typeParams, visitor), - nodeVisitor(node.superTypeParams, visitor), - nodesVisitor(node.implements, visitor), + global.updateTracker.push() + const newIdent = nodeVisitor(node.ident, visitor) + const newTypeParams = nodeVisitor(node.typeParams, visitor) + const newSuperTypeParams = nodeVisitor(node.superTypeParams, visitor) + const newImplements: readonly TSClassImplements[] = nodesVisitor(node.implements, visitor) + const newSuper = nodeVisitor(node.super, visitor) + const newBody = nodesVisitor(node.body, visitor) + const newAnnotations: readonly AnnotationUsage[] = nodesVisitor(node.annotations, visitor) + if (!global.updateTracker.check()) { + return node + } + return factory.createClassDefinition( + newIdent, + newTypeParams, + newSuperTypeParams, + newImplements, undefined, /* can not pass node.ctor here because of mismatching types */ - nodeVisitor(node.super, visitor), - nodesVisitor(node.body, visitor), + newSuper, + newBody, node.modifiers, - node.modifierFlags + node.modifierFlags, + newAnnotations, ) } if (isMethodDefinition(node)) { - return factory.updateMethodDefinition( - node, + global.updateTracker.push() + const newId = nodeVisitor(node.id, visitor) + const newValue = nodeVisitor(node.value, visitor) + const newOverloads: readonly MethodDefinition[] = nodesVisitor(node.overloads, visitor) + if (!global.updateTracker.check()) { + return node + } + return factory.createMethodDefinition( node.kind, - nodeVisitor(node.id, visitor), - nodeVisitor(node.value, visitor), + newId, + newValue, node.modifierFlags, node.isComputed, - nodesVisitor(node.overloads, visitor) + newOverloads, ) } if (isScriptFunction(node)) { diff --git a/ui2abc/libarkts/src/generated/peers/ETSModule.ts b/ui2abc/libarkts/src/generated/peers/ETSModule.ts index 2ab32b6db42552e3c4b75089206b2434599a190f..f41254c6f4818bcab74cf302a0e1a4b7e0fac82f 100644 --- a/ui2abc/libarkts/src/generated/peers/ETSModule.ts +++ b/ui2abc/libarkts/src/generated/peers/ETSModule.ts @@ -41,6 +41,7 @@ import { Es2pandaModuleFlag } from "./../Es2pandaEnums" import { Identifier } from "./Identifier" import { Program } from "./Program" import { Statement } from "./Statement" +import { extension_ETSModuleGetNamespaceFlag } from "./../../reexport-for-generated" export class ETSModule extends BlockStatement { constructor(pointer: KNativePointer) { @@ -121,6 +122,7 @@ export class ETSModule extends BlockStatement { global.generatedEs2panda._ETSModuleAddAnnotations(global.context, this.peer, passNode(annotations)) return this } + getNamespaceFlag = extension_ETSModuleGetNamespaceFlag protected readonly brandETSModule: undefined } export function isETSModule(node: object | undefined): node is ETSModule { diff --git a/ui2abc/libarkts/src/generated/peers/MethodDefinition.ts b/ui2abc/libarkts/src/generated/peers/MethodDefinition.ts index 73417799860ba236c97203fb464d4bd6b389b50e..f4b889f7781de39f533634f59e0bf63e5708c3dd 100644 --- a/ui2abc/libarkts/src/generated/peers/MethodDefinition.ts +++ b/ui2abc/libarkts/src/generated/peers/MethodDefinition.ts @@ -39,8 +39,8 @@ import { Es2pandaMethodDefinitionKind } from "./../Es2pandaEnums" import { Es2pandaModifierFlags } from "./../Es2pandaEnums" import { Expression } from "./Expression" import { ScriptFunction } from "./ScriptFunction" -import { methodDefinitionOnUpdate } from "./../../reexport-for-generated" -import { methodDefinitionSetChildrenParentPtr } from "./../../reexport-for-generated" +import { extension_MethodDefinitionOnUpdate } from "./../../reexport-for-generated" +import { extension_MethodDefinitionSetChildrenParentPtr } from "./../../reexport-for-generated" export class MethodDefinition extends ClassElement { constructor(pointer: KNativePointer) { @@ -135,8 +135,8 @@ export class MethodDefinition extends ClassElement { global.generatedEs2panda._MethodDefinitionSetValueOverloads(global.context, this.peer, passNode(overloads), index) return this } - setChildrenParentPtr = methodDefinitionSetChildrenParentPtr - onUpdate = methodDefinitionOnUpdate + setChildrenParentPtr = extension_MethodDefinitionSetChildrenParentPtr + onUpdate = extension_MethodDefinitionOnUpdate protected readonly brandMethodDefinition: undefined } export function isMethodDefinition(node: object | undefined): node is MethodDefinition { diff --git a/ui2abc/libarkts/src/plugin-utils.ts b/ui2abc/libarkts/src/plugin-utils.ts index 7a1a55654ff37326c205099dee863f285b3781e4..71b270837a8e00e2db5dac8dfd66f447fb67d573 100644 --- a/ui2abc/libarkts/src/plugin-utils.ts +++ b/ui2abc/libarkts/src/plugin-utils.ts @@ -48,20 +48,17 @@ export function runTransformerOnProgram(program: Program, options: CompilationOp // Perform some additional actions before the transformation start hooks.onProgramTransformStart?.(options) - // AST to be transformed - const ast = program.ast - // Save currently existing imports in the program const importStorage = new ImportStorage(program, options.stage == Es2pandaContextState.ES2PANDA_STATE_PARSED) // Run some common plugins that should be run before plugin usage and depends on the current stage - stageSpecificPreFilters(ast, options.stage) + stageSpecificPreFilters(program, options.stage) // Run the plugin itself transform?.(program, options, pluginContext) // Run some common plugins that should be run after plugin usage and depends on the current stage - stageSpecificPostFilters(ast, options.stage) + stageSpecificPostFilters(program, options.stage) // Update internal import information based on import modification by plugin importStorage.update() @@ -101,14 +98,14 @@ function setAllParents(ast: AstNode) { arktsGlobal.es2panda._AstNodeUpdateAll(arktsGlobal.context, ast.peer) } -function stageSpecificPreFilters(script: AstNode, state: Es2pandaContextState) { +function stageSpecificPreFilters(program: Program, state: Es2pandaContextState) { if (state == Es2pandaContextState.ES2PANDA_STATE_CHECKED) { - inferVoidReturnType(script) + inferVoidReturnType(program) } } -function stageSpecificPostFilters(script: AstNode, state: Es2pandaContextState) { +function stageSpecificPostFilters(program: Program, state: Es2pandaContextState) { if (state == Es2pandaContextState.ES2PANDA_STATE_CHECKED) { - new ChainExpressionFilter().visitor(script) + program.setAst(new ChainExpressionFilter().visitor(program.ast)) } } diff --git a/ui2abc/libarkts/src/reexport-for-generated.ts b/ui2abc/libarkts/src/reexport-for-generated.ts index 10b213eee4e9d42e6a09bd5c8aef72a3299ec9a0..22b9296eb98d6fe7f90dc0fbe3fd7782ed841967 100644 --- a/ui2abc/libarkts/src/reexport-for-generated.ts +++ b/ui2abc/libarkts/src/reexport-for-generated.ts @@ -31,4 +31,8 @@ export { export { nodeByType } from "./arkts-api/class-by-peer" export { global } from "./arkts-api/static/global" export { Es2pandaMemberExpressionKind } from "./generated/Es2pandaEnums" -export { methodDefinitionSetChildrenParentPtr, methodDefinitionOnUpdate } from "./arkts-api/utilities/method-definition" +export { + extension_ETSModuleGetNamespaceFlag, + extension_MethodDefinitionOnUpdate, + extension_MethodDefinitionSetChildrenParentPtr, +} from "./arkts-api/utilities/extensions" diff --git a/ui2abc/libarkts/src/utils.ts b/ui2abc/libarkts/src/utils.ts index d7544784ce3181cce6caa3af7193b24306436952..993df266928ee7ccbe795906c344eb6582695996 100644 --- a/ui2abc/libarkts/src/utils.ts +++ b/ui2abc/libarkts/src/utils.ts @@ -115,7 +115,6 @@ function replaceGensymWrappers(code: string): string { return code } - function addExports(code: string): string { const exportAstNodes = [" enum", "let", "const", "class", "abstract class", "@Entry() @Component() final class", "@Component() final class", "interface", "@interface", "type", "enum", "final class", "function", "declare interface", "@memo_stable() declare interface", "@memo_stable() interface", @@ -140,162 +139,12 @@ function addExports(code: string): string { return code.replaceAll("\nexport function main()", "\nfunction main()") } -function removeAbstractFromInterfaces(code: string): string { - const interfaces = [...code.matchAll(/interface([\s\S]*?){([\s\S]*?)\n}\n/g)].map(it => it[0]) - interfaces.forEach((content) => { - const newContent = content.replaceAll('abstract ', '') - code = code.replaceAll(content, newContent) - }) - return code -} - -function removeInvalidLambdaTyping(code: string): string { - const knownTypes = ['boolean', 'int64', 'void'] - return code.replaceAll(/\(([^\n\(\)]*?)\): ([\S]*?) => {/g, (match, p1, p2) => { - if (knownTypes.includes(p2)) { - return match - } - return `(${p1}) => {` - }) -} - -function returnOptionalParams(code: string): string { - const reduce = (line: string): string => { - if (line.includes("constructor")) { - return line - } - for (var i = 0; i < line.length; i++) { - if (line[i] == '(') { - let ignore = false - for (var k = i; k >= 0; k--) { - if (line[k].match(/[a-zA-Z<>_0-9]/)) { - break - } - if (line[k] == ':') { - ignore = true - } - } - if (ignore) { - continue - } - const initi = i - let j = i + 1, depth = 1 - let parts: string[] = [] - while (j < line.length) { - if (line[j] == '(') { - depth++ - } - if (line[j] == ')') { - depth-- - if (depth == 0) { - parts.push(line.substring(i + 1, j)) - break - } - } - if (line[j] == ',' && depth == 1) { - parts.push(line.substring(i + 1, j)) - i = j + 1 - } - j++ - } - if (depth == 0 && parts.length && parts.every(it => it.includes(": ") && !it.includes("? "))) { - let k = parts.length - 1 - while (k >= 0) { - if (parts[k].endsWith(" | undefined")) { - let w = parts[k].substring(0, parts[k].length - " | undefined".length) - let i = w.indexOf(':') - if (w[i - 1] != '?') { - parts[k] = w.substring(0, i) + "?" + w.substring(i) - } - } else { - break - } - k-- - } - if (k != parts.length - 1) { - let nline = line.substring(0, initi + 1) + parts.join(', ') + line.substring(j) - return nline - } - } - i = initi - } - } - return line - } - return code.split('\n').map((line) => { - let nline = reduce(line) - while (nline != line) { - line = nline - nline = reduce(line) - } - return line - }).join('\n') -} - -function fixPropertyLines(code: string): string { - /* - - for some properties the following construction is generated: - - private readonly name = false; - - public name(name) { // for readonly properties "setter" is also generated - (this).name = name = false; // sometimes there is a typing here - return; - } - - public name() { - return (this).name; - } - - this function wraps this back to `readonly name = false;` - - */ - return code.replaceAll(/(private|public)(.*)?(.*?)\n((.*?)\n){9}/g, (match, p1, p2, p3) => { - return `public ${p2} ${p3}` - }) -} - -function fixDuplicateSettersInInterfaces(code: string): string { - /* - - sometimes interfaces contains duplicate setters, this functions fixes it - - */ - code = code.replaceAll(/\n[ ]*(.*)interface(.*){\n([\s\S]*?)\n[ ]*}\n/g, (match, modifiers, p1, p2: string) => { - const keep = p2.split('\n').filter((it) => !it.trimStart().startsWith(`set`)) - const setters = [...new Set(p2.split('\n').filter((it) => it.trimStart().startsWith(`set`)))] - return `\n${modifiers}interface${p1}{\n${keep.join('\n')}\n${setters.join('\n')}\n}\n` - }) - return code -} - function excludePartialInterfaces(code: string): string { return code .replaceAll(/export interface (.*)\$partial<>([\s\S]*?)}/g, '') .replaceAll(/interface (.*)\$partial<>([\s\S]*?)}/g, '') } -function fixNamespace(code: string) { - /* - namespaces become abstract classes, and enums become final classes - enum in namespace -> class in class -> not supported - - we have only one such place, so fix manually - */ - code = code.replaceAll(/export (declare )?abstract class (Profiler|GestureControl|text|common2D|common|observer|unifiedDataChannel|uniformTypeDescriptor|drawing|uiEffect|intl|matrix4|image|pointer|promptAction|webview|window) {/g, `export $1 namespace $2 {`) - code = code.replaceAll(`public static _$init$_() {}`, ``) - code = code.replaceAll(`public static _$init$_(): void {}`, ``) - code = code.replaceAll(/.*_\$initializerBlockInit\$_.*/g, ``) - code = code.replaceAll(/public static ((?:un)?registerVsyncCallback)/g, "export function $1") - code = code.replaceAll(/public static (setCursor)/g, "export function $1") - code = code.replaceAll(/public static (restoreDefault)/g, "export function $1") - code = code.replaceAll(/public static (requestFocus\(value)/g, "export function $1") - code = code.replaceAll(/public static (getSystemFontFullNamesByType|getFontDescriptorByFullName|matchFontDescriptors|createEffect|createBrightnessBlender)/g, "export function $1") - code = code.replaceAll('\n type Blender =', '\n export type Blender = ') - return code -} - function fixEnums(code: string) { const lines = code.split('\n') const enums = [] @@ -344,10 +193,7 @@ export function filterSource(text: string): string { // console.error(text.split('\n').map((it, index) => `${`${index + 1}`.padStart(4)} |${it}`).join('\n')) const dumperUnwrappers = [ addExports, - fixNamespace, fixEnums, - fixDuplicateSettersInInterfaces, - removeAbstractFromInterfaces, replaceGensymWrappers, // nested replaceGensymWrappers, // nested replaceGensymWrappers, @@ -356,9 +202,6 @@ export function filterSource(text: string): string { excludePartialInterfaces, (code: string) => code.replaceAll("", "_cctor_"), (code: string) => code.replaceAll("public constructor() {}", ""), - (code: string) => code.replaceAll("@Module()", ""), - (code: string) => code.replaceAll("export * as from", "export * from"), - fixPropertyLines ] // console.error("====") // console.error(dumperUnwrappers.reduceRight((code, f) => f(code), text).split('\n').map((it, index) => `${`${index + 1}`.padStart(4)} |${it}`).join('\n')) diff --git a/ui2abc/libarkts/test/arkts-api/expressions/call-expression.test.ts b/ui2abc/libarkts/test/arkts-api/expressions/call-expression.test.ts index 175494dd83df1147fa98ee08303ddf8c40cb3d2e..4e3a6005f6e9eb314bd292f326e698b624dd25c3 100644 --- a/ui2abc/libarkts/test/arkts-api/expressions/call-expression.test.ts +++ b/ui2abc/libarkts/test/arkts-api/expressions/call-expression.test.ts @@ -31,7 +31,7 @@ suite(util.basename(__filename), () => { let script = arkts.createETSModuleFromSource(sample_in) - script = arkts.updateETSModuleByStatements( + script = arkts.factory.updateETSModule( script, [ script.statements[0], @@ -56,7 +56,10 @@ suite(util.basename(__filename), () => { undefined, ) ) - ] + ], + script.ident, + script.getNamespaceFlag(), + script.program, ) util.ARKTS_TEST_ASSERTION( diff --git a/ui2abc/libarkts/test/arkts-api/functions/create.test.ts b/ui2abc/libarkts/test/arkts-api/functions/create.test.ts index b6e85b60da7ad79a6c0d218a7bd816869aeec839..bc2fdaa9c2982422524d1b37a82f4dab989d98db 100644 --- a/ui2abc/libarkts/test/arkts-api/functions/create.test.ts +++ b/ui2abc/libarkts/test/arkts-api/functions/create.test.ts @@ -80,7 +80,7 @@ suite(util.basename(__filename), () => { ) funcDecl.updateModifiers(scriptFunc.modifierFlags) - script = arkts.updateETSModuleByStatements( + script = arkts.factory.updateETSModule( script, [ script.statements[0], @@ -94,7 +94,10 @@ suite(util.basename(__filename), () => { undefined, ) ) - ] + ], + script.ident, + script.getNamespaceFlag(), + script.program, ) util.ARKTS_TEST_ASSERTION( @@ -215,7 +218,7 @@ suite(util.basename(__filename), () => { ) funcDecl.updateModifiers(scriptFunc.modifierFlags) - script = arkts.updateETSModuleByStatements( + script = arkts.factory.updateETSModule( script, [ script.statements[0], @@ -233,7 +236,10 @@ suite(util.basename(__filename), () => { undefined, ) ) - ] + ], + script.ident, + script.getNamespaceFlag(), + script.program, ) util.ARKTS_TEST_ASSERTION( diff --git a/ui2abc/libarkts/test/arkts-api/general/basic.test.ts b/ui2abc/libarkts/test/arkts-api/general/basic.test.ts index 84e8044f3e817916c6c949ebfba4ef232df57b1a..e76d7c4bbc45371129b970f9aaa36ea341b59ec8 100644 --- a/ui2abc/libarkts/test/arkts-api/general/basic.test.ts +++ b/ui2abc/libarkts/test/arkts-api/general/basic.test.ts @@ -24,7 +24,7 @@ suite(util.basename(__filename), () => { let script = arkts.createETSModuleFromSource(sample_in) - script = arkts.updateETSModuleByStatements( + script = arkts.factory.updateETSModule( script, [ arkts.factory.createExpressionStatement( @@ -32,7 +32,10 @@ suite(util.basename(__filename), () => { 'abc' ) ) - ] + ], + script.ident, + script.getNamespaceFlag(), + script.program, ) util.ARKTS_TEST_ASSERTION( diff --git a/ui2abc/libarkts/test/arkts-api/general/recheck.test.ts b/ui2abc/libarkts/test/arkts-api/general/recheck.test.ts index 516e668ba79916c144b94ff01a78a47456e12258..36fe47183a18735120fc7cedb576178a9295651f 100644 --- a/ui2abc/libarkts/test/arkts-api/general/recheck.test.ts +++ b/ui2abc/libarkts/test/arkts-api/general/recheck.test.ts @@ -34,7 +34,8 @@ function createConfig() { } class RenameTestFunction extends arkts.AbstractVisitor { - visitor(beforeChildren: arkts.AstNode) { + visitor(node: arkts.BlockStatement): arkts.BlockStatement + visitor(beforeChildren: arkts.AstNode): arkts.AstNode { const node = this.visitEachChild(beforeChildren) // Don't change name at checked stage, add another import if (arkts.isImportDeclaration(node)) return node @@ -61,39 +62,45 @@ suite(util.basename(__filename), () => { arkts.proceedToState(arkts.Es2pandaContextState.ES2PANDA_STATE_PARSED) - const importStorage = new arkts.ImportStorage(arkts.arktsGlobal.compilerContext.program, true) - const module = arkts.createETSModuleFromContext() - - arkts.updateETSModuleByStatements( - module, - [ - arkts.factory.createETSImportDeclaration( - arkts.factory.createStringLiteral( - './library' - ), - [ - arkts.factory.createImportSpecifier( - arkts.factory.createIdentifier( - 'testFunction' - ), - arkts.factory.createIdentifier( - 'testFunction' + const program = arkts.arktsGlobal.compilerContext.program + const importStorage = new arkts.ImportStorage(program, true) + const module = program.ast as arkts.ETSModule + + program.setAst( + arkts.factory.updateETSModule( + module, + [ + arkts.factory.createETSImportDeclaration( + arkts.factory.createStringLiteral( + './library' + ), + [ + arkts.factory.createImportSpecifier( + arkts.factory.createIdentifier( + 'testFunction' + ), + arkts.factory.createIdentifier( + 'testFunction' + ) ) - ) - ], - arkts.Es2pandaImportKinds.IMPORT_KINDS_ALL, - ), - ...module.statements, - ] + ], + arkts.Es2pandaImportKinds.IMPORT_KINDS_ALL, + ), + ...module.statements, + ], + module.ident, + module.getNamespaceFlag(), + module.program, + ) ) importStorage.update() - arkts.arktsGlobal.es2panda._AstNodeUpdateAll(arkts.arktsGlobal.context, module.peer) arkts.proceedToState(arkts.Es2pandaContextState.ES2PANDA_STATE_CHECKED) - arkts.recheckSubtree(module) + + arkts.recheckContext() util.assert.equal( - module.dumpSrc(), ` + program.ast.dumpSrc(), ` import { testFunction as testFunction } from "./library"; function main() {} @@ -101,7 +108,7 @@ function main() {} console.log("test"); `, - `invalid result: ${module.dumpSrc()}`) + `invalid result: ${program.ast.dumpSrc()}`) arkts.proceedToState(arkts.Es2pandaContextState.ES2PANDA_STATE_BIN_GENERATED) }) @@ -119,49 +126,53 @@ console.log("test"); arkts.proceedToState(arkts.Es2pandaContextState.ES2PANDA_STATE_CHECKED) - const importStorage = new arkts.ImportStorage(arkts.arktsGlobal.compilerContext.program, true) - const module = arkts.createETSModuleFromContext() + const program = arkts.arktsGlobal.compilerContext.program + const importStorage = new arkts.ImportStorage(program, true) + const module = program.ast as arkts.ETSModule arkts.programGetExternalSources(arkts.arktsGlobal.compilerContext.program).forEach(it => { if (!it.getName().includes("library")) return it.programs.forEach(program => { - new RenameTestFunction().visitor(program.ast) - arkts.arktsGlobal.es2panda._AstNodeUpdateAll(program.ast.peer, module.peer) + program.setAst(new RenameTestFunction().visitor(program.ast)) }) }) - arkts.updateETSModuleByStatements( - module, - [ - arkts.factory.updateETSImportDeclaration( - module.statements[0] as arkts.ETSImportDeclaration, - arkts.factory.createStringLiteral( - './library' - ), - [ - arkts.factory.createImportSpecifier( - arkts.factory.createIdentifier( - 'testFunctionChanged' - ), - arkts.factory.createIdentifier( - 'testFunctionChanged' + program.setAst( + arkts.factory.updateETSModule( + module, + [ + arkts.factory.updateETSImportDeclaration( + module.statements[0] as arkts.ETSImportDeclaration, + arkts.factory.createStringLiteral( + './library' + ), + [ + arkts.factory.createImportSpecifier( + arkts.factory.createIdentifier( + 'testFunctionChanged' + ), + arkts.factory.createIdentifier( + 'testFunctionChanged' + ) ) - ) - ], - arkts.Es2pandaImportKinds.IMPORT_KINDS_ALL, - ), - ...module.statements.slice(1), - ] + ], + arkts.Es2pandaImportKinds.IMPORT_KINDS_ALL, + ), + ...module.statements.slice(1), + ], + module.ident, + module.getNamespaceFlag(), + module.program, + ) ) - new RenameTestFunction().visitor(module) + program.setAst(new RenameTestFunction().visitor(program.ast)) importStorage.update() - arkts.arktsGlobal.es2panda._AstNodeUpdateAll(arkts.arktsGlobal.context, module.peer) - arkts.recheckSubtree(module) + arkts.recheckContext() util.assert.equal( - module.dumpSrc(), ` + program.ast.dumpSrc(), ` import { testFunctionChanged as testFunctionChanged } from "./library"; function main() {} @@ -169,7 +180,7 @@ function main() {} testFunctionChanged(); `, - `invalid result: ${module.dumpSrc()}`) + `invalid result: ${program.ast.dumpSrc()}`) arkts.proceedToState(arkts.Es2pandaContextState.ES2PANDA_STATE_BIN_GENERATED) }) diff --git a/ui2abc/libarkts/test/arkts-api/import-export/import.test.ts b/ui2abc/libarkts/test/arkts-api/import-export/import.test.ts index 72138030b224260d0a11c3d23a6a80fbc1387deb..f79f6ea8dcae68530f006d705ceeaa854deaa845 100644 --- a/ui2abc/libarkts/test/arkts-api/import-export/import.test.ts +++ b/ui2abc/libarkts/test/arkts-api/import-export/import.test.ts @@ -26,7 +26,7 @@ suite(util.basename(__filename), () => { let script = arkts.createETSModuleFromSource(sample_in) - arkts.updateETSModuleByStatements( + script = arkts.factory.updateETSModule( script, [ arkts.factory.createETSImportDeclaration( @@ -45,7 +45,10 @@ suite(util.basename(__filename), () => { ], arkts.Es2pandaImportKinds.IMPORT_KINDS_ALL, ) - ] + ], + script.ident, + script.getNamespaceFlag(), + script.program, ) util.ARKTS_TEST_ASSERTION( @@ -66,7 +69,7 @@ suite(util.basename(__filename), () => { let script = arkts.createETSModuleFromSource(sample_in) const importDeclaration = script.statements[0] as arkts.ETSImportDeclaration - arkts.updateETSModuleByStatements( + script = arkts.factory.updateETSModule( script, [ arkts.factory.createETSImportDeclaration( @@ -86,7 +89,10 @@ suite(util.basename(__filename), () => { arkts.Es2pandaImportKinds.IMPORT_KINDS_ALL, ), ...script.statements, - ] + ], + script.ident, + script.getNamespaceFlag(), + script.program, ) util.ARKTS_TEST_ASSERTION( @@ -112,7 +118,7 @@ suite(util.basename(__filename), () => { let script = arkts.createETSModuleFromSource(sample_in) const importDeclaration = script.statements[0] as arkts.ETSImportDeclaration - arkts.updateETSModuleByStatements( + script = arkts.factory.updateETSModule( script, [ arkts.factory.createETSImportDeclaration( @@ -132,7 +138,10 @@ suite(util.basename(__filename), () => { arkts.Es2pandaImportKinds.IMPORT_KINDS_ALL, ), ...script.statements, - ] + ], + script.ident, + script.getNamespaceFlag(), + script.program, ) util.ARKTS_TEST_ASSERTION( @@ -200,12 +209,15 @@ suite(util.basename(__filename), () => { ) newFuncDecl.updateModifiers(newScriptFunc.modifierFlags) - script = arkts.updateETSModuleByStatements( + script = arkts.factory.updateETSModule( script, [ script.statements[0], newFuncDecl - ] + ], + script.ident, + script.getNamespaceFlag(), + script.program, ) util.ARKTS_TEST_ASSERTION( diff --git a/ui2abc/libarkts/test/arkts-api/recache/main.test.ts b/ui2abc/libarkts/test/arkts-api/recache/main.test.ts index 97b3dfece5720b560c6dc3a0c01aadca10228692..11a10ceee439b1c7b0ecf318efb4fe4ca5b9b334 100644 --- a/ui2abc/libarkts/test/arkts-api/recache/main.test.ts +++ b/ui2abc/libarkts/test/arkts-api/recache/main.test.ts @@ -24,6 +24,7 @@ function shouldModify(name: string) { } class VisitorParsed extends arkts.AbstractVisitor { + visitor(node: arkts.BlockStatement): arkts.BlockStatement visitor(node: arkts.AstNode) { if (arkts.isIdentifier(node)) { if (shouldModify(node.name)) return arkts.factory.createIdentifier(node.name + "_Parsed") @@ -33,6 +34,7 @@ class VisitorParsed extends arkts.AbstractVisitor { } class VisitorChecked extends arkts.AbstractVisitor { + visitor(node: arkts.BlockStatement): arkts.BlockStatement visitor(node: arkts.AstNode) { if (arkts.isIdentifier(node)) { if (shouldModify(node.name)) return arkts.factory.createIdentifier(node.name + "_Checked") @@ -48,10 +50,10 @@ class VisitorChecked extends arkts.AbstractVisitor { function visitor(program: arkts.Program, options: arkts.CompilationOptions) { arkts.dumpProgramInfo(program) if (options.stage == arkts.Es2pandaContextState.ES2PANDA_STATE_PARSED) { - new VisitorParsed().visitor(program.ast) + program.setAst(new VisitorParsed().visitor(program.ast)) } if (options.stage == arkts.Es2pandaContextState.ES2PANDA_STATE_CHECKED) { - new VisitorChecked().visitor(program.ast) + program.setAst(new VisitorChecked().visitor(program.ast)) } } diff --git a/ui2abc/libarkts/test/arkts-api/recheck/constructor/index.ts b/ui2abc/libarkts/test/arkts-api/recheck/constructor/index.ts index b43a54f3f530104db5bcc1363a3c25e38bc44877..52b9b2e2e6c8825934e12877936cd3e5f1a3644f 100644 --- a/ui2abc/libarkts/test/arkts-api/recheck/constructor/index.ts +++ b/ui2abc/libarkts/test/arkts-api/recheck/constructor/index.ts @@ -16,7 +16,7 @@ import * as arkts from "../../../../src/arkts-api" class ConstructorWithOverload extends arkts.AbstractVisitor { - visitor(beforeChildren: arkts.ETSModule): arkts.ETSModule + visitor(beforeChildren: arkts.BlockStatement): arkts.BlockStatement visitor(beforeChildren: arkts.AstNode): arkts.AstNode { const node = this.visitEachChild(beforeChildren) if (arkts.isScriptFunction(node) && node.id?.name == "constructor") { @@ -48,5 +48,5 @@ class ConstructorWithOverload extends arkts.AbstractVisitor { } export function constructorWithOverload(program: arkts.Program) { - return new ConstructorWithOverload().visitor(program.ast as arkts.ETSModule) + program.setAst(new ConstructorWithOverload().visitor(program.ast)) } diff --git a/ui2abc/libarkts/test/arkts-api/recheck/exports/add-export/index.ts b/ui2abc/libarkts/test/arkts-api/recheck/exports/add-export/index.ts index bc415a3e6d16ad08c85fe1b8ee61ce32224680ca..61f8b09c33e4665ef43b72d03570329d367f0528 100644 --- a/ui2abc/libarkts/test/arkts-api/recheck/exports/add-export/index.ts +++ b/ui2abc/libarkts/test/arkts-api/recheck/exports/add-export/index.ts @@ -16,7 +16,7 @@ import * as arkts from "../../../../../src/arkts-api" class ExportClass extends arkts.AbstractVisitor { - visitor(beforeChildren: arkts.ETSModule): arkts.ETSModule + visitor(beforeChildren: arkts.BlockStatement): arkts.BlockStatement visitor(beforeChildren: arkts.AstNode): arkts.AstNode { const node = this.visitEachChild(beforeChildren) if (arkts.isClassDeclaration(node) && node.definition?.ident?.name == "C") { @@ -28,62 +28,68 @@ class ExportClass extends arkts.AbstractVisitor { export function addUseImportClassSameFileAndExportClass(program: arkts.Program, options: arkts.CompilationOptions) { if (options.isMainProgram) { - arkts.updateETSModuleByStatements( - program.ast as arkts.ETSModule, - [ - // import { C as C } from "./library" - arkts.factory.createETSImportDeclaration( - arkts.factory.createStringLiteral( - './library' - ), - [ - arkts.factory.createImportSpecifier( - arkts.factory.createIdentifier( - 'C' - ), - arkts.factory.createIdentifier( - 'C' - ) - ) - ], - arkts.Es2pandaImportKinds.IMPORT_KINDS_ALL - ), - ...program.ast.statements, - // class D { - // c = new C() - // } - arkts.factory.createClassDeclaration( - arkts.factory.createClassDefinition( - arkts.factory.createIdentifier("D"), - undefined, - undefined, - [], - undefined, - undefined, + const module = program.ast as arkts.ETSModule + program.setAst( + arkts.factory.updateETSModule( + module, + [ + // import { C as C } from "./library" + arkts.factory.createETSImportDeclaration( + arkts.factory.createStringLiteral( + './library' + ), [ - arkts.factory.createClassProperty( - arkts.factory.createIdentifier("c"), - arkts.factory.createETSNewClassInstanceExpression( - arkts.factory.createETSTypeReference( - arkts.factory.createETSTypeReferencePart( - arkts.factory.createIdentifier("C") - ) - ), - [] + arkts.factory.createImportSpecifier( + arkts.factory.createIdentifier( + 'C' ), - undefined, - arkts.Es2pandaModifierFlags.MODIFIER_FLAGS_NONE, - false, + arkts.factory.createIdentifier( + 'C' + ) ) ], - arkts.Es2pandaClassDefinitionModifiers.CLASS_DEFINITION_MODIFIERS_CLASS_DECL, - arkts.Es2pandaModifierFlags.MODIFIER_FLAGS_NONE, + arkts.Es2pandaImportKinds.IMPORT_KINDS_ALL + ), + ...module.statements, + // class D { + // c = new C() + // } + arkts.factory.createClassDeclaration( + arkts.factory.createClassDefinition( + arkts.factory.createIdentifier("D"), + undefined, + undefined, + [], + undefined, + undefined, + [ + arkts.factory.createClassProperty( + arkts.factory.createIdentifier("c"), + arkts.factory.createETSNewClassInstanceExpression( + arkts.factory.createETSTypeReference( + arkts.factory.createETSTypeReferencePart( + arkts.factory.createIdentifier("C") + ) + ), + [] + ), + undefined, + arkts.Es2pandaModifierFlags.MODIFIER_FLAGS_NONE, + false, + ) + ], + arkts.Es2pandaClassDefinitionModifiers.CLASS_DEFINITION_MODIFIERS_CLASS_DECL, + arkts.Es2pandaModifierFlags.MODIFIER_FLAGS_NONE, + ) ) - ) - ] + ], + module.ident, + module.getNamespaceFlag(), + module.program, + ) ) } else { - new ExportClass().visitor(program.ast as arkts.ETSModule) + program.setAst(new ExportClass().visitor(program.ast)) } return program } diff --git a/ui2abc/libarkts/test/arkts-api/recheck/exports/basic/index.ts b/ui2abc/libarkts/test/arkts-api/recheck/exports/basic/index.ts index bbc7ef4cbe570d0bea7093e7bce2e76c6bf9d19a..5dd16e1b8a4c804ffb09be7dcc972ff1df03f209 100644 --- a/ui2abc/libarkts/test/arkts-api/recheck/exports/basic/index.ts +++ b/ui2abc/libarkts/test/arkts-api/recheck/exports/basic/index.ts @@ -17,59 +17,65 @@ import * as arkts from "../../../../../src/arkts-api" export function addUseImportClassSameFile(program: arkts.Program, options: arkts.CompilationOptions) { if (options.isMainProgram) { - arkts.updateETSModuleByStatements( - program.ast as arkts.ETSModule, - [ - // import { C as C } from "./library" - arkts.factory.createETSImportDeclaration( - arkts.factory.createStringLiteral( - './library' - ), - [ - arkts.factory.createImportSpecifier( - arkts.factory.createIdentifier( - 'C' - ), - arkts.factory.createIdentifier( - 'C' - ) - ) - ], - arkts.Es2pandaImportKinds.IMPORT_KINDS_ALL - ), - ...program.ast.statements, - // class D { - // c = new C() - // } - arkts.factory.createClassDeclaration( - arkts.factory.createClassDefinition( - arkts.factory.createIdentifier("D"), - undefined, - undefined, - [], - undefined, - undefined, + const module = program.ast as arkts.ETSModule + program.setAst( + arkts.factory.updateETSModule( + module, + [ + // import { C as C } from "./library" + arkts.factory.createETSImportDeclaration( + arkts.factory.createStringLiteral( + './library' + ), [ - arkts.factory.createClassProperty( - arkts.factory.createIdentifier("c"), - arkts.factory.createETSNewClassInstanceExpression( - arkts.factory.createETSTypeReference( - arkts.factory.createETSTypeReferencePart( - arkts.factory.createIdentifier("C") - ) - ), - [] + arkts.factory.createImportSpecifier( + arkts.factory.createIdentifier( + 'C' ), - undefined, - arkts.Es2pandaModifierFlags.MODIFIER_FLAGS_NONE, - false, + arkts.factory.createIdentifier( + 'C' + ) ) ], - arkts.Es2pandaClassDefinitionModifiers.CLASS_DEFINITION_MODIFIERS_CLASS_DECL, - arkts.Es2pandaModifierFlags.MODIFIER_FLAGS_NONE, + arkts.Es2pandaImportKinds.IMPORT_KINDS_ALL + ), + ...module.statements, + // class D { + // c = new C() + // } + arkts.factory.createClassDeclaration( + arkts.factory.createClassDefinition( + arkts.factory.createIdentifier("D"), + undefined, + undefined, + [], + undefined, + undefined, + [ + arkts.factory.createClassProperty( + arkts.factory.createIdentifier("c"), + arkts.factory.createETSNewClassInstanceExpression( + arkts.factory.createETSTypeReference( + arkts.factory.createETSTypeReferencePart( + arkts.factory.createIdentifier("C") + ) + ), + [] + ), + undefined, + arkts.Es2pandaModifierFlags.MODIFIER_FLAGS_NONE, + false, + ) + ], + arkts.Es2pandaClassDefinitionModifiers.CLASS_DEFINITION_MODIFIERS_CLASS_DECL, + arkts.Es2pandaModifierFlags.MODIFIER_FLAGS_NONE, + ) ) - ) - ] + ], + module.ident, + module.getNamespaceFlag(), + module.program, + ) ) } return program diff --git a/ui2abc/libarkts/test/arkts-api/recheck/exports/create-class/index.ts b/ui2abc/libarkts/test/arkts-api/recheck/exports/create-class/index.ts index 6d7667ce85a8e083c4ff11d3e5cfa5c3cf0e290b..ad9b79316c0bd499ddf5321d01fa47af5d43f031 100644 --- a/ui2abc/libarkts/test/arkts-api/recheck/exports/create-class/index.ts +++ b/ui2abc/libarkts/test/arkts-api/recheck/exports/create-class/index.ts @@ -17,106 +17,118 @@ import * as arkts from "../../../../../src/arkts-api" export function addUseImportClassSameFileAndCreateClass(program: arkts.Program, options: arkts.CompilationOptions) { if (options.isMainProgram) { - arkts.updateETSModuleByStatements( - program.ast as arkts.ETSModule, - [ - // import { C as C } from "./library" - arkts.factory.createETSImportDeclaration( - arkts.factory.createStringLiteral( - './library' - ), - [ - arkts.factory.createImportSpecifier( - arkts.factory.createIdentifier( - 'C' - ), - arkts.factory.createIdentifier( - 'C' - ) - ) - ], - arkts.Es2pandaImportKinds.IMPORT_KINDS_ALL - ), - ...program.ast.statements, - // class D { - // c = new C() - // } - arkts.factory.createClassDeclaration( - arkts.factory.createClassDefinition( - arkts.factory.createIdentifier("D"), - undefined, - undefined, - [], - undefined, - undefined, + const module = program.ast as arkts.ETSModule + program.setAst( + arkts.factory.updateETSModule( + module, + [ + // import { C as C } from "./library" + arkts.factory.createETSImportDeclaration( + arkts.factory.createStringLiteral( + './library' + ), [ - arkts.factory.createClassProperty( - arkts.factory.createIdentifier("c"), - arkts.factory.createETSNewClassInstanceExpression( - arkts.factory.createETSTypeReference( - arkts.factory.createETSTypeReferencePart( - arkts.factory.createIdentifier("C") - ) - ), - [] + arkts.factory.createImportSpecifier( + arkts.factory.createIdentifier( + 'C' ), - undefined, - arkts.Es2pandaModifierFlags.MODIFIER_FLAGS_NONE, - false, + arkts.factory.createIdentifier( + 'C' + ) ) ], - arkts.Es2pandaClassDefinitionModifiers.CLASS_DEFINITION_MODIFIERS_CLASS_DECL, - arkts.Es2pandaModifierFlags.MODIFIER_FLAGS_NONE, + arkts.Es2pandaImportKinds.IMPORT_KINDS_ALL + ), + ...module.statements, + // class D { + // c = new C() + // } + arkts.factory.createClassDeclaration( + arkts.factory.createClassDefinition( + arkts.factory.createIdentifier("D"), + undefined, + undefined, + [], + undefined, + undefined, + [ + arkts.factory.createClassProperty( + arkts.factory.createIdentifier("c"), + arkts.factory.createETSNewClassInstanceExpression( + arkts.factory.createETSTypeReference( + arkts.factory.createETSTypeReferencePart( + arkts.factory.createIdentifier("C") + ) + ), + [] + ), + undefined, + arkts.Es2pandaModifierFlags.MODIFIER_FLAGS_NONE, + false, + ) + ], + arkts.Es2pandaClassDefinitionModifiers.CLASS_DEFINITION_MODIFIERS_CLASS_DECL, + arkts.Es2pandaModifierFlags.MODIFIER_FLAGS_NONE, + ) ) - ) - ] + ], + module.ident, + module.getNamespaceFlag(), + module.program, + ) ) } else { - arkts.updateETSModuleByStatements( - program.ast as arkts.ETSModule, - [ - ...program.ast.statements, - arkts.factory.createClassDeclaration( - arkts.factory.createClassDefinition( - arkts.factory.createIdentifier( - "C" - ), - undefined, - undefined, - [], - undefined, - undefined, - [ - arkts.factory.createMethodDefinition( - arkts.Es2pandaMethodDefinitionKind.METHOD_DEFINITION_KIND_CONSTRUCTOR, - arkts.factory.createIdentifier("constructor"), - arkts.factory.createFunctionExpression( + const module = program.ast as arkts.ETSModule + program.setAst( + arkts.factory.updateETSModule( + module, + [ + ...module.statements, + arkts.factory.createClassDeclaration( + arkts.factory.createClassDefinition( + arkts.factory.createIdentifier( + "C" + ), + undefined, + undefined, + [], + undefined, + undefined, + [ + arkts.factory.createMethodDefinition( + arkts.Es2pandaMethodDefinitionKind.METHOD_DEFINITION_KIND_CONSTRUCTOR, arkts.factory.createIdentifier("constructor"), - arkts.factory.createScriptFunction( - arkts.factory.createBlockStatement( - [], - ), - undefined, - [], - undefined, - false, - arkts.Es2pandaScriptFunctionFlags.SCRIPT_FUNCTION_FLAGS_CONSTRUCTOR, - arkts.Es2pandaModifierFlags.MODIFIER_FLAGS_NONE, + arkts.factory.createFunctionExpression( arkts.factory.createIdentifier("constructor"), - [], - ) + arkts.factory.createScriptFunction( + arkts.factory.createBlockStatement( + [], + ), + undefined, + [], + undefined, + false, + arkts.Es2pandaScriptFunctionFlags.SCRIPT_FUNCTION_FLAGS_CONSTRUCTOR, + arkts.Es2pandaModifierFlags.MODIFIER_FLAGS_NONE, + arkts.factory.createIdentifier("constructor"), + [], + ) + ), + arkts.Es2pandaModifierFlags.MODIFIER_FLAGS_CONSTRUCTOR, + false, + [], ), - arkts.Es2pandaModifierFlags.MODIFIER_FLAGS_CONSTRUCTOR, - false, - [], - ), - ], - arkts.Es2pandaClassDefinitionModifiers.CLASS_DEFINITION_MODIFIERS_CLASS_DECL, - arkts.Es2pandaModifierFlags.MODIFIER_FLAGS_NONE, - ), - arkts.Es2pandaModifierFlags.MODIFIER_FLAGS_EXPORT, - ) - ] + ], + arkts.Es2pandaClassDefinitionModifiers.CLASS_DEFINITION_MODIFIERS_CLASS_DECL, + arkts.Es2pandaModifierFlags.MODIFIER_FLAGS_NONE, + ), + arkts.Es2pandaModifierFlags.MODIFIER_FLAGS_EXPORT, + ) + ], + module.ident, + module.getNamespaceFlag(), + module.program, + ) ) } return program diff --git a/ui2abc/libarkts/test/arkts-api/recheck/exports/struct-to-class/index.ts b/ui2abc/libarkts/test/arkts-api/recheck/exports/struct-to-class/index.ts index 7d55cceeb133757bfc0f7c7206c1e1e9d0f938ef..6b1ef41e4ddc1dc0ccb1cdb375352346e4db9bc2 100644 --- a/ui2abc/libarkts/test/arkts-api/recheck/exports/struct-to-class/index.ts +++ b/ui2abc/libarkts/test/arkts-api/recheck/exports/struct-to-class/index.ts @@ -16,7 +16,7 @@ import * as arkts from "../../../../../src/arkts-api" class StructToClass extends arkts.AbstractVisitor { - visitor(beforeChildren: arkts.ETSModule): arkts.ETSModule + visitor(beforeChildren: arkts.BlockStatement): arkts.BlockStatement visitor(beforeChildren: arkts.AstNode): arkts.AstNode { const node = this.visitEachChild(beforeChildren) if (arkts.isETSStructDeclaration(node)) { @@ -30,13 +30,13 @@ class StructToClass extends arkts.AbstractVisitor { export function rewriteStructToClass(program: arkts.Program, options: arkts.CompilationOptions) { if (!options.isMainProgram) { - new StructToClass().visitor(program.ast as arkts.ETSModule) + program.setAst(new StructToClass().visitor(program.ast)) } return program } class ExportClass extends arkts.AbstractVisitor { - visitor(beforeChildren: arkts.ETSModule): arkts.ETSModule + visitor(beforeChildren: arkts.BlockStatement): arkts.BlockStatement visitor(beforeChildren: arkts.AstNode): arkts.AstNode { const node = this.visitEachChild(beforeChildren) if (arkts.isClassDeclaration(node) && node.definition?.ident?.name == "C") { @@ -48,62 +48,68 @@ class ExportClass extends arkts.AbstractVisitor { export function addUseImportClassSameFileAfterRewritingStructToClass(program: arkts.Program, options: arkts.CompilationOptions) { if (options.isMainProgram) { - arkts.updateETSModuleByStatements( - program.ast as arkts.ETSModule, - [ - // import { C as C } from "./library" - arkts.factory.createETSImportDeclaration( - arkts.factory.createStringLiteral( - './library' - ), - [ - arkts.factory.createImportSpecifier( - arkts.factory.createIdentifier( - 'C' - ), - arkts.factory.createIdentifier( - 'C' - ) - ) - ], - arkts.Es2pandaImportKinds.IMPORT_KINDS_ALL - ), - ...program.ast.statements, - // class D { - // c = new C() - // } - arkts.factory.createClassDeclaration( - arkts.factory.createClassDefinition( - arkts.factory.createIdentifier("D"), - undefined, - undefined, - [], - undefined, - undefined, + const module = program.ast as arkts.ETSModule + program.setAst( + arkts.factory.updateETSModule( + module, + [ + // import { C as C } from "./library" + arkts.factory.createETSImportDeclaration( + arkts.factory.createStringLiteral( + './library' + ), [ - arkts.factory.createClassProperty( - arkts.factory.createIdentifier("c"), - arkts.factory.createETSNewClassInstanceExpression( - arkts.factory.createETSTypeReference( - arkts.factory.createETSTypeReferencePart( - arkts.factory.createIdentifier("C") - ) - ), - [] + arkts.factory.createImportSpecifier( + arkts.factory.createIdentifier( + 'C' ), - undefined, - arkts.Es2pandaModifierFlags.MODIFIER_FLAGS_NONE, - false, + arkts.factory.createIdentifier( + 'C' + ) ) ], - arkts.Es2pandaClassDefinitionModifiers.CLASS_DEFINITION_MODIFIERS_CLASS_DECL, - arkts.Es2pandaModifierFlags.MODIFIER_FLAGS_NONE, + arkts.Es2pandaImportKinds.IMPORT_KINDS_ALL + ), + ...module.statements, + // class D { + // c = new C() + // } + arkts.factory.createClassDeclaration( + arkts.factory.createClassDefinition( + arkts.factory.createIdentifier("D"), + undefined, + undefined, + [], + undefined, + undefined, + [ + arkts.factory.createClassProperty( + arkts.factory.createIdentifier("c"), + arkts.factory.createETSNewClassInstanceExpression( + arkts.factory.createETSTypeReference( + arkts.factory.createETSTypeReferencePart( + arkts.factory.createIdentifier("C") + ) + ), + [] + ), + undefined, + arkts.Es2pandaModifierFlags.MODIFIER_FLAGS_NONE, + false, + ) + ], + arkts.Es2pandaClassDefinitionModifiers.CLASS_DEFINITION_MODIFIERS_CLASS_DECL, + arkts.Es2pandaModifierFlags.MODIFIER_FLAGS_NONE, + ) ) - ) - ] + ], + module.ident, + module.getNamespaceFlag(), + module.program, + ) ) } else { - new ExportClass().visitor(program.ast as arkts.ETSModule) + program.setAst(new ExportClass().visitor(program.ast as arkts.ETSModule)) } return program } diff --git a/ui2abc/libarkts/test/arkts-api/recheck/imports/add-new-file/index.ts b/ui2abc/libarkts/test/arkts-api/recheck/imports/add-new-file/index.ts index 13b3821c67d8d890d553a4f696ba8f1b8aabdfa8..6c9e31fa1294b7d350b93ff29cf52a58021c8fcc 100644 --- a/ui2abc/libarkts/test/arkts-api/recheck/imports/add-new-file/index.ts +++ b/ui2abc/libarkts/test/arkts-api/recheck/imports/add-new-file/index.ts @@ -17,21 +17,33 @@ import * as arkts from "../../../../../src/arkts-api" export function addImportNewFile(program: arkts.Program, options: arkts.CompilationOptions) { if (options.isMainProgram) { - arkts.factory.createETSImportDeclaration( - arkts.factory.createStringLiteral( - './library' - ), - [ - arkts.factory.createImportSpecifier( - arkts.factory.createIdentifier( - 'testFunction' + const module = program.ast as arkts.ETSModule + program.setAst( + arkts.factory.updateETSModule( + module, + [ + arkts.factory.createETSImportDeclaration( + arkts.factory.createStringLiteral( + './library' + ), + [ + arkts.factory.createImportSpecifier( + arkts.factory.createIdentifier( + 'testFunction' + ), + arkts.factory.createIdentifier( + 'testFunction' + ) + ) + ], + arkts.Es2pandaImportKinds.IMPORT_KINDS_ALL ), - arkts.factory.createIdentifier( - 'testFunction' - ) - ) - ], - arkts.Es2pandaImportKinds.IMPORT_KINDS_ALL + ...module.statements, + ], + module.ident, + module.getNamespaceFlag(), + module.program, + ) ) } return program diff --git a/ui2abc/libarkts/test/arkts-api/recheck/imports/add-same-file/index.ts b/ui2abc/libarkts/test/arkts-api/recheck/imports/add-same-file/index.ts index 59e2f607c88ac293bc92161343c8b0bd1d41795d..773887453560651a344aeb810b0a95ae140fbf0c 100644 --- a/ui2abc/libarkts/test/arkts-api/recheck/imports/add-same-file/index.ts +++ b/ui2abc/libarkts/test/arkts-api/recheck/imports/add-same-file/index.ts @@ -17,27 +17,33 @@ import * as arkts from "../../../../../src/arkts-api" export function addImportSameFile(program: arkts.Program, options: arkts.CompilationOptions) { if (options.isMainProgram) { - arkts.updateETSModuleByStatements( - program.ast as arkts.ETSModule, - [ - arkts.factory.createETSImportDeclaration( - arkts.factory.createStringLiteral( - './library' - ), - [ - arkts.factory.createImportSpecifier( - arkts.factory.createIdentifier( - 'testFunction' - ), - arkts.factory.createIdentifier( - 'testFunction' + const module = program.ast as arkts.ETSModule + program.setAst( + arkts.factory.updateETSModule( + module, + [ + arkts.factory.createETSImportDeclaration( + arkts.factory.createStringLiteral( + './library' + ), + [ + arkts.factory.createImportSpecifier( + arkts.factory.createIdentifier( + 'testFunction' + ), + arkts.factory.createIdentifier( + 'testFunction' + ) ) - ) - ], - arkts.Es2pandaImportKinds.IMPORT_KINDS_ALL - ), - ...program.ast.statements, - ] + ], + arkts.Es2pandaImportKinds.IMPORT_KINDS_ALL + ), + ...module.statements, + ], + module.ident, + module.getNamespaceFlag(), + module.program, + ) ) } return program diff --git a/ui2abc/libarkts/test/arkts-api/recheck/imports/add-use-same-file/index.ts b/ui2abc/libarkts/test/arkts-api/recheck/imports/add-use-same-file/index.ts index 2ada6671e75d29e5043fd47c1ac5406e79fc5fb8..1085785d54bc51aef5967ff6742579d8f095faa8 100644 --- a/ui2abc/libarkts/test/arkts-api/recheck/imports/add-use-same-file/index.ts +++ b/ui2abc/libarkts/test/arkts-api/recheck/imports/add-use-same-file/index.ts @@ -17,41 +17,43 @@ import * as arkts from "../../../../../src/arkts-api" export function addUseImportSameFile(program: arkts.Program, options: arkts.CompilationOptions) { if (options.isMainProgram) { - arkts.updateETSModuleByStatements( - program.ast as arkts.ETSModule, - [ - ...program.ast.statements, - arkts.factory.createCallExpression( - arkts.factory.createIdentifier("testFunction"), - [], - undefined, - false, - false, - undefined - ) - ] - ) - arkts.updateETSModuleByStatements( - program.ast as arkts.ETSModule, - [ - arkts.factory.createETSImportDeclaration( - arkts.factory.createStringLiteral( - './library' - ), - [ - arkts.factory.createImportSpecifier( - arkts.factory.createIdentifier( - 'testFunction' - ), - arkts.factory.createIdentifier( - 'testFunction' + const module = program.ast as arkts.ETSModule + program.setAst( + arkts.factory.updateETSModule( + module, + [ + arkts.factory.createETSImportDeclaration( + arkts.factory.createStringLiteral( + './library' + ), + [ + arkts.factory.createImportSpecifier( + arkts.factory.createIdentifier( + 'testFunction' + ), + arkts.factory.createIdentifier( + 'testFunction' + ) ) + ], + arkts.Es2pandaImportKinds.IMPORT_KINDS_ALL + ), + ...module.statements, + arkts.factory.createExpressionStatement( + arkts.factory.createCallExpression( + arkts.factory.createIdentifier("testFunction"), + [], + undefined, + false, + false, + undefined ) - ], - arkts.Es2pandaImportKinds.IMPORT_KINDS_ALL - ), - ...program.ast.statements, - ] + ) + ], + module.ident, + module.getNamespaceFlag(), + module.program, + ) ) } return program diff --git a/ui2abc/libarkts/test/arkts-api/recheck/imports/recursive/index.ts b/ui2abc/libarkts/test/arkts-api/recheck/imports/recursive/index.ts index 5f09c85c3aec1c8227cea8c59d2b126019014d04..43a9433ed75236cfbdcd96732626e88b0debf71f 100644 --- a/ui2abc/libarkts/test/arkts-api/recheck/imports/recursive/index.ts +++ b/ui2abc/libarkts/test/arkts-api/recheck/imports/recursive/index.ts @@ -16,7 +16,7 @@ import * as arkts from "../../../../../src/arkts-api" class InsertParameter extends arkts.AbstractVisitor { - visitor(beforeChildren: arkts.ETSModule): arkts.ETSModule + visitor(beforeChildren: arkts.BlockStatement): arkts.BlockStatement visitor(beforeChildren: arkts.AstNode): arkts.AstNode { const node = this.visitEachChild(beforeChildren) if (arkts.isScriptFunction(node) && @@ -47,5 +47,5 @@ class InsertParameter extends arkts.AbstractVisitor { } export function insertParameter(program: arkts.Program) { - return new InsertParameter().visitor(program.ast as arkts.ETSModule) + program.setAst(new InsertParameter().visitor(program.ast)) } diff --git a/ui2abc/libarkts/test/arkts-api/recheck/optional/add-chain/index.ts b/ui2abc/libarkts/test/arkts-api/recheck/optional/add-chain/index.ts index 7594a46f25410528419908be67b68c4548fcb446..b5aa8a49ae77ca60a3a89bdb7b4bcaea784c1138 100644 --- a/ui2abc/libarkts/test/arkts-api/recheck/optional/add-chain/index.ts +++ b/ui2abc/libarkts/test/arkts-api/recheck/optional/add-chain/index.ts @@ -16,6 +16,7 @@ import * as arkts from "../../../../../src/arkts-api" class AddOptionalChain extends arkts.AbstractVisitor { + visitor(beforeChildren: arkts.BlockStatement): arkts.BlockStatement visitor(beforeChildren: arkts.AstNode): arkts.AstNode { const node = this.visitEachChild(beforeChildren) if (arkts.isVariableDeclarator(node) && arkts.isIdentifier(node.id) && node.id.name == "zzz") { @@ -42,5 +43,5 @@ class AddOptionalChain extends arkts.AbstractVisitor { export function addOptionalChain(program: arkts.Program) { const inserted = new AddOptionalChain().visitor(program.ast) - return new arkts.ChainExpressionFilter().visitor(inserted) + return program.setAst(new arkts.ChainExpressionFilter().visitor(inserted)) } diff --git a/ui2abc/libarkts/test/arkts-api/recheck/overloads/getter-setter/index.ts b/ui2abc/libarkts/test/arkts-api/recheck/overloads/getter-setter/index.ts index 684abade6001d3c2e2383d993c783fb65fe7a32b..f305ebeda4518463e1b0e94ce3d8226ee502dfac 100644 --- a/ui2abc/libarkts/test/arkts-api/recheck/overloads/getter-setter/index.ts +++ b/ui2abc/libarkts/test/arkts-api/recheck/overloads/getter-setter/index.ts @@ -16,7 +16,7 @@ import * as arkts from "../../../../../src/arkts-api" class InsertParameterToType extends arkts.AbstractVisitor { - visitor(beforeChildren: arkts.ETSModule): arkts.ETSModule + visitor(beforeChildren: arkts.BlockStatement): arkts.BlockStatement visitor(beforeChildren: arkts.AstNode): arkts.AstNode { const node = this.visitEachChild(beforeChildren) if (arkts.isETSFunctionType(node)) { @@ -42,5 +42,5 @@ class InsertParameterToType extends arkts.AbstractVisitor { } export function insertParameterToType(program: arkts.Program) { - return new InsertParameterToType().visitor(program.ast as arkts.ETSModule) + program.setAst(new InsertParameterToType().visitor(program.ast)) } diff --git a/ui2abc/libarkts/test/arkts-api/recheck/recheck.test.ts b/ui2abc/libarkts/test/arkts-api/recheck/recheck.test.ts index c7ba12987583b58aef557e26b7c81c85dd8ffeed..7949a3fbb4d88b7f01d50f3ea9008e2f2cd2c3f0 100644 --- a/ui2abc/libarkts/test/arkts-api/recheck/recheck.test.ts +++ b/ui2abc/libarkts/test/arkts-api/recheck/recheck.test.ts @@ -211,19 +211,19 @@ suite(util.basename(__filename), () => { suite('simple', () => { test('rename class', () => { runTest('simple/rename-class', (program: arkts.Program) => { - return updateTopLevelClass(program.ast as arkts.ETSModule, renameClass) + program.setAst(updateTopLevelClass(program.ast as arkts.ETSModule, renameClass)) }) }) test('add class method', () => { runTest('simple/add-class-method', (program: arkts.Program) => { - return updateTopLevelClass(program.ast as arkts.ETSModule, addClassMethod) + program.setAst(updateTopLevelClass(program.ast as arkts.ETSModule, addClassMethod)) }) }) test('add variable declaration', () => { runTest('simple/add-variable', (program: arkts.Program) => { - return updateTopLevelClass(program.ast as arkts.ETSModule, addVariableDeclaration) + program.setAst(updateTopLevelClass(program.ast as arkts.ETSModule, addVariableDeclaration)) }) }) }) diff --git a/ui2abc/libarkts/test/arkts-api/recheck/simple/index.ts b/ui2abc/libarkts/test/arkts-api/recheck/simple/index.ts index bf6ee92f3dc2d8a744619add1f0795bbac513b31..1966eff8eadb63a6eed9a979938dcdcccf9a9b77 100644 --- a/ui2abc/libarkts/test/arkts-api/recheck/simple/index.ts +++ b/ui2abc/libarkts/test/arkts-api/recheck/simple/index.ts @@ -19,7 +19,7 @@ export function updateTopLevelClass( module: arkts.ETSModule, update: (node: arkts.ClassDefinition) => arkts.ClassDefinition ) { - return arkts.updateETSModuleByStatements( + return arkts.factory.updateETSModule( module, [ ...module.statements.map((node) => { @@ -37,6 +37,9 @@ export function updateTopLevelClass( } return node }) - ] + ], + module.ident, + module.getNamespaceFlag(), + module.program, ) } diff --git a/ui2abc/libarkts/test/arkts-api/recheck/this/index.ts b/ui2abc/libarkts/test/arkts-api/recheck/this/index.ts index d021e8d63598fa66d379a54c748655e72680a05a..65a35d8756ced9c843e5f6ae3a5472ec5c08eeb2 100644 --- a/ui2abc/libarkts/test/arkts-api/recheck/this/index.ts +++ b/ui2abc/libarkts/test/arkts-api/recheck/this/index.ts @@ -14,10 +14,9 @@ */ import * as arkts from "../../../../src/arkts-api" -import { ETSModule } from "../../../../src/arkts-api" class AddThisReference extends arkts.AbstractVisitor { - visitor(beforeChildren: arkts.ETSModule): arkts.ETSModule + visitor(beforeChildren: arkts.BlockStatement): arkts.BlockStatement visitor(beforeChildren: arkts.AstNode): arkts.AstNode { const node = this.visitEachChild(beforeChildren) if (arkts.isScriptFunction(node) && node.id?.name == "no_this") { @@ -47,5 +46,5 @@ class AddThisReference extends arkts.AbstractVisitor { } export function addThisReference(program: arkts.Program) { - return new AddThisReference().visitor(program.ast as ETSModule) + program.setAst(new AddThisReference().visitor(program.ast)) } diff --git a/ui2abc/memo-plugin/src/MemoTransformer.ts b/ui2abc/memo-plugin/src/MemoTransformer.ts index d4dd80f77c4f95ecd066977ecb3b3c30a8c54c39..d16bcd46f28f5a33383f7f725709ca514ceae0a6 100644 --- a/ui2abc/memo-plugin/src/MemoTransformer.ts +++ b/ui2abc/memo-plugin/src/MemoTransformer.ts @@ -67,18 +67,21 @@ export default function memoTransformer( let result = functionTransformer.visitor(node) if (restart) { if ((functionTransformer.modified || signatureTransformer.modified)) { - result = arkts.updateETSModuleByStatements( + result = arkts.factory.updateETSModule( result, [ factory.createContextTypesImportDeclaration(userPluginOptions?.stableForTests ?? false, userPluginOptions?.contextImport), ...result.statements - ] + ], + result.ident, + result.getNamespaceFlag(), + result.program, ) } } if (userPluginOptions?.keepTransformed && options.isMainProgram) { dumpAstToFile(result, userPluginOptions.keepTransformed, userPluginOptions?.stableForTests ?? false) } - return result + program.setAst(result) } } diff --git a/ui2abc/memo-plugin/src/ParserTransformer.ts b/ui2abc/memo-plugin/src/ParserTransformer.ts index 9abec3c62e2be4ed358d17ed3975712b2b2b2dae..b7f67716db8b359fdd9f65d4163997a632915e90 100644 --- a/ui2abc/memo-plugin/src/ParserTransformer.ts +++ b/ui2abc/memo-plugin/src/ParserTransformer.ts @@ -52,12 +52,18 @@ export default function memoParserTransformer( return } - return arkts.updateETSModuleByStatements( - program.ast as arkts.ETSModule, - [ - factory.createContextTypesImportDeclaration(userPluginOptions?.stableForTests ?? false, userPluginOptions?.contextImport), - ...program.ast.statements, - ] + const module = program.ast as arkts.ETSModule + program.setAst( + arkts.factory.updateETSModule( + module, + [ + factory.createContextTypesImportDeclaration(userPluginOptions?.stableForTests ?? false, userPluginOptions?.contextImport), + ...module.statements, + ], + module.ident, + module.getNamespaceFlag(), + module.program, + ) ) } } diff --git a/ui2abc/ui-plugins/src/checked-stage-plugin.ts b/ui2abc/ui-plugins/src/checked-stage-plugin.ts index 1d3f0b45ff457045ca513da97db3cb69e234bace..b4ad61e0347e1eaa2be7cbfa164b401cbdb60461 100644 --- a/ui2abc/ui-plugins/src/checked-stage-plugin.ts +++ b/ui2abc/ui-plugins/src/checked-stage-plugin.ts @@ -29,12 +29,13 @@ export default function checkedTransformer( ): arkts.ProgramTransformer { return (program: arkts.Program, _compilationOptions: arkts.CompilationOptions, context: arkts.PluginContext) => { const structsResolver = context.parameter("structsTable")!; - [ + const result = [ new InstantiateFactoryHelper(), new EtsFirstArgTransformer(), new StyleTransformer(), new BuilderLambdaTransformer(structsResolver) ] .reduce((node: arkts.AstNode, transformer) => transformer.visitor(node), program.ast) + program.setAst(result as arkts.ETSModule) } } diff --git a/ui2abc/ui-plugins/src/component-transformer.ts b/ui2abc/ui-plugins/src/component-transformer.ts index 1452cab618c80d073883e1d196b8e8df0ba85bc1..84270970a0898d0213144b1b38b4501d6adf4617 100644 --- a/ui2abc/ui-plugins/src/component-transformer.ts +++ b/ui2abc/ui-plugins/src/component-transformer.ts @@ -76,7 +76,13 @@ export class ComponentTransformer extends arkts.AbstractVisitor { } private rewriteModule(node: arkts.ETSModule): arkts.ETSModule { - return arkts.updateETSModuleByStatements(node, this.transformStatements(node.statements)) + return arkts.factory.updateETSModule( + node, + this.transformStatements(node.statements), + node.ident, + node.getNamespaceFlag(), + node.program, + ) } private optionsName(clazz: arkts.ClassDefinition): arkts.Identifier { diff --git a/ui2abc/ui-plugins/src/imports-transformer.ts b/ui2abc/ui-plugins/src/imports-transformer.ts index ed75b80cf0064171fcb5a29a8dc3de4402198b03..9236f3e11b2e7a003917586088194da1e6cb41df 100644 --- a/ui2abc/ui-plugins/src/imports-transformer.ts +++ b/ui2abc/ui-plugins/src/imports-transformer.ts @@ -23,9 +23,12 @@ export class ImportsTransformer extends arkts.AbstractVisitor { visitor(node: arkts.AstNode): arkts.AstNode { if (arkts.isETSModule(node)) { - return arkts.updateETSModuleByStatements( + return arkts.factory.updateETSModule( node, - this.imports.emit(node.statements) + this.imports.emit(node.statements), + node.ident, + node.getNamespaceFlag(), + node.program, ) } throw new Error(`Must not be there`) diff --git a/ui2abc/ui-plugins/src/parsed-stage-plugin.ts b/ui2abc/ui-plugins/src/parsed-stage-plugin.ts index 037b3c52fba2ab5264be56fa464c832e75f8e1bb..ae08c376e6f3aab993c34cea626fbbf196d03d00 100644 --- a/ui2abc/ui-plugins/src/parsed-stage-plugin.ts +++ b/ui2abc/ui-plugins/src/parsed-stage-plugin.ts @@ -52,6 +52,7 @@ export default function parsedTransformer( new CallTransformer(importer, userPluginOptions), new ImportsTransformer(importer) ] - transformers.reduce((node: arkts.AstNode, transformer: arkts.AbstractVisitor) => transformer.visitor(node), program.ast) + const result = transformers.reduce((node: arkts.AstNode, transformer: arkts.AbstractVisitor) => transformer.visitor(node), program.ast) + program.setAst(result as arkts.ETSModule) } }