From 5ad89fb4c0c09a276be0568a09b51f2d36ac995e Mon Sep 17 00:00:00 2001 From: chernishevvictor Date: Tue, 21 Jan 2025 19:43:15 +0300 Subject: [PATCH 1/3] rebase --- .../libarkts/examples/input/main.sts | 66 ++++++----- .../examples/src/component-transformer.ts | 106 ++++++++++++------ .../src/example-checked-transformer.ts | 3 +- arkoala-arkts/libarkts/native/src/bridges.cc | 23 ++++ arkoala-arkts/libarkts/package.json | 3 +- .../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 | 31 ++++- .../src/arkts-api/utilities/public.ts | 4 +- arkoala-arkts/libarkts/src/es2panda.ts | 1 + 11 files changed, 174 insertions(+), 74 deletions(-) diff --git a/arkoala-arkts/libarkts/examples/input/main.sts b/arkoala-arkts/libarkts/examples/input/main.sts index f3610831a..0de997c72 100644 --- a/arkoala-arkts/libarkts/examples/input/main.sts +++ b/arkoala-arkts/libarkts/examples/input/main.sts @@ -1,42 +1,46 @@ -/* Library code */ -class StructBase {} +// /* Library code */ +// class StructBase {} -@interface BuilderLambda { - value: string -} -@interface Component {} +// @interface BuilderLambda { +// value: string +// } +// @interface Component {} -/* User code */ -interface __Options_MyComponent {} -interface __Options_AnotherComponent {} +// /* User code */ +// interface __Options_MyComponent {} +// interface __Options_AnotherComponent {} -@Component -class MyComponent { - @BuilderLambda("instantiateImpl") - static instantiate(factory: () => MyComponent): MyComponent { - const instance = factory() - return instance - } +// @Component +// class MyComponent { +// @BuilderLambda("instantiateImpl") +// static instantiate(factory: () => MyComponent): MyComponent { +// const instance = factory() +// return instance +// } - static instantiateImpl(builder: (instance: MyComponent)=>MyComponent, factory: () => MyComponent) { - const instance = factory() - builder(instance) - } +// static instantiateImpl(builder: (instance: MyComponent)=>MyComponent, factory: () => MyComponent) { +// const instance = factory() +// builder(instance) +// } - width(value: number): MyComponent { return this } -} +// width(value: number): MyComponent { return this } +// } -@Component -class AnotherComponent { +// @Component +// class AnotherComponent { - build() { - MyComponent() - .width(17.0) - } -} +// build() { +// MyComponent() +// .width(17.0) +// } +// } -function main() {} +// function main() {} -main() +// main() +@interface Component {} + +@Component +class A {} diff --git a/arkoala-arkts/libarkts/examples/src/component-transformer.ts b/arkoala-arkts/libarkts/examples/src/component-transformer.ts index bfcbbb0f1..4688e30ea 100644 --- a/arkoala-arkts/libarkts/examples/src/component-transformer.ts +++ b/arkoala-arkts/libarkts/examples/src/component-transformer.ts @@ -30,51 +30,83 @@ import { AbstractVisitor } from "./AbstractVisitor"; // return undefined // } +// TODO: function isComponent(node: arkts.ClassDeclaration): boolean { // const constructor = getConstructor(node) - return node.definition.name.name.endsWith("Component") + // const annotations = arkts.getAnnotations(node.definition) + return node.definition.name.name === 'A' } -export class ComponentTransformer extends AbstractVisitor { - visitor(beforeChildren: arkts.Node): arkts.Node { - const node = this.visitEachChild(beforeChildren) +function processEtsScript(node: arkts.EtsScript): arkts.EtsScript { + const importDecl = arkts.factory.createImportDeclaration( + arkts.factory.createStringLiteral('example/arkui/runtime'), + [ + arkts.factory.createImportSpecifier( + arkts.factory.createIdentifier('StructBase'), + arkts.nullptr + ) + ], + arkts.Es2pandaImportKinds.TYPE, + false + ) + const interfaceDecl = arkts.factory.createInterfaceDeclaration( + [], + arkts.factory.createIdentifier('__Options_A'), + arkts.nullptr, + arkts.factory.createBlock([]), + false, + false + ) + return arkts.factory.updateEtsScript( + node, + [ + importDecl, + interfaceDecl, + ...node.statements + ] + ) +} - if (!arkts.isClassDeclaration(node)) { - return node - } - if (!isComponent(node)) { - return node - } - const className = node.definition.name.name - const optionsName = `__Options_${node.definition.name.name}` - // return node - 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(optionsName) - ), - ] - ) +function processComponent(node: arkts.ClassDeclaration): arkts.ClassDeclaration { + 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('A') + ), + arkts.factory.createTypeReference( + arkts.factory.createIdentifier('__Options_A') + ), + ] ) ) ) ) + ) +} + +export class ComponentTransformer extends AbstractVisitor { + visitor(beforeChildren: arkts.Node): arkts.Node { + const node = this.visitEachChild(beforeChildren) + if (arkts.isEtsScript(node)) { + return processEtsScript(node) + } + if (arkts.isClassDeclaration(node) && isComponent(node)) { + return processComponent(node) + } + return node } } diff --git a/arkoala-arkts/libarkts/examples/src/example-checked-transformer.ts b/arkoala-arkts/libarkts/examples/src/example-checked-transformer.ts index 537091d79..79186e945 100644 --- a/arkoala-arkts/libarkts/examples/src/example-checked-transformer.ts +++ b/arkoala-arkts/libarkts/examples/src/example-checked-transformer.ts @@ -1,6 +1,7 @@ import * as ts from "@koalaui/libarkts" import { PrintVisitor } from './print-visitor' import { BuilderLambdaTransformer } from './builder-lambda-transformer' +import { ComponentTransformer } from './component-transformer' export interface TransformerOptions { trace?: boolean, @@ -10,6 +11,6 @@ export default function exampleTransformer( userPluginOptions?: TransformerOptions ) { return (node: ts.EtsScript) => { - return new BuilderLambdaTransformer().visitor(node) + return new ComponentTransformer().visitor(node) } } diff --git a/arkoala-arkts/libarkts/native/src/bridges.cc b/arkoala-arkts/libarkts/native/src/bridges.cc index b260d71bd..7318b9e27 100644 --- a/arkoala-arkts/libarkts/native/src/bridges.cc +++ b/arkoala-arkts/libarkts/native/src/bridges.cc @@ -1,5 +1,28 @@ #include "common.h" +KNativePointer impl_CreateTSInterfaceDeclaration( + KNativePointer _context, + KNativePointerArray _extends, + KInt _extendsLen, + KNativePointer _id, + KNativePointer _typeParams, + KNativePointer _body, + KBoolean _isStatic, + KBoolean _isExternal +) { + auto context = reinterpret_cast(_context); + auto extends = reinterpret_cast(_extends); + auto extendsLen = static_cast(_extendsLen); + auto id = reinterpret_cast(_id); + auto typeParams = reinterpret_cast(_typeParams); + auto body = reinterpret_cast(_body); + auto isStatic = static_cast(_isStatic); + auto isExternal = static_cast(_isExternal); + + return GetImpl()->CreateTSInterfaceDeclaration(context, extends, extendsLen, id, typeParams, body, isStatic, isExternal); +} +KOALA_INTEROP_8(CreateTSInterfaceDeclaration, KNativePointer, KNativePointer, KNativePointerArray, KInt, KNativePointer, KNativePointer, KNativePointer, KBoolean, KBoolean) + KNativePointer impl_CreateTSTypeParameterInstantiation( KNativePointer context, KNativePointerArray params, diff --git a/arkoala-arkts/libarkts/package.json b/arkoala-arkts/libarkts/package.json index 929bc727d..76258d729 100644 --- a/arkoala-arkts/libarkts/package.json +++ b/arkoala-arkts/libarkts/package.json @@ -27,7 +27,6 @@ "test": "npm run compile:native && npm run mocha", "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", "compile:playground": "cd playground && meson setup build && meson compile -C build", - "run:playground": "npm run compile:playground && ./playground/build/playground.out", - "clean": "rimraf ./build && rimraf ./native/build && rimraf ./playground/build && rimraf ./compatible/build" + "run:playground": "npm run compile:playground && ./playground/build/playground.out" } } diff --git a/arkoala-arkts/libarkts/src/Es2pandaNativeModule.ts b/arkoala-arkts/libarkts/src/Es2pandaNativeModule.ts index 827529d80..b85911607 100644 --- a/arkoala-arkts/libarkts/src/Es2pandaNativeModule.ts +++ b/arkoala-arkts/libarkts/src/Es2pandaNativeModule.ts @@ -27,6 +27,9 @@ import { export type KPtrArray = BigUint64Array export class Es2pandaNativeModule { + _CreateTSInterfaceDeclaration(_context: KPtr, _extends: KPtrArray, _extendsLen: KInt, _id: KPtr, _typeParams: KPtr, _body: KPtr, _isStatic: KBoolean, _isExternal: KBoolean): KPtr { + throw new Error("Not implemented") + } _CreateTSTypeParameterInstantiation(context: KPtr, params: KPtrArray, paramsLen: KInt): 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 753b7040f..ecf51582f 100644 --- a/arkoala-arkts/libarkts/src/arkts-api/factory/nodeFactory.ts +++ b/arkoala-arkts/libarkts/src/arkts-api/factory/nodeFactory.ts @@ -136,4 +136,7 @@ export const factory = { createTSTypeParameterInstantiation: arkts.TSTypeParameterInstantiation.create, updateTSTypeParameterInstantiation: compose(arkts.TSTypeParameterInstantiation.create), + + createInterfaceDeclaration: arkts.TSInterfaceDeclaration.create, + updateInterfaceDeclaration: compose(arkts.TSInterfaceDeclaration.create), } diff --git a/arkoala-arkts/libarkts/src/arkts-api/factory/nodeTests.ts b/arkoala-arkts/libarkts/src/arkts-api/factory/nodeTests.ts index 64a29f26a..20ec7c362 100644 --- a/arkoala-arkts/libarkts/src/arkts-api/factory/nodeTests.ts +++ b/arkoala-arkts/libarkts/src/arkts-api/factory/nodeTests.ts @@ -18,6 +18,7 @@ import { VariableDeclaration, ScriptFunction, StringLiteral, + ClassDefinition, } from "../types" export function isIdentifier(node: Node): node is Identifier { @@ -80,6 +81,10 @@ export function isStringLiteral(node: Node): node is StringLiteral { return node instanceof StringLiteral } +export function isClassDefinition(node: Node): node is ClassDefinition { + return node instanceof ClassDefinition +} + // export function isVariableDeclarationList(node: Node): node is VariableDeclarationList { // return node.kind === SyntaxKind.VariableDeclarationList // } diff --git a/arkoala-arkts/libarkts/src/arkts-api/types.ts b/arkoala-arkts/libarkts/src/arkts-api/types.ts index 1fb50c7a2..a9db1876f 100644 --- a/arkoala-arkts/libarkts/src/arkts-api/types.ts +++ b/arkoala-arkts/libarkts/src/arkts-api/types.ts @@ -16,7 +16,7 @@ import global from "./static/global" import { throwError } from "../utils" -import { KInt, KNativePointer as KPtr, isNullPtr, nullptr } from "@koalaui/interop" +import { KBoolean, KInt, KNativePointer as KPtr, isNullPtr, nullptr } from "@koalaui/interop" import { Es2pandaPrimitiveType, Es2pandaModifierFlags, @@ -1280,6 +1280,35 @@ export class TSTypeParameterInstantiation extends Node { } } +export class TSInterfaceDeclaration extends Node { + constructor(peer: KPtr) { + assertValidPeer(peer, Es2pandaAstNodeType.AST_NODE_TYPE_TS_INTERFACE_DECLARATION) + super(peer) + } + + static create( + extendsParams: readonly Node[], + id: Node, + typeParams: Node, + body: Node, + isStatic: KBoolean, + isExternal: KBoolean, + ): TSInterfaceDeclaration { + return new TSInterfaceDeclaration( + global.es2panda._CreateTSInterfaceDeclaration( + global.context, + passNodeArray(extendsParams), + extendsParams.length, + passNode(id), + passNode(typeParams), + passNode(body), + isStatic, + isExternal, + ) + ) + } +} + export class UndefinedLiteral extends Node { constructor(peer: KPtr) { assertValidPeer(peer, Es2pandaAstNodeType.AST_NODE_TYPE_UNDEFINED_LITERAL) diff --git a/arkoala-arkts/libarkts/src/arkts-api/utilities/public.ts b/arkoala-arkts/libarkts/src/arkts-api/utilities/public.ts index d12ab9d62..9a0ae4731 100644 --- a/arkoala-arkts/libarkts/src/arkts-api/utilities/public.ts +++ b/arkoala-arkts/libarkts/src/arkts-api/utilities/public.ts @@ -97,8 +97,8 @@ export function getDecl(node: arkts.Node): arkts.Node | undefined { } export function getAnnotations(node: arkts.Node): readonly arkts.AnnotationUsageIr[] { - if (!arkts.isFunctionDeclaration(node) && !arkts.isScriptFunction(node)) { - throwError('for now annotations allowed only for: functionDeclaration, scriptFuncion') + if (!arkts.isFunctionDeclaration(node) && !arkts.isScriptFunction(node) && !arkts.isClassDefinition(node)) { + throwError('for now annotations allowed only for: functionDeclaration, scriptFuncion, classDefinition') } return arkts.unpackNodeArray(global.es2panda._AnnotationAllowedAnnotations(global.context, node.peer, arkts.nullptr)) } diff --git a/arkoala-arkts/libarkts/src/es2panda.ts b/arkoala-arkts/libarkts/src/es2panda.ts index cc758a032..6dd5111f0 100644 --- a/arkoala-arkts/libarkts/src/es2panda.ts +++ b/arkoala-arkts/libarkts/src/es2panda.ts @@ -53,6 +53,7 @@ function invokePlugins(configPath: string, filePath: string ): void { ]) global.context = arkts.createContextFromString(global.config, source, filePath) + // const _ = insertPlugin(arkts.Es2pandaContextState.ES2PANDA_STATE_PARSED) const checked = insertPlugin(arkts.Es2pandaContextState.ES2PANDA_STATE_CHECKED) -- Gitee From 850b5647cb18a9581038c1b529b31f213c9a9f83 Mon Sep 17 00:00:00 2001 From: chernishevvictor Date: Wed, 22 Jan 2025 17:00:25 +0300 Subject: [PATCH 2/3] two transformers preprocessing --- .../libarkts/examples/input/main.sts | 67 ++++---- .../examples/src/component-transformer.ts | 154 +++++++++--------- .../src/example-checked-transformer.ts | 2 +- arkoala-arkts/libarkts/src/es2panda.ts | 24 ++- 4 files changed, 123 insertions(+), 124 deletions(-) diff --git a/arkoala-arkts/libarkts/examples/input/main.sts b/arkoala-arkts/libarkts/examples/input/main.sts index 0de997c72..78941dbc0 100644 --- a/arkoala-arkts/libarkts/examples/input/main.sts +++ b/arkoala-arkts/libarkts/examples/input/main.sts @@ -1,46 +1,41 @@ -// /* Library code */ -// class StructBase {} +/* Library code */ +class StructBase {} -// @interface BuilderLambda { -// value: string -// } -// @interface Component {} +@interface BuilderLambda { + value: string +} +@interface Component {} -// /* User code */ -// interface __Options_MyComponent {} -// interface __Options_AnotherComponent {} +/* User code */ +// @interface __Options_MyComponent {} +// @interface __Options_AnotherComponent {} -// @Component -// class MyComponent { -// @BuilderLambda("instantiateImpl") -// static instantiate(factory: () => MyComponent): MyComponent { -// const instance = factory() -// return instance -// } +@Component +class MyComponent { + @BuilderLambda("instantiateImpl") + static instantiate(factory: () => MyComponent): MyComponent { + const instance = factory() + return instance + } -// static instantiateImpl(builder: (instance: MyComponent)=>MyComponent, factory: () => MyComponent) { -// const instance = factory() -// builder(instance) -// } + static instantiateImpl(builder: (instance: MyComponent)=>MyComponent, factory: () => MyComponent) { + const instance = factory() + builder(instance) + } -// width(value: number): MyComponent { return this } -// } + width(value: number): MyComponent { return this } +} -// @Component -// class AnotherComponent { +@Component +class AnotherComponent { -// build() { -// MyComponent() -// .width(17.0) -// } -// } - -// function main() {} + build() { + MyComponent() + .width(17.0) + } +} -// main() +function main() {} -@interface Component {} - -@Component -class A {} +main() diff --git a/arkoala-arkts/libarkts/examples/src/component-transformer.ts b/arkoala-arkts/libarkts/examples/src/component-transformer.ts index 4688e30ea..40385f395 100644 --- a/arkoala-arkts/libarkts/examples/src/component-transformer.ts +++ b/arkoala-arkts/libarkts/examples/src/component-transformer.ts @@ -16,97 +16,89 @@ import * as arkts from "@koalaui/libarkts" import { AbstractVisitor } from "./AbstractVisitor"; -// function getConstructor(node: arkts.ClassDeclaration): arkts.MethodDefinition | undefined { -// const definition = node.definition -// const members = definition.members -// members.forEach( -// (member) => { -// if (arkts.isMethodDefinition(member)) { -// const func = member.scriptFunction -// const annotations = arkts.getAnnotations(func) -// } -// } -// ) -// return undefined -// } +export class ComponentTransformer extends AbstractVisitor { + private context: { componentNames: string[] } = { componentNames: [] } -// TODO: -function isComponent(node: arkts.ClassDeclaration): boolean { - // const constructor = getConstructor(node) - // const annotations = arkts.getAnnotations(node.definition) - return node.definition.name.name === 'A' -} + isComponent(node: arkts.ClassDeclaration): boolean { + // TODO: + // const annotations = arkts.getAnnotations(node.definition) + + return node.definition.name.name.endsWith("Component") + } -function processEtsScript(node: arkts.EtsScript): arkts.EtsScript { - const importDecl = arkts.factory.createImportDeclaration( - arkts.factory.createStringLiteral('example/arkui/runtime'), - [ - arkts.factory.createImportSpecifier( - arkts.factory.createIdentifier('StructBase'), - arkts.nullptr + processEtsScript(node: arkts.EtsScript): arkts.EtsScript { + // const importDecl = arkts.factory.createImportDeclaration( + // arkts.factory.createStringLiteral('example/arkui/runtime'), + // [ + // arkts.factory.createImportSpecifier( + // arkts.factory.createIdentifier('StructBase'), + // arkts.nullptr + // ) + // ], + // arkts.Es2pandaImportKinds.TYPE, + // false + // ) + const interfaceDeclarations = this.context.componentNames.map( + name => arkts.factory.createInterfaceDeclaration( + [], + arkts.factory.createIdentifier(`__Options_${name}`), + arkts.nullptr, + arkts.factory.createBlock([]), + false, + false ) - ], - arkts.Es2pandaImportKinds.TYPE, - false - ) - const interfaceDecl = arkts.factory.createInterfaceDeclaration( - [], - arkts.factory.createIdentifier('__Options_A'), - arkts.nullptr, - arkts.factory.createBlock([]), - false, - false - ) - return arkts.factory.updateEtsScript( - node, - [ - importDecl, - interfaceDecl, - ...node.statements - ] - ) -} + ) + return arkts.factory.updateEtsScript( + node, + [ + // importDecl, + ...interfaceDeclarations, + ...node.statements + ] + ) + } -function processComponent(node: arkts.ClassDeclaration): arkts.ClassDeclaration { - 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('A') - ), - arkts.factory.createTypeReference( - arkts.factory.createIdentifier('__Options_A') - ), - ] + processComponent(node: arkts.ClassDeclaration): 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}`) + ), + ] + ) ) ) ) ) - ) -} + } -export class ComponentTransformer extends AbstractVisitor { - visitor(beforeChildren: arkts.Node): arkts.Node { - const node = this.visitEachChild(beforeChildren) - if (arkts.isEtsScript(node)) { - return processEtsScript(node) + visitor(node: arkts.Node): arkts.Node { + const newNode = this.visitEachChild(node) + if (arkts.isEtsScript(newNode)) { + return this.processEtsScript(newNode) } - if (arkts.isClassDeclaration(node) && isComponent(node)) { - return processComponent(node) + if (arkts.isClassDeclaration(newNode) && this.isComponent(newNode)) { + return this.processComponent(newNode) } - return node + return newNode } } diff --git a/arkoala-arkts/libarkts/examples/src/example-checked-transformer.ts b/arkoala-arkts/libarkts/examples/src/example-checked-transformer.ts index 79186e945..ec0578ffd 100644 --- a/arkoala-arkts/libarkts/examples/src/example-checked-transformer.ts +++ b/arkoala-arkts/libarkts/examples/src/example-checked-transformer.ts @@ -11,6 +11,6 @@ export default function exampleTransformer( userPluginOptions?: TransformerOptions ) { return (node: ts.EtsScript) => { - return new ComponentTransformer().visitor(node) + return new BuilderLambdaTransformer().visitor(node) } } diff --git a/arkoala-arkts/libarkts/src/es2panda.ts b/arkoala-arkts/libarkts/src/es2panda.ts index 6dd5111f0..f6809f972 100644 --- a/arkoala-arkts/libarkts/src/es2panda.ts +++ b/arkoala-arkts/libarkts/src/es2panda.ts @@ -30,9 +30,9 @@ function insertPlugin(state: arkts.Es2pandaContextState): arkts.Node { if (script === undefined) { throwError(`Failed to receive ast from es2panda`) } + console.log(`BEFORE ${stateName(state)}:`) console.log(script.dumpSrc()) - // console.log(script.dumpJson()) const transform = pluginsByState.get(state) transform?.(script) @@ -53,13 +53,25 @@ function invokePlugins(configPath: string, filePath: string ): void { ]) global.context = arkts.createContextFromString(global.config, source, filePath) + // ComponentTransformer + const parsedTransform = insertPlugin(arkts.Es2pandaContextState.ES2PANDA_STATE_PARSED) + const afterParsedSrc = parsedTransform.dumpSrc() + + global.es2panda._DestroyContext(global.context) + const afterParsedScript = arkts.EtsScript.create( + afterParsedSrc, + arkts.Es2pandaContextState.ES2PANDA_STATE_CHECKED + ) - // const _ = insertPlugin(arkts.Es2pandaContextState.ES2PANDA_STATE_PARSED) - const checked = insertPlugin(arkts.Es2pandaContextState.ES2PANDA_STATE_CHECKED) + // BuilderLambdaTransformer + const checkedTransform = insertPlugin(arkts.Es2pandaContextState.ES2PANDA_STATE_CHECKED) + const afterCheckedSrc = checkedTransform.dumpSrc() - // TODO: doesn't work - // global.es2panda._AstNodeRecheck(global.context, checked.originalPeer) - // arkts.proceedToState(arkts.Es2pandaContextState.ES2PANDA_STATE_BIN_GENERATED) + global.es2panda._DestroyContext(global.context) + const afterCheckedScript = arkts.EtsScript.create( + afterParsedSrc, + arkts.Es2pandaContextState.ES2PANDA_STATE_BIN_GENERATED + ) } function loadPlugin(configDir: string, jsonPlugin: any) { -- Gitee From 0d5a2b285624f0743654de6c5549b4f4f0bfa665 Mon Sep 17 00:00:00 2001 From: chernishevvictor Date: Wed, 22 Jan 2025 17:10:37 +0300 Subject: [PATCH 3/3] add superClass for visitor --- arkoala-arkts/libarkts/examples/input/main.sts | 4 ---- arkoala-arkts/libarkts/native/src/bridges.cc | 7 +++++++ arkoala-arkts/libarkts/src/Es2pandaNativeModule.ts | 3 +++ arkoala-arkts/libarkts/src/arkts-api/types.ts | 2 ++ arkoala-arkts/libarkts/src/arkts-api/visitor.ts | 1 + 5 files changed, 13 insertions(+), 4 deletions(-) diff --git a/arkoala-arkts/libarkts/examples/input/main.sts b/arkoala-arkts/libarkts/examples/input/main.sts index 78941dbc0..699f7b369 100644 --- a/arkoala-arkts/libarkts/examples/input/main.sts +++ b/arkoala-arkts/libarkts/examples/input/main.sts @@ -35,7 +35,3 @@ class AnotherComponent { .width(17.0) } } - -function main() {} - -main() diff --git a/arkoala-arkts/libarkts/native/src/bridges.cc b/arkoala-arkts/libarkts/native/src/bridges.cc index 7318b9e27..2b994c0d7 100644 --- a/arkoala-arkts/libarkts/native/src/bridges.cc +++ b/arkoala-arkts/libarkts/native/src/bridges.cc @@ -1,5 +1,12 @@ #include "common.h" +KNativePointer impl_ClassDefinitionSuper(KNativePointer contextPtr, KNativePointer nodePtr) { + auto context = reinterpret_cast(contextPtr); + auto node = reinterpret_cast(nodePtr); + return GetImpl()->ClassDefinitionSuper(context, node); +} +KOALA_INTEROP_2(ClassDefinitionSuper, KNativePointer, KNativePointer, KNativePointer) + KNativePointer impl_CreateTSInterfaceDeclaration( KNativePointer _context, KNativePointerArray _extends, diff --git a/arkoala-arkts/libarkts/src/Es2pandaNativeModule.ts b/arkoala-arkts/libarkts/src/Es2pandaNativeModule.ts index b85911607..f81a62c54 100644 --- a/arkoala-arkts/libarkts/src/Es2pandaNativeModule.ts +++ b/arkoala-arkts/libarkts/src/Es2pandaNativeModule.ts @@ -27,6 +27,9 @@ import { export type KPtrArray = BigUint64Array export class Es2pandaNativeModule { + _ClassDefinitionSuper(context: KPtr, node: KPtr): KPtr { + throw new Error("Not implemented") + } _CreateTSInterfaceDeclaration(_context: KPtr, _extends: KPtrArray, _extendsLen: KInt, _id: KPtr, _typeParams: KPtr, _body: KPtr, _isStatic: KBoolean, _isExternal: KBoolean): KPtr { throw new Error("Not implemented") } diff --git a/arkoala-arkts/libarkts/src/arkts-api/types.ts b/arkoala-arkts/libarkts/src/arkts-api/types.ts index a9db1876f..55b816d6a 100644 --- a/arkoala-arkts/libarkts/src/arkts-api/types.ts +++ b/arkoala-arkts/libarkts/src/arkts-api/types.ts @@ -978,6 +978,7 @@ export class ClassDefinition extends Node { this.name = unpackNonNullableNode(global.es2panda._ClassDefinitionIdent(global.context, this.peer)) this.members = unpackNodeArray(global.es2panda._ClassDefinitionBody(global.context, this.peer)) this.typeParamsDecl = unpackNode(global.es2panda._ClassDefinitionTypeParamsConst(global.context, this.peer)) + this.superClass = unpackNode(global.es2panda._ClassDefinitionSuper(global.context, this.peer)) } static create( @@ -1006,6 +1007,7 @@ export class ClassDefinition extends Node { readonly name: Identifier readonly members: readonly Node[] readonly typeParamsDecl?: TSTypeParameterDeclaration + readonly superClass?: Node } export class ClassStaticBlock extends Node { diff --git a/arkoala-arkts/libarkts/src/arkts-api/visitor.ts b/arkoala-arkts/libarkts/src/arkts-api/visitor.ts index ebf8a5a4c..bef26b172 100644 --- a/arkoala-arkts/libarkts/src/arkts-api/visitor.ts +++ b/arkoala-arkts/libarkts/src/arkts-api/visitor.ts @@ -78,6 +78,7 @@ export function visitEachChild( // TODO: pass through modifiers Es2pandaClassDefinitionModifiers.CLASS_DEFINITION_MODIFIERS_NONE, nodeVisitor(node.typeParamsDecl, visitor), + nodeVisitor(node.superClass, visitor), ) } if (node instanceof arkts.MethodDefinition) { -- Gitee