From d628b364f9e296c43cdcd7de4412cfef2af9146e Mon Sep 17 00:00:00 2001 From: Alexander Gorshenev Date: Sun, 16 Feb 2025 00:41:58 +0300 Subject: [PATCH 1/6] Reset all parents after each transformation phase Signed-off-by: Alexander Gorshenev --- arkoala-arkts/libarkts/src/es2panda.ts | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/arkoala-arkts/libarkts/src/es2panda.ts b/arkoala-arkts/libarkts/src/es2panda.ts index 2b2743e48..b6b171e2a 100644 --- a/arkoala-arkts/libarkts/src/es2panda.ts +++ b/arkoala-arkts/libarkts/src/es2panda.ts @@ -112,15 +112,21 @@ function invokeWithPlugins(configPath: string, filePath: string, outputPath: str // ComponentTransformer const parsedTransform = insertPlugin(pluginsByState, Es2pandaContextState.ES2PANDA_STATE_PARSED, dumpAst) + setAllParents(parsedTransform) // TODO: Normally we need just to proceed to a given state, // but the compiler crashes now, so we restart restartCompilerUptoState(parsedTransform, Es2pandaContextState.ES2PANDA_STATE_CHECKED) // BuilderLambdaTransformer const checkedTransform = insertPlugin(pluginsByState, Es2pandaContextState.ES2PANDA_STATE_CHECKED, dumpAst) + setAllParents(checkedTransform) restartCompilerUptoState(checkedTransform, Es2pandaContextState.ES2PANDA_STATE_BIN_GENERATED) } +function setAllParents(ast: AstNode) { + global.es2panda._AstNodeUpdateAll(global.context, ast.peer) +} + function loadPlugin(configDir: string, jsonPlugin: any) { const pluginPath = jsonPlugin.transform ?? throwError(`arktsconfig plugins objects should specify transform`) /** TODO: read and pass plugin options */ -- Gitee From 80e59a2b840502bda13ba66931b6ead51d33a47e Mon Sep 17 00:00:00 2001 From: Alexander Gorshenev Date: Sun, 16 Feb 2025 00:46:55 +0300 Subject: [PATCH 2/6] Better handle class flags and modifiers Signed-off-by: Alexander Gorshenev --- .../libarkts/plugins/src/component-transformer.ts | 15 +++++++-------- arkoala-arkts/libarkts/src/arkts-api/types.ts | 2 ++ arkoala-arkts/libarkts/src/arkts-api/visitor.ts | 5 +++-- 3 files changed, 12 insertions(+), 10 deletions(-) diff --git a/arkoala-arkts/libarkts/plugins/src/component-transformer.ts b/arkoala-arkts/libarkts/plugins/src/component-transformer.ts index 28a48ec8e..eb9dea774 100644 --- a/arkoala-arkts/libarkts/plugins/src/component-transformer.ts +++ b/arkoala-arkts/libarkts/plugins/src/component-transformer.ts @@ -77,10 +77,8 @@ export class ComponentTransformer extends AbstractVisitor { node.definition, node.definition.name, node.definition.members, - // passModifiers(modifiers) | es2panda_ModifierFlags.MODIFIER_FLAGS_PUBLIC | es2panda_ModifierFlags.MODIFIER_FLAGS_STATIC, - arkts.Es2pandaModifierFlags.MODIFIER_FLAGS_NONE, - // TODO: pass through modifiers - arkts.Es2pandaClassDefinitionModifiers.CLASS_DEFINITION_MODIFIERS_NONE, + arkts.Es2pandaModifierFlags.MODIFIER_FLAGS_FINAL, + arkts.Es2pandaClassDefinitionModifiers.CLASS_DEFINITION_MODIFIERS_CLASS_DECL, node.definition.typeParamsDecl, arkts.factory.createTypeReference( arkts.factory.createTypeReferencePart( @@ -99,15 +97,16 @@ export class ComponentTransformer extends AbstractVisitor { ) ) - if (arkts.isClassDeclaration(node)) { + if (arkts.isStructDeclaration(node)) { + return arkts.factory.createClassDeclaration( + newDefinition + ) + } else { return arkts.factory.updateClassDeclaration( node, newDefinition ) } - return arkts.factory.createClassDeclaration( - newDefinition - ) } visitor(node: arkts.AstNode): arkts.AstNode { diff --git a/arkoala-arkts/libarkts/src/arkts-api/types.ts b/arkoala-arkts/libarkts/src/arkts-api/types.ts index 7be8fafd1..9ff39ce59 100644 --- a/arkoala-arkts/libarkts/src/arkts-api/types.ts +++ b/arkoala-arkts/libarkts/src/arkts-api/types.ts @@ -17,6 +17,7 @@ import { global } from "./static/global" import { throwError } from "../utils" import { KBoolean, KInt, KNativePointer as KPtr, nullptr } from "@koalaui/interop" import { + Es2pandaClassDefinitionModifiers, Es2pandaContextState, Es2pandaIdentifierFlags, Es2pandaImportKinds, @@ -865,6 +866,7 @@ export class ClassDefinition extends AstNode { this.members = unpackNodeArray(global.generatedEs2panda._ClassDefinitionBody(global.context, this.peer)) this.typeParamsDecl = unpackNode(global.generatedEs2panda._ClassDefinitionTypeParamsConst(global.context, this.peer)) this.superClass = unpackNode(global.generatedEs2panda._ClassDefinitionSuper(global.context, this.peer)) + this.modifiers = global.generatedEs2panda._ClassDefinitionModifiersConst(global.context, this.peer) } static create( diff --git a/arkoala-arkts/libarkts/src/arkts-api/visitor.ts b/arkoala-arkts/libarkts/src/arkts-api/visitor.ts index 7c32de722..86bc6715f 100644 --- a/arkoala-arkts/libarkts/src/arkts-api/visitor.ts +++ b/arkoala-arkts/libarkts/src/arkts-api/visitor.ts @@ -111,9 +111,10 @@ export function visitEachChild( nodeVisitor(node.name, visitor), nodesVisitor(node.members, visitor), // passModifiers(modifiers) | es2panda_ModifierFlags.MODIFIER_FLAGS_PUBLIC | es2panda_ModifierFlags.MODIFIER_FLAGS_STATIC, - Es2pandaModifierFlags.MODIFIER_FLAGS_NONE, + node.modifiers, // TODO: pass through modifiers - Es2pandaClassDefinitionModifiers.CLASS_DEFINITION_MODIFIERS_NONE, + // Passing NONE causes failure when proceeding to CHECKED. + Es2pandaClassDefinitionModifiers.CLASS_DEFINITION_MODIFIERS_CLASS_DECL, nodeVisitor(node.typeParamsDecl, visitor), nodeVisitor(node.superClass, visitor), ) -- Gitee From 3ddadebb6c5e235a858ec0e6a6570969e0390947 Mon Sep 17 00:00:00 2001 From: Alexander Gorshenev Date: Sun, 16 Feb 2025 00:48:46 +0300 Subject: [PATCH 3/6] Better handling of method kinds Signed-off-by: Alexander Gorshenev --- arkoala-arkts/libarkts/src/arkts-api/types.ts | 2 ++ arkoala-arkts/libarkts/src/arkts-api/visitor.ts | 3 +-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/arkoala-arkts/libarkts/src/arkts-api/types.ts b/arkoala-arkts/libarkts/src/arkts-api/types.ts index 9ff39ce59..d926708bc 100644 --- a/arkoala-arkts/libarkts/src/arkts-api/types.ts +++ b/arkoala-arkts/libarkts/src/arkts-api/types.ts @@ -923,6 +923,7 @@ export class MethodDefinition extends AstNode { super(peer) this.scriptFunction = unpackNonNullableNode(global.generatedEs2panda._MethodDefinitionFunction(global.context, this.peer)) this.name = unpackNonNullableNode(global.generatedEs2panda._ScriptFunctionId(global.context, this.scriptFunction.peer)) + this.kind = global.generatedEs2panda._MethodDefinitionKindConst(global.context, this.peer) } static create( @@ -946,6 +947,7 @@ export class MethodDefinition extends AstNode { readonly scriptFunction: ScriptFunction readonly name: Identifier + readonly kind: Es2pandaMethodDefinitionKind } export class ClassElement extends AstNode { diff --git a/arkoala-arkts/libarkts/src/arkts-api/visitor.ts b/arkoala-arkts/libarkts/src/arkts-api/visitor.ts index 86bc6715f..c7816ef61 100644 --- a/arkoala-arkts/libarkts/src/arkts-api/visitor.ts +++ b/arkoala-arkts/libarkts/src/arkts-api/visitor.ts @@ -30,7 +30,6 @@ import { } from "./types" import { Es2pandaClassDefinitionModifiers, - Es2pandaMethodDefinitionKind, Es2pandaModifierFlags } from "../generated/Es2pandaEnums" import { nullptr } from "@koalaui/interop" @@ -123,7 +122,7 @@ export function visitEachChild( // TODO: fix return factory.updateMethodDefinition( node, - Es2pandaMethodDefinitionKind.METHOD_DEFINITION_KIND_METHOD, + node.kind, node.name, factory.createFunctionExpression( // TODO: maybe fix -- Gitee From 0a1ea28b7215229aecf7563e5460c8985818fa61 Mon Sep 17 00:00:00 2001 From: Alexander Gorshenev Date: Sun, 16 Feb 2025 01:04:22 +0300 Subject: [PATCH 4/6] Provide a flag to differentiate restarting stages and direct proceed Signed-off-by: Alexander Gorshenev --- arkoala-arkts/libarkts/package.json | 5 ++-- arkoala-arkts/libarkts/src/es2panda.ts | 31 +++++++++++++++++-------- arkoala-arkts/trivial/user/package.json | 2 +- 3 files changed, 25 insertions(+), 13 deletions(-) diff --git a/arkoala-arkts/libarkts/package.json b/arkoala-arkts/libarkts/package.json index 85e51119f..2f6fe617e 100644 --- a/arkoala-arkts/libarkts/package.json +++ b/arkoala-arkts/libarkts/package.json @@ -25,8 +25,9 @@ "compile:src": "npx ets-tsc -p ./tsconfig.json", "compile": "npm run compile:native && npm run compile:src", "compile:plugins": "npx ets-tsc -p plugins/tsconfig.json", - "run:js": "PANDA_SDK_PATH=../../incremental/tools/panda/node_modules/@panda/sdk node . --file ./plugins/input/main.sts --arktsconfig ./arktsconfig.json --output ./build/abc/main.abc --dump-plugin-ast", - "run": "npm run compile && npm run compile:plugins && npm run run:js", + "restart": "PANDA_SDK_PATH=../../incremental/tools/panda/node_modules/@panda/sdk node . --file ./plugins/input/main.sts --output ./build/abc/main.abc --dump-plugin-ast --arktsconfig ./arktsconfig.json --restart-stages", + "direct": "PANDA_SDK_PATH=../../incremental/tools/panda/node_modules/@panda/sdk node . --file ./plugins/input/no-import-no-struct.sts --output ./build/abc/no-import-no-struct.abc --dump-plugin-ast --arktsconfig ./arktsconfig-print-only.json", + "run": "npm run compile && npm run compile:plugins && npm run restart", "run:abc": "../../incremental/tools/panda/node_modules/@panda/sdk/linux_host_tools/bin/ark --load-runtimes=ets --boot-panda-files=../../incremental/tools/panda/node_modules/@panda/sdk/ets/etsstdlib.abc ./main.abc main.ETSGLOBAL::main", "mocha": "PANDA_SDK_PATH=../../incremental/tools/panda/node_modules/@panda/sdk TS_NODE_PROJECT=./test/tsconfig.json mocha -r tsconfig-paths/register --reporter-option maxDiffSize=0", "test": "npm run compile:native && npm run mocha", diff --git a/arkoala-arkts/libarkts/src/es2panda.ts b/arkoala-arkts/libarkts/src/es2panda.ts index b6b171e2a..1f1abd6d7 100644 --- a/arkoala-arkts/libarkts/src/es2panda.ts +++ b/arkoala-arkts/libarkts/src/es2panda.ts @@ -28,6 +28,7 @@ function parseCommandLineArgs() { .option('--ets-module', 'Do nothing, legacy compatibility') .option('--output, ', 'The name of result file') .option('--dump-plugin-ast', 'Dump ast before and after each plugin') + .option('--restart-stages', 'Restart the compiler to proceeed to next stage') .parse(process.argv) .opts() @@ -44,8 +45,9 @@ function parseCommandLineArgs() { } const dumpAst = commander.dumpPluginAst ?? false + const restartStages = commander.restartStages ?? false - return { filePath, configPath, outputPath, dumpAst } + return { filePath, configPath, outputPath, dumpAst, restartStages } } function insertPlugin(pluginsByState: Map void>, state: Es2pandaContextState, dumpAst: boolean): AstNode { @@ -71,15 +73,24 @@ function insertPlugin(pluginsByState: Map void>, dumpAst: boolean ): void { +function invokeWithPlugins( + configPath: string, + filePath: string, + outputPath: string, + pluginsByState: Map void>, + dumpAst: boolean, + restart: boolean +): void { const source = fs.readFileSync(filePath).toString() const sdk = process.env.PANDA_SDK_PATH ?? withWarning( defaultPandaSdk, @@ -115,12 +126,12 @@ function invokeWithPlugins(configPath: string, filePath: string, outputPath: str setAllParents(parsedTransform) // TODO: Normally we need just to proceed to a given state, // but the compiler crashes now, so we restart - restartCompilerUptoState(parsedTransform, Es2pandaContextState.ES2PANDA_STATE_CHECKED) + restartCompilerUptoState(parsedTransform, Es2pandaContextState.ES2PANDA_STATE_CHECKED, restart) // BuilderLambdaTransformer const checkedTransform = insertPlugin(pluginsByState, Es2pandaContextState.ES2PANDA_STATE_CHECKED, dumpAst) setAllParents(checkedTransform) - restartCompilerUptoState(checkedTransform, Es2pandaContextState.ES2PANDA_STATE_BIN_GENERATED) + restartCompilerUptoState(checkedTransform, Es2pandaContextState.ES2PANDA_STATE_BIN_GENERATED, restart) } function setAllParents(ast: AstNode) { @@ -171,7 +182,7 @@ function readAndSortPlugins(configDir: string, plugins: any[]) { } export function main() { - const { filePath, configPath, outputPath, dumpAst } = parseCommandLineArgs() + const { filePath, configPath, outputPath, dumpAst, restartStages } = parseCommandLineArgs() const arktsconfig = JSON.parse(fs.readFileSync(configPath).toString()) const configDir = path.dirname(configPath) const compilerOptions = arktsconfig.compilerOptions ?? throwError(`arktsconfig should specify compilerOptions`) @@ -179,7 +190,7 @@ export function main() { const pluginsByState = readAndSortPlugins(configDir, plugins) - invokeWithPlugins(configPath, filePath, outputPath, pluginsByState, dumpAst) + invokeWithPlugins(configPath, filePath, outputPath, pluginsByState, dumpAst, restartStages) } main() diff --git a/arkoala-arkts/trivial/user/package.json b/arkoala-arkts/trivial/user/package.json index 88584266e..bbcaf0561 100644 --- a/arkoala-arkts/trivial/user/package.json +++ b/arkoala-arkts/trivial/user/package.json @@ -13,7 +13,7 @@ "unmemoize:all": "npm run unmemoize:runtime && npm run unmemoize:arkui-no-common && npm run unmemoize:arkui-common && npm run unmemoize", "build:user": "npm run unmemoize:all && npm run build:user:inc", "build:user:inc": "fast-arktsc --input-files ./arktsconfig-run-unmemoized.json --output-dir ./build --compiler ../../../incremental/tools/panda/arkts/arktsc --link-name user && ninja ${NINJA_OPTIONS} -f build/build.ninja", - "build:user:pure-sts": "npm run build:arkui:pure-sts --prefix ../../arkui && ../../../incremental/tools/panda/arkts/arktsc-capi --file src/sts/hello.sts --arktsconfig arktsconfig-pure-sts.json --output build/sts/abc/hello.abc --dump-plugin-ast", + "build:user:pure-sts": "npm run build:arkui:pure-sts --prefix ../../arkui && ../../../incremental/tools/panda/arkts/arktsc-capi --file src/sts/hello.sts --arktsconfig arktsconfig-pure-sts.json --output build/sts/abc/hello.abc --dump-plugin-ast --restart-stages", "run:user:pure-sts": "npm run build:user:pure-sts && ../../../incremental/tools/panda/arkts/ark build/sts/abc/hello.abc --ark-boot-files ../../arkui/build/sts/abc/src/sts/arkui.abc:build/sts/abc/hello.abc --ark-entry-point @ohos.example.src.sts.hello.ArkUIEntry::run", "pack": "npm run cli-tools:check && cd app && DEVECO_SDK_HOME=../../../../arkoala/ohos-sdk/ohos-sdk ../../../command-line-tools/hvigor/bin/hvigorw --no-daemon --mode module -p product=default -p module=user@default assembleHar", "har-arm32": "npm run build:user && npm run --prefix ../../../arkoala/ohos-sdk download && node scripts/build-har.mjs --name user --arch arm32 && npm run pack", -- Gitee From 5bacf43071cb965ce8e3fceb9a6da447f53632d6 Mon Sep 17 00:00:00 2001 From: Alexander Gorshenev Date: Sun, 16 Feb 2025 02:51:16 +0300 Subject: [PATCH 5/6] newly added files Signed-off-by: Alexander Gorshenev --- .../libarkts/arktsconfig-print-only.json | 21 ++++++++++++ .../plugins/input/no-import-no-struct.sts | 32 +++++++++++++++++++ 2 files changed, 53 insertions(+) create mode 100644 arkoala-arkts/libarkts/arktsconfig-print-only.json create mode 100644 arkoala-arkts/libarkts/plugins/input/no-import-no-struct.sts diff --git a/arkoala-arkts/libarkts/arktsconfig-print-only.json b/arkoala-arkts/libarkts/arktsconfig-print-only.json new file mode 100644 index 000000000..2a4e2059c --- /dev/null +++ b/arkoala-arkts/libarkts/arktsconfig-print-only.json @@ -0,0 +1,21 @@ +{ + "compilerOptions": { + "outDir": "./abc", + "baseUrl": ".", + "comment": "This is a simplest config to run visitors on both stages", + "plugins": [ + { + "transform": "./plugins/build/src/printer-plugin.js", + "stage": "parsed" + }, + { + "transform": "./plugins/build/src/parsed-stage-plugin.js", + "stage": "parsed" + }, + { + "transform": "./plugins/build/src/checked-stage-plugin.js", + "stage": "checked" + } + ] + } +} diff --git a/arkoala-arkts/libarkts/plugins/input/no-import-no-struct.sts b/arkoala-arkts/libarkts/plugins/input/no-import-no-struct.sts new file mode 100644 index 000000000..26c558e04 --- /dev/null +++ b/arkoala-arkts/libarkts/plugins/input/no-import-no-struct.sts @@ -0,0 +1,32 @@ +@interface Component{} + +@interface BuilderLambda { + value: string +} + +@Component +class MyComponent { + @BuilderLambda("instantiateImpl") + static $_instantiate(factory: () => MyComponent): MyComponent { + const instance = factory() + return instance + } + + static instantiateImpl(builder: (instance: MyComponent)=>MyComponent, factory: () => MyComponent): void { + const instance = factory() + builder(instance) + } + + width(value: number): MyComponent { return this } + build() {} +} + + +@Component +class AnotherComponent { + + build() { + MyComponent() + .width(17.0) + } +} -- Gitee From 2cb448e3ab28730e06b513fbfed7e2f89a91237a Mon Sep 17 00:00:00 2001 From: Alexander Gorshenev Date: Sun, 16 Feb 2025 22:27:12 +0300 Subject: [PATCH 6/6] provided the flag at memo-plugin compilation Signed-off-by: Alexander Gorshenev --- arkoala-arkts/memo-plugin/demo/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/arkoala-arkts/memo-plugin/demo/package.json b/arkoala-arkts/memo-plugin/demo/package.json index 0c938a24b..570031e0f 100644 --- a/arkoala-arkts/memo-plugin/demo/package.json +++ b/arkoala-arkts/memo-plugin/demo/package.json @@ -7,7 +7,7 @@ "unmemoize": "ets-tsc -p tsconfig-unmemoize.json", "ts-like:compile": "npm run unmemoize && fast-arktsc --input-files ./arktsconfig-unmemoized.json --output-dir ./build --compiler ../../../incremental/tools/panda/arkts/arktsc --link-name stub && ninja ${NINJA_OPTIONS} -f build/build.ninja", "arkts-like:compile": "../../../incremental/tools/panda/arkts/arktsc --arktsconfig ./arktsconfig.json --output ./build/demo.abc ./demo.sts", - "arkts-like:compile:capi": "../../../incremental/tools/panda/arkts/arktsc-capi --arktsconfig ./arktsconfig.json --output ./build/demo.abc --file ./demo.sts --dump-plugin-ast", + "arkts-like:compile:capi": "../../../incremental/tools/panda/arkts/arktsc-capi --arktsconfig ./arktsconfig.json --output ./build/demo.abc --file ./demo.sts --dump-plugin-ast --restart-stages", "run": "../../../incremental/tools/panda/arkts/ark ./build/demo.abc --ark-boot-files ../../../incremental/runtime/build/incremental.abc:build/stub.abc --ark-entry-point @koalaui.runtime.demo.ETSGLOBAL::main", "run:unmemoized": "npm run unmemoize && npm run ts-like:compile && ../../../incremental/tools/panda/arkts/ark ./build/demo.abc --ark-boot-files ../../../incremental/runtime/build/incremental.abc --ark-entry-point @koalaui.runtime.demo.ETSGLOBAL::main", "disasm": "../../../incremental/tools/panda/arkts/arkdisasm build/stub.abc build/stub.disasm" -- Gitee