diff --git a/arkoala-arkts/libarkts/examples/input/main.sts b/arkoala-arkts/libarkts/examples/input/main.sts index 242d39c21419241373cf42afae738282bd9daebd..e26d1d1f527317ac34aa2a3b1248a9a6e0432ff7 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 40385f395c2187745831394a9d7d083b0477d695..4b4ed420bd6bf7aa9d67aa705a23a62b5b26f823 100644 --- a/arkoala-arkts/libarkts/examples/src/component-transformer.ts +++ b/arkoala-arkts/libarkts/examples/src/component-transformer.ts @@ -19,13 +19,20 @@ 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) + 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 +65,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 +111,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 19643c911d2f5dede44801ffea0c2556a58ff993..f6649f1ab62fb19b522a361a91f8a15ef8d6ad72 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 408b5f127dc1f95bf2071d32a1ac016d9e16ee12..b49b026cbfb175dc4a60548b3ce8e0dd8bf66a69 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 7f4cad862fb1de67f372f53aa1331f68c625e408..37ac26e13f7acf4ed290bed6ab26c77874d73644 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 0c5b9059ae6c2d37374b15edbc7ac01e4e25a07c..658cac2866febadf3c8f5eadd57efe2af7eb7d4f 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 70da98567d953c707c48c8a63200097ed34af1f8..990823c902eb564dc1141d80acd088b9bd6e5266 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 660df06f137b49f73726166d8c9fa9aa7b6540b9..ca2c4900561fb3d22463171aac979319f18c30d2 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 2ff50ee7bc25db86383de6cd017e0accbb3dc7ec..5d584cdfb5723cd8fd13b2f7609c5e9373c6fa51 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(