From 748da5f6afe7ac2071a76f9a3439fec0673dd80b Mon Sep 17 00:00:00 2001 From: Alexander Gorshenev Date: Sun, 2 Mar 2025 21:18:02 +0800 Subject: [PATCH 1/3] Properly propagate class flags Signed-off-by: Alexander Gorshenev --- .../libarkts/plugins/src/component-transformer.ts | 2 +- arkoala-arkts/libarkts/src/arkts-api/utilities/public.ts | 8 ++++++-- arkoala-arkts/libarkts/src/arkts-api/visitor.ts | 3 ++- 3 files changed, 9 insertions(+), 4 deletions(-) diff --git a/arkoala-arkts/libarkts/plugins/src/component-transformer.ts b/arkoala-arkts/libarkts/plugins/src/component-transformer.ts index ba967e9d5..a40db46df 100644 --- a/arkoala-arkts/libarkts/plugins/src/component-transformer.ts +++ b/arkoala-arkts/libarkts/plugins/src/component-transformer.ts @@ -116,7 +116,7 @@ export class ComponentTransformer extends AbstractVisitor { ), node.definition?.body, node.definition?.modifiers, - arkts.Es2pandaModifierFlags.MODIFIER_FLAGS_FINAL + arkts.classDefinitionFlags(node.definition) | arkts.Es2pandaModifierFlags.MODIFIER_FLAGS_FINAL ) if (arkts.isStructDeclaration(node)) { diff --git a/arkoala-arkts/libarkts/src/arkts-api/utilities/public.ts b/arkoala-arkts/libarkts/src/arkts-api/utilities/public.ts index 3c2c0ef79..e768e63a5 100644 --- a/arkoala-arkts/libarkts/src/arkts-api/utilities/public.ts +++ b/arkoala-arkts/libarkts/src/arkts-api/utilities/public.ts @@ -18,9 +18,9 @@ import { throwError } from "../../utils" import { nullptr, withStringResult } from "@koalaui/interop" import { passNode, unpackNodeArray, unpackNonNullableNode } from "./private" import { isFunctionDeclaration, isMemberExpression, isScriptFunction } from "../factory/nodeTests" -import { Es2pandaContextState } from "../../generated/Es2pandaEnums" +import { Es2pandaContextState, Es2pandaModifierFlags } from "../../generated/Es2pandaEnums" import type { AstNode } from "../peers/AstNode" -import { isClassDefinition, type AnnotationUsage } from "../../generated" +import { ClassDefinition, isClassDefinition, type AnnotationUsage } from "../../generated" export function proceedToState(state: Es2pandaContextState): void { if (state <= global.es2panda._ContextState(global.context)) { @@ -91,3 +91,7 @@ export function getOriginalNode(node: AstNode): AstNode { export function getFileName(): string { return global.filePath } + +export function classDefinitionFlags(node: ClassDefinition): Es2pandaModifierFlags { + return global.generatedEs2panda._AstNodeModifiers(global.context, node.peer) +} \ No newline at end of file diff --git a/arkoala-arkts/libarkts/src/arkts-api/visitor.ts b/arkoala-arkts/libarkts/src/arkts-api/visitor.ts index 4d0050578..68e4bf965 100644 --- a/arkoala-arkts/libarkts/src/arkts-api/visitor.ts +++ b/arkoala-arkts/libarkts/src/arkts-api/visitor.ts @@ -36,6 +36,7 @@ import { isVariableDeclarator, isArrowFunctionExpression } from "./factory/nodeTests" +import { classDefinitionFlags } from "./utilities/public" type Visitor = (node: AstNode) => AstNode @@ -165,7 +166,7 @@ export function visitEachChild( node.super, nodesVisitor(node.body, visitor), node.modifiers, - Es2pandaModifierFlags.MODIFIER_FLAGS_NONE + classDefinitionFlags(node) ) } if (isMethodDefinition(node)) { -- Gitee From 167e347a84b00bfef8c05253855a8603e7451a9d Mon Sep 17 00:00:00 2001 From: Alexander Gorshenev Date: Mon, 3 Mar 2025 01:23:46 +0800 Subject: [PATCH 2/3] Updated playground to contain a meaningful transformation Signed-off-by: Alexander Gorshenev --- .../libarkts/playground/src/playground.cc | 35 ++++++++++++++++++- 1 file changed, 34 insertions(+), 1 deletion(-) diff --git a/arkoala-arkts/libarkts/playground/src/playground.cc b/arkoala-arkts/libarkts/playground/src/playground.cc index 8d8d7c475..e55fcf0e0 100644 --- a/arkoala-arkts/libarkts/playground/src/playground.cc +++ b/arkoala-arkts/libarkts/playground/src/playground.cc @@ -30,8 +30,9 @@ es2panda_Impl *GetImpl() { } static const char* source = -"" +"export class XXX {}" ; +static es2panda_AstNode* newStatements[1]; int main() { impl = GetImpl(); @@ -60,6 +61,38 @@ int main() { std::cout << "PROCEED TO PARSE SUCCESS" << std::endl; } + auto ast = GetImpl()->ProgramAst(context, GetImpl()->ContextProgram(context)); + + std::cout << GetImpl()->AstNodeDumpEtsSrcConst(context, ast) << std::endl; + + std::size_t count = 0; + auto statements = impl->BlockStatementStatements(context, ast, &count); + auto oldClass = statements[0]; + auto oldDef = GetImpl()->ClassDeclarationDefinition(context, oldClass); + + std::cout << "statement count: " << count << std::endl; + + auto *identifier = impl->CreateIdentifier1(context, (char *)"XXX"); + auto *newDef = impl->CreateClassDefinition1( + context, + // oldDef, + identifier, nullptr, 0, Es2pandaClassDefinitionModifiers::CLASS_DEFINITION_MODIFIERS_CLASS_DECL, + Es2pandaModifierFlags::MODIFIER_FLAGS_DECLARE + ); + auto *newClazz = impl->CreateClassDeclaration(context, newDef); + newStatements[0] = newClazz; + + impl->BlockStatementSetStatements(context, ast, newStatements, 1); + impl->AstNodeSetParent(context, newDef, newClazz); + impl->AstNodeSetParent(context, identifier, newDef); + + impl->BlockStatementSetStatements(context, ast, newStatements, 1); + + (void)impl->BlockStatementStatements(context, ast, &count); + std::cout << "new statement count: " << count << std::endl; + + std::cout << GetImpl()->AstNodeDumpEtsSrcConst(context, ast) << std::endl; + GetImpl()->ProceedToState(context, ES2PANDA_STATE_BOUND); if(GetImpl()->ContextState(context) == ES2PANDA_STATE_ERROR) { -- Gitee From 7c0b8ec687ff2fdbe0d09d9a279130b92318018b Mon Sep 17 00:00:00 2001 From: Alexander Gorshenev Date: Mon, 3 Mar 2025 01:34:32 +0800 Subject: [PATCH 3/3] Drop the old modifier workaround. Ensure class modifiers are manageble and propagata on update. Signed-off-by: Alexander Gorshenev --- .../libarkts/plugins/src/struct-transformer.ts | 2 +- .../libarkts/src/arkts-api/utilities/private.ts | 3 --- .../libarkts/src/arkts-api/utilities/public.ts | 15 ++++++++++++++- 3 files changed, 15 insertions(+), 5 deletions(-) diff --git a/arkoala-arkts/libarkts/plugins/src/struct-transformer.ts b/arkoala-arkts/libarkts/plugins/src/struct-transformer.ts index a313167fc..6233ae780 100644 --- a/arkoala-arkts/libarkts/plugins/src/struct-transformer.ts +++ b/arkoala-arkts/libarkts/plugins/src/struct-transformer.ts @@ -171,7 +171,7 @@ function tranformClassMembers(node: arkts.ClassDeclaration): arkts.ClassDeclarat definition.super, updateMembers, definition.modifiers, - arkts.Es2pandaModifierFlags.MODIFIER_FLAGS_NONE + arkts.classDefinitionFlags(definition) ) return arkts.factory.updateClassDeclaration(node, updateClassDef); diff --git a/arkoala-arkts/libarkts/src/arkts-api/utilities/private.ts b/arkoala-arkts/libarkts/src/arkts-api/utilities/private.ts index 83a87fdfd..8c3a367b4 100644 --- a/arkoala-arkts/libarkts/src/arkts-api/utilities/private.ts +++ b/arkoala-arkts/libarkts/src/arkts-api/utilities/private.ts @@ -155,9 +155,6 @@ export function updateNodeByNode(node: T, original: AstNode): global.generatedEs2panda._AstNodeSetOriginalNode(global.context, node.peer, original.peer) global.generatedEs2panda._AstNodeSetParent(global.context, node.peer, global.generatedEs2panda._AstNodeParent(global.context, original.peer)) global.es2panda._AstNodeUpdateChildren(global.context, node.peer) - global.generatedEs2panda._AstNodeClearModifier(global.context, node.peer, allFlags) - global.generatedEs2panda._AstNodeAddModifier(global.context, node.peer, original.modifiers) - global.es2panda._AstNodeUpdateChildren(global.context, node.peer) return node } diff --git a/arkoala-arkts/libarkts/src/arkts-api/utilities/public.ts b/arkoala-arkts/libarkts/src/arkts-api/utilities/public.ts index e768e63a5..2f0791dba 100644 --- a/arkoala-arkts/libarkts/src/arkts-api/utilities/public.ts +++ b/arkoala-arkts/libarkts/src/arkts-api/utilities/public.ts @@ -14,7 +14,7 @@ */ import { global } from "../static/global" -import { throwError } from "../../utils" +import { isNumber, throwError } from "../../utils" import { nullptr, withStringResult } from "@koalaui/interop" import { passNode, unpackNodeArray, unpackNonNullableNode } from "./private" import { isFunctionDeclaration, isMemberExpression, isScriptFunction } from "../factory/nodeTests" @@ -92,6 +92,19 @@ export function getFileName(): string { return global.filePath } +// TODO: It seems like Definition overrides AstNode modifiers +// with it's own modifiers which is completely unrelated set of flags. +// Use this function if you need +// the language level modifiers: public, declare, export, etc. export function classDefinitionFlags(node: ClassDefinition): Es2pandaModifierFlags { return global.generatedEs2panda._AstNodeModifiers(global.context, node.peer) +} + +export function modifiersToString(modifiers: Es2pandaModifierFlags): string { + return Object.values(Es2pandaModifierFlags) + .filter(isNumber) + .map(it => { + console.log(it.valueOf(), Es2pandaModifierFlags[it], modifiers.valueOf() & it) + return ((modifiers.valueOf() & it) === it) ? Es2pandaModifierFlags[it] : "" + }).join(" ") } \ No newline at end of file -- Gitee