From 5d5c0c504fcbe32c3df5afd9748bc3736918552e Mon Sep 17 00:00:00 2001 From: Alexander Gorshenev Date: Tue, 4 Feb 2025 13:28:40 +0300 Subject: [PATCH 1/3] More real plugin for the Parsed stage Signed-off-by: Alexander Gorshenev --- arkoala-arkts/arkui/src/sts/arkui.sts | 50 ++++++++++++++----- .../examples/src/component-transformer.ts | 43 +++++++--------- arkoala-arkts/user/arktsconfig-pure-sts.json | 10 ++-- arkoala-arkts/user/src/sts/hello.sts | 37 +++++++------- 4 files changed, 78 insertions(+), 62 deletions(-) diff --git a/arkoala-arkts/arkui/src/sts/arkui.sts b/arkoala-arkts/arkui/src/sts/arkui.sts index 1c2a9a830..e076a0079 100644 --- a/arkoala-arkts/arkui/src/sts/arkui.sts +++ b/arkoala-arkts/arkui/src/sts/arkui.sts @@ -16,7 +16,7 @@ export interface CommonMethod { } export class StructBase { - //@BuilderLambda("instantiateImpl") + @BuilderLambda("instantiateImpl") static $_instantiate, OptionsS> ( factory: () => S, options: OptionsS @@ -35,30 +35,56 @@ export class StructBase { } } +export enum Color { + White, +Red +} + export interface ColumnOptions {} export class ArkColumnComponent {} // An attempt to put down a component export class Column { - @BuilderLambda("instantiateImpl") - @memo static $_instantiate( factory: () => Column, options?: ColumnOptions, content?: () => void ): ArkColumnComponent { - return factory() + instance = factory() + content() + return instance } +} - @memo - static instantiateImpl( - @memo builder: (instance: ArkColumnComponent)=>ArkColumnComponent, - factory: () => Column, - options?: ColumnOptions, - @memo content?: () => void - ) { +export interface ButtonOptions {} +export class ArkButtonComponent {} + +// An attempt to put down a component +export class Button { + static $_instantiate( + factory: () => Button, + options?: ButtonOptions, + content?: () => void + ): ArkButtonComponent { + instance = factory() + content() + return instance + } +} - // ArkStruct(builder, factory, options, style) +export interface TextOptions {} +export class ArkTextComponent {} + +// An attempt to put down a component +export class Text { + static $_instantiate( + factory: () => Text, + options?: TextOptions, + content?: () => void + ): ArkTextComponent { + instance = factory() + content() + return instance } } diff --git a/arkoala-arkts/libarkts/examples/src/component-transformer.ts b/arkoala-arkts/libarkts/examples/src/component-transformer.ts index c90be1ffd..c79727e2f 100644 --- a/arkoala-arkts/libarkts/examples/src/component-transformer.ts +++ b/arkoala-arkts/libarkts/examples/src/component-transformer.ts @@ -19,32 +19,27 @@ import { AbstractVisitor } from "./AbstractVisitor"; export class ComponentTransformer extends AbstractVisitor { private context: { componentNames: string[] } = { componentNames: [] } - 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") + // For now just rewrite any struct + return true } + createImportDeclaration() { + return arkts.factory.createImportDeclaration( + // arkts.factory.createStringLiteral('@ohos.arkui.runtime'), + arkts.factory.createStringLiteral('../../../arkui/src/sts/arkui'), + [ + arkts.factory.createImportSpecifier( + arkts.factory.createIdentifier('StructBase'), + arkts.nullptr + ) + ], + arkts.Es2pandaImportKinds.IMPORT_KINDS_TYPE, + false + ) + } 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( [], @@ -58,7 +53,7 @@ export class ComponentTransformer extends AbstractVisitor { return arkts.factory.updateEtsScript( node, [ - // importDecl, + this.createImportDeclaration(), ...node.statements, ...interfaceDeclarations ] @@ -111,9 +106,7 @@ export class ComponentTransformer extends AbstractVisitor { if (arkts.isEtsScript(newNode)) { return this.processEtsScript(newNode) } - if (arkts.isClassDeclaration(newNode) && this.isComponentClass(newNode) || - arkts.isStructDeclaration(newNode) && this.isComponentStruct(newNode) - ) { + if (arkts.isStructDeclaration(newNode) && this.isComponentStruct(newNode)) { return this.processComponent(newNode) } return newNode diff --git a/arkoala-arkts/user/arktsconfig-pure-sts.json b/arkoala-arkts/user/arktsconfig-pure-sts.json index ad58a8b95..8a930b0f0 100644 --- a/arkoala-arkts/user/arktsconfig-pure-sts.json +++ b/arkoala-arkts/user/arktsconfig-pure-sts.json @@ -4,16 +4,16 @@ "outDir": "build/sts/abc", "baseUrl": ".", "paths": { - "ohos.arkui": ["../arkui/src/sts/arkui.sts"] + "@ohos.arkui": ["../arkui/src/sts/arkui.sts"], + "@ohos.arkui.Button": ["../arkui/src/sts/arkui.sts"], + "@ohos.arkui.Column": ["../arkui/src/sts/arkui.sts"], + "@ohos.arkui.Color": ["../arkui/src/sts/arkui.sts"], + "@ohos.arkui.Text": ["../arkui/src/sts/arkui.sts"] }, "plugins": [ { "transform": "../libarkts/examples/build/src/example-parsed-transformer.js", "stage": "parsed" - }, - { - "transform": "../libarkts/examples/build/src/example-checked-transformer.js", - "stage": "checked" } ] }, diff --git a/arkoala-arkts/user/src/sts/hello.sts b/arkoala-arkts/user/src/sts/hello.sts index 33bb8cbce..40a30643d 100644 --- a/arkoala-arkts/user/src/sts/hello.sts +++ b/arkoala-arkts/user/src/sts/hello.sts @@ -1,28 +1,25 @@ -import { Component } from "ohos.arkui" -import { StructBase } from "ohos.arkui" -import { Column, ColumnOptions } from "ohos.arkui" +import { Text } from "@ohos.arkui.Text" +import { Column, ColumnOptions } from "@ohos.arkui.Column" +import { Button } from "@ohos.arkui.Button" +import { Component, State, Entry } from "@ohos.arkui" +import { Color } from "@ohos.arkui.Color" +@Entry @Component -struct StsTestComponent { +struct MyStateSample { + @State count: Color = Color.White build() { - // StsChildComponent() - StsChildComponent.$_instantiate( - ()=> new StsChildComponent(), - {} as __Options_StsChildComponent - ) - } -} - -@Component -struct StsChildComponent { - build() { - // Column() {} + Column({} as ColumnOptions) { /* - Column.$_instantiate( - () => new Column(), - {} as ColumnOptions, - ) {} + Text("") {} + .fontColor(this.count) + Button('change') + .onClick(() => { + this.count = Color.Red + }) */ + } } } + -- Gitee From 95c9d101dc8730f6ebca59add7c607746ed91616 Mon Sep 17 00:00:00 2001 From: Alexander Gorshenev Date: Tue, 4 Feb 2025 15:14:45 +0300 Subject: [PATCH 2/3] more Signed-off-by: Alexander Gorshenev --- arkoala-arkts/libarkts/examples/input/main.sts | 9 +-------- .../examples/src/builder-lambda-transformer.ts | 11 +++++------ 2 files changed, 6 insertions(+), 14 deletions(-) diff --git a/arkoala-arkts/libarkts/examples/input/main.sts b/arkoala-arkts/libarkts/examples/input/main.sts index 2d248dd46..ef366ef8b 100644 --- a/arkoala-arkts/libarkts/examples/input/main.sts +++ b/arkoala-arkts/libarkts/examples/input/main.sts @@ -1,16 +1,9 @@ import { Component } from "./library" -/* Library code */ -class StructBase {} - @interface BuilderLambda { value: string } -/* User code */ -// @interface __Options_MyComponent {} -// @interface __Options_AnotherComponent {} - @Component struct MyComponent { @BuilderLambda("instantiateImpl") @@ -19,7 +12,7 @@ struct MyComponent { return instance } - static instantiateImpl(builder: (instance: MyComponent)=>MyComponent, factory: () => MyComponent) { + static instantiateImpl(builder: (instance: MyComponent)=>MyComponent, factory: () => MyComponent): void { const instance = factory() builder(instance) } diff --git a/arkoala-arkts/libarkts/examples/src/builder-lambda-transformer.ts b/arkoala-arkts/libarkts/examples/src/builder-lambda-transformer.ts index e0962ede5..f4e8143dd 100644 --- a/arkoala-arkts/libarkts/examples/src/builder-lambda-transformer.ts +++ b/arkoala-arkts/libarkts/examples/src/builder-lambda-transformer.ts @@ -30,13 +30,12 @@ function getLambdaArg(lambdaBody: arkts.Node): arkts.ArrowFunctionExpression { const param = arkts.factory.createParameterDeclaration( arkts.factory.createIdentifier( builderLambdaInstanceName, - undefined // TODO: it should be the return type of the function annotated with the @BuilderLambda - // arkts.factory.createTypeReference( - // arkts.factory.createIdentifier( - // 'MyComponent' - // ) - // ) + arkts.factory.createTypeReference( + arkts.factory.createIdentifier( + 'MyComponent' + ) + ) ), undefined ) -- Gitee From bbd7debabeb73a6b70df14443245f46bfedc5e49 Mon Sep 17 00:00:00 2001 From: Alexander Gorshenev Date: Tue, 4 Feb 2025 15:15:59 +0300 Subject: [PATCH 3/3] more Signed-off-by: Alexander Gorshenev --- arkoala-arkts/user/src/sts/hello.sts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/arkoala-arkts/user/src/sts/hello.sts b/arkoala-arkts/user/src/sts/hello.sts index 40a30643d..009e71808 100644 --- a/arkoala-arkts/user/src/sts/hello.sts +++ b/arkoala-arkts/user/src/sts/hello.sts @@ -7,15 +7,15 @@ import { Color } from "@ohos.arkui.Color" @Entry @Component struct MyStateSample { - @State count: Color = Color.White + @State color: Color = Color.White build() { Column({} as ColumnOptions) { /* Text("") {} - .fontColor(this.count) + .fontColor(this.color) Button('change') .onClick(() => { - this.count = Color.Red + this.color = Color.Red }) */ } -- Gitee