diff --git a/arkoala-arkts/arkui/src/sts/arkui.sts b/arkoala-arkts/arkui/src/sts/arkui.sts index 1c2a9a8304cdc46537b642a1bd6a7d30c6a0c89a..e076a007961999eda7a81513006f2a041f22c9f3 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/input/main.sts b/arkoala-arkts/libarkts/examples/input/main.sts index 2d248dd46e326706c990e6817f19b2fc921a12dc..ef366ef8bcd8641ea9d493d263ffc338d581ce93 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 e0962ede5d5f48a3facb32573623e70e6ca36113..f4e8143ddac3c324775fa9d4303691e6a8d65874 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 ) diff --git a/arkoala-arkts/libarkts/examples/src/component-transformer.ts b/arkoala-arkts/libarkts/examples/src/component-transformer.ts index c90be1ffd77cec2cfea63a1124484324d8c0aca5..c79727e2fabc3f213f2defe63bd239d4187b70b9 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 ad58a8b95eadd5e7c56a393942b3c5d6ce586602..8a930b0f02dc4fb1d57008d23ca521710a0e6401 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 33bb8cbce1e2039eae549b93dcbccf9b72ef9277..009e718088d80db99f1166c08cfc7f97c67e34a2 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 color: 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.color) + Button('change') + .onClick(() => { + this.color = Color.Red + }) */ + } } } +