diff --git a/arkoala-arkts/libarkts/playground/src/playground.cc b/arkoala-arkts/libarkts/playground/src/playground.cc index 8d8d7c47535be2c85a5afaec33accea496900df0..e55fcf0e0967948fbad4b3296284d056215434ce 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) { diff --git a/arkoala-arkts/libarkts/plugins/src/component-transformer.ts b/arkoala-arkts/libarkts/plugins/src/component-transformer.ts index ba967e9d53b31fedc10a66988281c97a639ed5d9..a40db46df9996c0f4b426582cdaf9fc9d39a5802 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/plugins/src/struct-transformer.ts b/arkoala-arkts/libarkts/plugins/src/struct-transformer.ts index a313167fcfc5d7488de476116653b6b2aebd9d85..6233ae7805726a612cd9c291d9daed4083d87f7a 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 83a87fdfdbbfe3071fef297352466e4a62387b9c..8c3a367b4bf04e72ca06b7fa6ed8ad970e7bd90e 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 3c2c0ef795e08f2393b127ede0dc0985e6aea04c..2f0791dba4ded6c2921affd5b14582fd5676cdf0 100644 --- a/arkoala-arkts/libarkts/src/arkts-api/utilities/public.ts +++ b/arkoala-arkts/libarkts/src/arkts-api/utilities/public.ts @@ -14,13 +14,13 @@ */ 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" -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,20 @@ export function getOriginalNode(node: AstNode): AstNode { 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 diff --git a/arkoala-arkts/libarkts/src/arkts-api/visitor.ts b/arkoala-arkts/libarkts/src/arkts-api/visitor.ts index 4d005057834659a37e755c58e4ec02c2d12ff2e0..68e4bf965f5487b37da6c97a728655ff3356e52d 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)) {