From fdc8f42c3379e0b8170277b4bb640e9cc1852dcb Mon Sep 17 00:00:00 2001 From: Alexander Gorshenev Date: Thu, 30 Jan 2025 16:50:52 +0300 Subject: [PATCH 1/2] struct support in the plugin Signed-off-by: Alexander Gorshenev --- .../libarkts/examples/input/main.sts | 4 +- .../examples/src/component-transformer.ts | 75 ++++++++++++------- arkoala-arkts/libarkts/native/src/bridges.cc | 9 +++ .../libarkts/src/Es2pandaNativeModule.ts | 3 + .../src/arkts-api/factory/nodeFactory.ts | 3 + .../src/arkts-api/factory/nodeTests.ts | 5 ++ arkoala-arkts/libarkts/src/arkts-api/types.ts | 23 ++++++ .../src/arkts-api/utilities/private.ts | 1 + .../libarkts/src/arkts-api/visitor.ts | 6 ++ 9 files changed, 100 insertions(+), 29 deletions(-) diff --git a/arkoala-arkts/libarkts/examples/input/main.sts b/arkoala-arkts/libarkts/examples/input/main.sts index 242d39c21..e26d1d1f5 100644 --- a/arkoala-arkts/libarkts/examples/input/main.sts +++ b/arkoala-arkts/libarkts/examples/input/main.sts @@ -11,7 +11,7 @@ class StructBase {} // @interface __Options_AnotherComponent {} @Component -class MyComponent { +struct MyComponent { @BuilderLambda("instantiateImpl") static $_instantiate(factory: () => MyComponent): MyComponent { const instance = factory() @@ -28,7 +28,7 @@ class MyComponent { @Component -class AnotherComponent { +struct AnotherComponent { build() { MyComponent() diff --git a/arkoala-arkts/libarkts/examples/src/component-transformer.ts b/arkoala-arkts/libarkts/examples/src/component-transformer.ts index 40385f395..98078ba69 100644 --- a/arkoala-arkts/libarkts/examples/src/component-transformer.ts +++ b/arkoala-arkts/libarkts/examples/src/component-transformer.ts @@ -19,13 +19,24 @@ import { AbstractVisitor } from "./AbstractVisitor"; export class ComponentTransformer extends AbstractVisitor { private context: { componentNames: string[] } = { componentNames: [] } - isComponent(node: arkts.ClassDeclaration): boolean { + isComponentClass(node: arkts.ClassDeclaration): boolean { // TODO: // const annotations = arkts.getAnnotations(node.definition) return node.definition.name.name.endsWith("Component") } + isComponentStruct(node: arkts.StructDeclaration): boolean { + // TODO: + // const annotations = arkts.getAnnotations(node.definition) + console.log("GOT STRUCT!") + console.log("GOT DEF", node.definition) + console.log("GOT NAME", node.definition.name) + console.log("GOT NAME NAME", node.definition.name.name) + return node.definition.name.name.endsWith("Component") + } + + processEtsScript(node: arkts.EtsScript): arkts.EtsScript { // const importDecl = arkts.factory.createImportDeclaration( // arkts.factory.createStringLiteral('example/arkui/runtime'), @@ -58,37 +69,45 @@ export class ComponentTransformer extends AbstractVisitor { ) } - processComponent(node: arkts.ClassDeclaration): arkts.ClassDeclaration { + processComponent(node: arkts.ClassDeclaration | arkts.StructDeclaration): arkts.ClassDeclaration { const className = node.definition.name.name this.context.componentNames.push(className) - return arkts.factory.updateClassDeclaration( - node, - arkts.factory.updateClassDefinition( - 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, - node.definition.typeParamsDecl, - arkts.factory.createTypeReference( - arkts.factory.createTypeReferencePart( - arkts.factory.createIdentifier('StructBase'), - arkts.factory.createTSTypeParameterInstantiation( - [ - arkts.factory.createTypeReference( - arkts.factory.createIdentifier(className) - ), - arkts.factory.createTypeReference( - arkts.factory.createIdentifier(`__Options_${className}`) - ), - ] - ) + + const newDefinition = arkts.factory.updateClassDefinition( + 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, + node.definition.typeParamsDecl, + arkts.factory.createTypeReference( + arkts.factory.createTypeReferencePart( + arkts.factory.createIdentifier('StructBase'), + arkts.factory.createTSTypeParameterInstantiation( + [ + arkts.factory.createTypeReference( + arkts.factory.createIdentifier(className) + ), + arkts.factory.createTypeReference( + arkts.factory.createIdentifier(`__Options_${className}`) + ), + ] ) ) ) ) + + if (arkts.isClassDeclaration(node)) { + return arkts.factory.updateClassDeclaration( + node, + newDefinition + ) + } + return arkts.factory.createClassDeclaration( + newDefinition + ) } visitor(node: arkts.Node): arkts.Node { @@ -96,7 +115,9 @@ export class ComponentTransformer extends AbstractVisitor { if (arkts.isEtsScript(newNode)) { return this.processEtsScript(newNode) } - if (arkts.isClassDeclaration(newNode) && this.isComponent(newNode)) { + if (arkts.isClassDeclaration(newNode) && this.isComponentClass(newNode) || + arkts.isStructDeclaration(newNode) && this.isComponentStruct(newNode) + ) { return this.processComponent(newNode) } return newNode diff --git a/arkoala-arkts/libarkts/native/src/bridges.cc b/arkoala-arkts/libarkts/native/src/bridges.cc index 19643c911..f6649f1ab 100644 --- a/arkoala-arkts/libarkts/native/src/bridges.cc +++ b/arkoala-arkts/libarkts/native/src/bridges.cc @@ -165,6 +165,15 @@ KNativePointer impl_ScopeSetParent(KNativePointer contextPtr, KNativePointer nod } KOALA_INTEROP_3(ScopeSetParent, KNativePointer, KNativePointer, KNativePointer, KNativePointer) +KNativePointer impl_CreateETSStructDeclaration(KNativePointer contextPtr, KNativePointer defPtr) { + auto context = reinterpret_cast(contextPtr); + auto def = reinterpret_cast(defPtr); + + return GetImpl()->CreateETSStructDeclaration(context, def); +} +KOALA_INTEROP_2(CreateETSStructDeclaration, KNativePointer, KNativePointer, KNativePointer) + + KNativePointer impl_CreateClassDeclaration(KNativePointer contextPtr, KNativePointer defPtr) { auto context = reinterpret_cast(contextPtr); auto def = reinterpret_cast(defPtr); diff --git a/arkoala-arkts/libarkts/src/Es2pandaNativeModule.ts b/arkoala-arkts/libarkts/src/Es2pandaNativeModule.ts index 408b5f127..b49b026cb 100644 --- a/arkoala-arkts/libarkts/src/Es2pandaNativeModule.ts +++ b/arkoala-arkts/libarkts/src/Es2pandaNativeModule.ts @@ -471,6 +471,9 @@ export class Es2pandaNativeModule { _ClassDefinitionTypeParamsConst(context: KPtr, node: KPtr): KPtr { throw new Error("Not implemented") } + _CreateETSStructDeclaration(context: KPtr, def: KPtr): KPtr { + throw new Error("Not implemented") + } _CreateClassDeclaration(context: KPtr, def: KPtr): KPtr { throw new Error("Not implemented") } diff --git a/arkoala-arkts/libarkts/src/arkts-api/factory/nodeFactory.ts b/arkoala-arkts/libarkts/src/arkts-api/factory/nodeFactory.ts index 7f4cad862..37ac26e13 100644 --- a/arkoala-arkts/libarkts/src/arkts-api/factory/nodeFactory.ts +++ b/arkoala-arkts/libarkts/src/arkts-api/factory/nodeFactory.ts @@ -119,6 +119,9 @@ export const factory = { createClassDeclaration: arkts.ClassDeclaration.create, updateClassDeclaration: compose(arkts.ClassDeclaration.create), + createStructDeclaration: arkts.StructDeclaration.create, + updateStructDeclaration: compose(arkts.StructDeclaration.create), + createClassDefinition: arkts.ClassDefinition.create, updateClassDefinition: compose(arkts.ClassDefinition.create), diff --git a/arkoala-arkts/libarkts/src/arkts-api/factory/nodeTests.ts b/arkoala-arkts/libarkts/src/arkts-api/factory/nodeTests.ts index 0c5b9059a..658cac286 100644 --- a/arkoala-arkts/libarkts/src/arkts-api/factory/nodeTests.ts +++ b/arkoala-arkts/libarkts/src/arkts-api/factory/nodeTests.ts @@ -15,6 +15,7 @@ import { ScriptFunction, StringLiteral, ClassDefinition, + StructDeclaration, } from "../types" export function isIdentifier(node: Node): node is Identifier { @@ -53,6 +54,10 @@ export function isClassDeclaration(node: Node): node is ClassDeclaration { return node instanceof ClassDeclaration } +export function isStructDeclaration(node: Node): node is StructDeclaration { + return node instanceof StructDeclaration +} + export function isBlockStatement(node: Node): node is BlockStatement { return node instanceof BlockStatement } diff --git a/arkoala-arkts/libarkts/src/arkts-api/types.ts b/arkoala-arkts/libarkts/src/arkts-api/types.ts index 70da98567..990823c90 100644 --- a/arkoala-arkts/libarkts/src/arkts-api/types.ts +++ b/arkoala-arkts/libarkts/src/arkts-api/types.ts @@ -962,6 +962,29 @@ export class IfStatement extends Node { } } +export class StructDeclaration extends Node { + constructor(peer: KPtr) { + assertValidPeer(peer, Es2pandaAstNodeType.AST_NODE_TYPE_STRUCT_DECLARATION) + super(peer) + // TODO: is struct definition the same as struct definition? + this.definition = unpackNonNullableNode(global.es2panda._ClassDeclarationDefinition(global.context, this.peer)) + } + + static create( + definition: ClassDefinition, + ): StructDeclaration { + return new StructDeclaration( + global.es2panda._CreateETSStructDeclaration( + global.context, + passNode(definition) + ) + ) + } + + readonly definition: ClassDefinition +} + + export class ClassDeclaration extends Node { constructor(peer: KPtr) { assertValidPeer(peer, Es2pandaAstNodeType.AST_NODE_TYPE_CLASS_DECLARATION) diff --git a/arkoala-arkts/libarkts/src/arkts-api/utilities/private.ts b/arkoala-arkts/libarkts/src/arkts-api/utilities/private.ts index 660df06f1..ca2c49005 100644 --- a/arkoala-arkts/libarkts/src/arkts-api/utilities/private.ts +++ b/arkoala-arkts/libarkts/src/arkts-api/utilities/private.ts @@ -47,6 +47,7 @@ export function classByPeer(peer: KNativePointer): arkts.Node { [Es2pandaAstNodeType.AST_NODE_TYPE_BINARY_EXPRESSION, arkts.BinaryExpression], [Es2pandaAstNodeType.AST_NODE_TYPE_ETS_UNION_TYPE, arkts.ETSUnionType], [Es2pandaAstNodeType.AST_NODE_TYPE_ARROW_FUNCTION_EXPRESSION, arkts.ArrowFunctionExpression], + [Es2pandaAstNodeType.AST_NODE_TYPE_STRUCT_DECLARATION, arkts.StructDeclaration], [Es2pandaAstNodeType.AST_NODE_TYPE_CLASS_DECLARATION, arkts.ClassDeclaration], [Es2pandaAstNodeType.AST_NODE_TYPE_CLASS_DEFINITION, arkts.ClassDefinition], [Es2pandaAstNodeType.AST_NODE_TYPE_METHOD_DEFINITION, arkts.MethodDefinition], diff --git a/arkoala-arkts/libarkts/src/arkts-api/visitor.ts b/arkoala-arkts/libarkts/src/arkts-api/visitor.ts index 2ff50ee7b..5d584cdfb 100644 --- a/arkoala-arkts/libarkts/src/arkts-api/visitor.ts +++ b/arkoala-arkts/libarkts/src/arkts-api/visitor.ts @@ -67,6 +67,12 @@ export function visitEachChild( nodeVisitor(node.definition, visitor) ) } + if (node instanceof arkts.StructDeclaration) { + return factory.updateStructDeclaration( + node, + nodeVisitor(node.definition, visitor) + ) + } if (node instanceof arkts.ClassDefinition) { // TODO: fix return factory.updateClassDefinition( -- Gitee From 9db65d3576eec7e8ac8e8b84cfd4c86b846f3aa3 Mon Sep 17 00:00:00 2001 From: Alexander Gorshenev Date: Fri, 31 Jan 2025 13:44:43 +0300 Subject: [PATCH 2/2] Struct transformer Signed-off-by: Alexander Gorshenev --- arkoala-arkts/libarkts/examples/src/component-transformer.ts | 4 ---- 1 file changed, 4 deletions(-) diff --git a/arkoala-arkts/libarkts/examples/src/component-transformer.ts b/arkoala-arkts/libarkts/examples/src/component-transformer.ts index 98078ba69..4b4ed420b 100644 --- a/arkoala-arkts/libarkts/examples/src/component-transformer.ts +++ b/arkoala-arkts/libarkts/examples/src/component-transformer.ts @@ -29,10 +29,6 @@ export class ComponentTransformer extends AbstractVisitor { isComponentStruct(node: arkts.StructDeclaration): boolean { // TODO: // const annotations = arkts.getAnnotations(node.definition) - console.log("GOT STRUCT!") - console.log("GOT DEF", node.definition) - console.log("GOT NAME", node.definition.name) - console.log("GOT NAME NAME", node.definition.name.name) return node.definition.name.name.endsWith("Component") } -- Gitee