From c3d7df69e93e79c440b7f01760f115969b04f466 Mon Sep 17 00:00:00 2001 From: Igor Loginov Date: Tue, 15 Jul 2025 11:06:16 +0300 Subject: [PATCH 01/11] Preffered return type --- ui2abc/libarkts/generator/options.json5 | 13 +++++++++++++ ui2abc/libarkts/native/src/common.cc | 17 +++++++++++++++++ ui2abc/libarkts/src/Es2pandaNativeModule.ts | 6 ++++++ .../src/arkts-api/InferVoidReturnType.ts | 1 + .../arkts-api/node-utilities/ScriptFunction.ts | 10 +++++++++- .../src/arkts-api/utilities/extensions.ts | 13 +++++++++++-- ui2abc/libarkts/src/arkts-api/visitor.ts | 3 ++- ui2abc/libarkts/src/reexport-for-generated.ts | 2 ++ .../test/arkts-api/functions/create.test.ts | 2 ++ .../arkts-api/import-export/import.test.ts | 1 + .../arkts-api/recheck/constructor/index.ts | 3 ++- .../recheck/exports/create-class/index.ts | 1 + .../recheck/imports/recursive/index.ts | 3 ++- .../recheck/simple/add-class-method/index.ts | 1 + .../recheck/simple/add-variable/index.ts | 1 + .../test/arkts-api/recheck/this/index.ts | 3 ++- ui2abc/memo-plugin/src/FunctionTransformer.ts | 2 ++ ui2abc/memo-plugin/src/MemoFactory.ts | 1 + ui2abc/memo-plugin/src/SignatureTransformer.ts | 3 ++- .../src/builder-lambda-transformer.ts | 6 ++++-- ui2abc/ui-plugins/src/class-transformer.ts | 12 ++++++++---- ui2abc/ui-plugins/src/component-transformer.ts | 16 +++++++++++----- .../src/instantiate-factory-helper.ts | 3 ++- ui2abc/ui-plugins/src/property-transformers.ts | 18 ++++++++++++------ 24 files changed, 115 insertions(+), 26 deletions(-) diff --git a/ui2abc/libarkts/generator/options.json5 b/ui2abc/libarkts/generator/options.json5 index 80bd512f7..63c73e71a 100644 --- a/ui2abc/libarkts/generator/options.json5 +++ b/ui2abc/libarkts/generator/options.json5 @@ -277,6 +277,19 @@ definition: "extension_ETSModuleGetNamespaceFlag", } ] + }, + { + interface: "ScriptFunction", + methods: [ + { + name: "getPrefferedTypePointer", + definition: "extension_ScriptFunctionGetPrefferedTypePointer", + }, + { + name: "setPrefferedTypePointer", + definition: "extension_ScriptFunctionSetPrefferedTypePointer", + }, + ] } ], } diff --git a/ui2abc/libarkts/native/src/common.cc b/ui2abc/libarkts/native/src/common.cc index 1cbfddc79..f6a99c815 100644 --- a/ui2abc/libarkts/native/src/common.cc +++ b/ui2abc/libarkts/native/src/common.cc @@ -269,6 +269,23 @@ KInt impl_IdentifierIdentifierFlags(KNativePointer contextPtr, KNativePointer no } KOALA_INTEROP_2(IdentifierIdentifierFlags, KInt, KNativePointer, KNativePointer) +KNativePointer impl_TypedPreferredType(KNativePointer context, KNativePointer node) +{ + auto _context = reinterpret_cast(context); + auto _node = reinterpret_cast(node); + return GetImpl()->TypedPreferredTypeConst(_context, _node); +} +KOALA_INTEROP_2(TypedPreferredType, KNativePointer, KNativePointer, KNativePointer) + +KNativePointer impl_TypedSetPreferredType(KNativePointer context, KNativePointer node, KNativePointer type) +{ + auto _context = reinterpret_cast(context); + auto _node = reinterpret_cast(node); + auto _type = reinterpret_cast(type); + return GetImpl()->TypedSetPreferredType(_context, _node, _type); +} +KOALA_INTEROP_3(TypedSetPreferredType, KNativePointer, KNativePointer, KNativePointer, KNativePointer) + /* Improve: NOT FROM API (shouldn't be there) ----------------------------------------------------------------------------------------------------------------------------- diff --git a/ui2abc/libarkts/src/Es2pandaNativeModule.ts b/ui2abc/libarkts/src/Es2pandaNativeModule.ts index 7cc7406dc..8c2904ab7 100644 --- a/ui2abc/libarkts/src/Es2pandaNativeModule.ts +++ b/ui2abc/libarkts/src/Es2pandaNativeModule.ts @@ -162,6 +162,12 @@ export class Es2pandaNativeModule { _OptionsArkTsConfig(context: KNativePointer, options: KNativePointer): KNativePointer { throw new Error("Not implemented"); } + _TypedPreferredType(context: KNativePointer, node: KNativePointer): KNativePointer { + throw new Error("Not implemented"); + } + _TypedSetPreferredType(context: KNativePointer, node: KNativePointer, type: KNativePointer): KNativePointer { + throw new Error("Not implemented"); + } // From koala-wrapper _ClassVariableDeclaration(context: KNativePointer, classInstance: KNativePointer): KNativePointer { diff --git a/ui2abc/libarkts/src/arkts-api/InferVoidReturnType.ts b/ui2abc/libarkts/src/arkts-api/InferVoidReturnType.ts index 25358cc62..b39b96c03 100644 --- a/ui2abc/libarkts/src/arkts-api/InferVoidReturnType.ts +++ b/ui2abc/libarkts/src/arkts-api/InferVoidReturnType.ts @@ -73,6 +73,7 @@ class InferVoidReturnType extends AbstractVisitor { result.modifierFlags, result.id, result.annotations, + result.getPrefferedTypePointer(), ) } } diff --git a/ui2abc/libarkts/src/arkts-api/node-utilities/ScriptFunction.ts b/ui2abc/libarkts/src/arkts-api/node-utilities/ScriptFunction.ts index b188dcb45..d89ec5bb5 100644 --- a/ui2abc/libarkts/src/arkts-api/node-utilities/ScriptFunction.ts +++ b/ui2abc/libarkts/src/arkts-api/node-utilities/ScriptFunction.ts @@ -26,6 +26,7 @@ import { AstNode } from "../peers/AstNode" import { Es2pandaModifierFlags, Es2pandaScriptFunctionFlags } from "../../generated/Es2pandaEnums" import { isSameNativeObject } from "../peers/ArktsObject" import { updateNodeByNode } from "../utilities/private" +import { KNativePointer } from "@koalaui/interop" export function createScriptFunction( databody: AstNode | undefined, @@ -37,6 +38,7 @@ export function createScriptFunction( dataflags: Es2pandaModifierFlags, ident: Identifier | undefined, annotations: readonly AnnotationUsage[] | undefined, + prefferedTypePointer: KNativePointer | undefined, ) { const res = ScriptFunction.createScriptFunction( databody, @@ -55,6 +57,9 @@ export function createScriptFunction( if (annotations) { res.setAnnotations(annotations) } + if (prefferedTypePointer) { + res.setPrefferedTypePointer(prefferedTypePointer) + } return res } @@ -69,6 +74,7 @@ export function updateScriptFunction( dataflags: Es2pandaModifierFlags, ident: Identifier | undefined, annotations: readonly AnnotationUsage[] | undefined, + prefferedTypePointer: KNativePointer | undefined, ) { if (isSameNativeObject(databody, original.body) && isSameNativeObject(typeParams, original.typeParams) @@ -79,6 +85,7 @@ export function updateScriptFunction( && isSameNativeObject(dataflags, original.modifierFlags) && isSameNativeObject(ident, original.id) && isSameNativeObject(annotations, original.annotations) + && prefferedTypePointer == original.getPrefferedTypePointer() ) { return original } @@ -92,7 +99,8 @@ export function updateScriptFunction( datafuncFlags, dataflags, ident, - annotations + annotations, + prefferedTypePointer, ), original ) diff --git a/ui2abc/libarkts/src/arkts-api/utilities/extensions.ts b/ui2abc/libarkts/src/arkts-api/utilities/extensions.ts index fa5adad69..fb65fd5f5 100644 --- a/ui2abc/libarkts/src/arkts-api/utilities/extensions.ts +++ b/ui2abc/libarkts/src/arkts-api/utilities/extensions.ts @@ -15,10 +15,11 @@ import type { ETSModule, - MethodDefinition + MethodDefinition, + ScriptFunction } from "../../generated" import { Es2pandaModuleFlag } from "../../generated/Es2pandaEnums" -import { global } from "../../reexport-for-generated" +import { global, KNativePointer } from "../../reexport-for-generated" export function extension_ETSModuleGetNamespaceFlag(this: ETSModule): Es2pandaModuleFlag { return (this.isETSScript ? Es2pandaModuleFlag.MODULE_FLAG_ETSSCRIPT : 0) @@ -46,3 +47,11 @@ export function extension_MethodDefinitionOnUpdate(this: MethodDefinition, origi this.setBaseOverloadMethod(originalBase) } } + +export function extension_ScriptFunctionGetPrefferedTypePointer(this: ScriptFunction): KNativePointer { + return global.es2panda._TypedPreferredType(global.context, this.peer) +} + +export function extension_ScriptFunctionSetPrefferedTypePointer(this: ScriptFunction, typePointer: KNativePointer): KNativePointer { + return global.es2panda._TypedSetPreferredType(global.context, this.peer, typePointer) +} diff --git a/ui2abc/libarkts/src/arkts-api/visitor.ts b/ui2abc/libarkts/src/arkts-api/visitor.ts index 9fa9379a5..f4de656e4 100644 --- a/ui2abc/libarkts/src/arkts-api/visitor.ts +++ b/ui2abc/libarkts/src/arkts-api/visitor.ts @@ -247,7 +247,8 @@ export function visitEachChild( node.flags, node.modifierFlags, nodeVisitor(node.id, visitor), - nodesVisitor(node.annotations, visitor) + nodesVisitor(node.annotations, visitor), + node.getPrefferedTypePointer(), ) } if (isETSParameterExpression(node)) { diff --git a/ui2abc/libarkts/src/reexport-for-generated.ts b/ui2abc/libarkts/src/reexport-for-generated.ts index 22b9296eb..b5ad4732f 100644 --- a/ui2abc/libarkts/src/reexport-for-generated.ts +++ b/ui2abc/libarkts/src/reexport-for-generated.ts @@ -35,4 +35,6 @@ export { extension_ETSModuleGetNamespaceFlag, extension_MethodDefinitionOnUpdate, extension_MethodDefinitionSetChildrenParentPtr, + extension_ScriptFunctionGetPrefferedTypePointer, + extension_ScriptFunctionSetPrefferedTypePointer, } from "./arkts-api/utilities/extensions" diff --git a/ui2abc/libarkts/test/arkts-api/functions/create.test.ts b/ui2abc/libarkts/test/arkts-api/functions/create.test.ts index bc2fdaa9c..34ab3b077 100644 --- a/ui2abc/libarkts/test/arkts-api/functions/create.test.ts +++ b/ui2abc/libarkts/test/arkts-api/functions/create.test.ts @@ -70,6 +70,7 @@ suite(util.basename(__filename), () => { arkts.Es2pandaModifierFlags.MODIFIER_FLAGS_PUBLIC | arkts.Es2pandaModifierFlags.MODIFIER_FLAGS_STATIC, arkts.factory.createIdentifier("foo"), undefined, + undefined, ) const funcDecl = @@ -208,6 +209,7 @@ suite(util.basename(__filename), () => { arkts.Es2pandaModifierFlags.MODIFIER_FLAGS_PUBLIC | arkts.Es2pandaModifierFlags.MODIFIER_FLAGS_STATIC, arkts.factory.createIdentifier("foo"), undefined, + undefined, ) const funcDecl = diff --git a/ui2abc/libarkts/test/arkts-api/import-export/import.test.ts b/ui2abc/libarkts/test/arkts-api/import-export/import.test.ts index f79f6ea8d..7dd82ef7a 100644 --- a/ui2abc/libarkts/test/arkts-api/import-export/import.test.ts +++ b/ui2abc/libarkts/test/arkts-api/import-export/import.test.ts @@ -198,6 +198,7 @@ suite(util.basename(__filename), () => { scriptFunction.modifierFlags, scriptFunction.id!, undefined, + undefined, ) const newFuncDecl = diff --git a/ui2abc/libarkts/test/arkts-api/recheck/constructor/index.ts b/ui2abc/libarkts/test/arkts-api/recheck/constructor/index.ts index 52b9b2e2e..023a7ebcf 100644 --- a/ui2abc/libarkts/test/arkts-api/recheck/constructor/index.ts +++ b/ui2abc/libarkts/test/arkts-api/recheck/constructor/index.ts @@ -40,7 +40,8 @@ class ConstructorWithOverload extends arkts.AbstractVisitor { node.flags, node.modifierFlags, node.id, - node.annotations + node.annotations, + node.getPrefferedTypePointer(), ) } return node diff --git a/ui2abc/libarkts/test/arkts-api/recheck/exports/create-class/index.ts b/ui2abc/libarkts/test/arkts-api/recheck/exports/create-class/index.ts index ad9b79316..caabbba9f 100644 --- a/ui2abc/libarkts/test/arkts-api/recheck/exports/create-class/index.ts +++ b/ui2abc/libarkts/test/arkts-api/recheck/exports/create-class/index.ts @@ -112,6 +112,7 @@ export function addUseImportClassSameFileAndCreateClass(program: arkts.Program, arkts.Es2pandaModifierFlags.MODIFIER_FLAGS_NONE, arkts.factory.createIdentifier("constructor"), [], + undefined, ) ), arkts.Es2pandaModifierFlags.MODIFIER_FLAGS_CONSTRUCTOR, diff --git a/ui2abc/libarkts/test/arkts-api/recheck/imports/recursive/index.ts b/ui2abc/libarkts/test/arkts-api/recheck/imports/recursive/index.ts index 43a9433ed..2b82b8039 100644 --- a/ui2abc/libarkts/test/arkts-api/recheck/imports/recursive/index.ts +++ b/ui2abc/libarkts/test/arkts-api/recheck/imports/recursive/index.ts @@ -39,7 +39,8 @@ class InsertParameter extends arkts.AbstractVisitor { node.flags, node.modifierFlags, node.id, - node.annotations + node.annotations, + node.getPrefferedTypePointer(), ) } return node diff --git a/ui2abc/libarkts/test/arkts-api/recheck/simple/add-class-method/index.ts b/ui2abc/libarkts/test/arkts-api/recheck/simple/add-class-method/index.ts index 38d3ebcdc..641239af3 100644 --- a/ui2abc/libarkts/test/arkts-api/recheck/simple/add-class-method/index.ts +++ b/ui2abc/libarkts/test/arkts-api/recheck/simple/add-class-method/index.ts @@ -46,6 +46,7 @@ export function addClassMethod(node: arkts.ClassDefinition) { arkts.Es2pandaModifierFlags.MODIFIER_FLAGS_PUBLIC, arkts.factory.createIdentifier("g"), undefined, + undefined, ) ), arkts.Es2pandaModifierFlags.MODIFIER_FLAGS_PUBLIC, diff --git a/ui2abc/libarkts/test/arkts-api/recheck/simple/add-variable/index.ts b/ui2abc/libarkts/test/arkts-api/recheck/simple/add-variable/index.ts index fd15fbbd2..86b092ecf 100644 --- a/ui2abc/libarkts/test/arkts-api/recheck/simple/add-variable/index.ts +++ b/ui2abc/libarkts/test/arkts-api/recheck/simple/add-variable/index.ts @@ -76,6 +76,7 @@ export function addVariableDeclaration(node: arkts.ClassDefinition) { func.modifierFlags, func.id, func.annotations, + func.getPrefferedTypePointer(), ), ), node.modifierFlags, diff --git a/ui2abc/libarkts/test/arkts-api/recheck/this/index.ts b/ui2abc/libarkts/test/arkts-api/recheck/this/index.ts index 65a35d875..7ad6287bd 100644 --- a/ui2abc/libarkts/test/arkts-api/recheck/this/index.ts +++ b/ui2abc/libarkts/test/arkts-api/recheck/this/index.ts @@ -38,7 +38,8 @@ class AddThisReference extends arkts.AbstractVisitor { node.flags, node.modifierFlags, node.id, - node.annotations + node.annotations, + node.getPrefferedTypePointer(), ) } return node diff --git a/ui2abc/memo-plugin/src/FunctionTransformer.ts b/ui2abc/memo-plugin/src/FunctionTransformer.ts index 9cd7fd900..d266b3866 100644 --- a/ui2abc/memo-plugin/src/FunctionTransformer.ts +++ b/ui2abc/memo-plugin/src/FunctionTransformer.ts @@ -209,6 +209,7 @@ export class FunctionTransformer extends arkts.AbstractVisitor { scriptFunction.modifierFlags, scriptFunction.id, scriptFunction.annotations, + scriptFunction.getPrefferedTypePointer(), ) } @@ -245,6 +246,7 @@ export class FunctionTransformer extends arkts.AbstractVisitor { scriptFunction.modifierFlags, scriptFunction.id, scriptFunction.annotations, + scriptFunction.getPrefferedTypePointer(), ) } diff --git a/ui2abc/memo-plugin/src/MemoFactory.ts b/ui2abc/memo-plugin/src/MemoFactory.ts index 234d8a05a..2926254bc 100644 --- a/ui2abc/memo-plugin/src/MemoFactory.ts +++ b/ui2abc/memo-plugin/src/MemoFactory.ts @@ -355,6 +355,7 @@ export class factory { arkts.Es2pandaModifierFlags.MODIFIER_FLAGS_NONE, undefined, undefined, + undefined, ) ) } diff --git a/ui2abc/memo-plugin/src/SignatureTransformer.ts b/ui2abc/memo-plugin/src/SignatureTransformer.ts index 74a91109b..3678659a5 100644 --- a/ui2abc/memo-plugin/src/SignatureTransformer.ts +++ b/ui2abc/memo-plugin/src/SignatureTransformer.ts @@ -61,7 +61,8 @@ export class SignatureTransformer extends arkts.AbstractVisitor { node.flags, node.modifierFlags, node.id, - node.annotations + node.annotations, + node.getPrefferedTypePointer(), ) } if (arkts.isETSFunctionType(node)) { diff --git a/ui2abc/ui-plugins/src/builder-lambda-transformer.ts b/ui2abc/ui-plugins/src/builder-lambda-transformer.ts index 204127884..59f408c8a 100644 --- a/ui2abc/ui-plugins/src/builder-lambda-transformer.ts +++ b/ui2abc/ui-plugins/src/builder-lambda-transformer.ts @@ -169,7 +169,8 @@ function createInstanceLambda( arkts.Es2pandaScriptFunctionFlags.SCRIPT_FUNCTION_FLAGS_ARROW, arkts.Es2pandaModifierFlags.MODIFIER_FLAGS_NONE, undefined, - undefined + undefined, + undefined, ) ) } @@ -387,7 +388,8 @@ function transformComponentBuilder( func.flags, func.modifierFlags, node.id, - newAnnotations + newAnnotations, + func.getPrefferedTypePointer(), ) const result = arkts.factory.updateMethodDefinition( diff --git a/ui2abc/ui-plugins/src/class-transformer.ts b/ui2abc/ui-plugins/src/class-transformer.ts index 44f2faa7f..aad1f2e8e 100644 --- a/ui2abc/ui-plugins/src/class-transformer.ts +++ b/ui2abc/ui-plugins/src/class-transformer.ts @@ -185,7 +185,8 @@ export class ClassTransformer extends arkts.AbstractVisitor { method.function.flags, method.function.modifierFlags, method.function.id, - method.function.annotations + method.function.annotations, + method.function.getPrefferedTypePointer(), ) ), method.modifierFlags, @@ -275,7 +276,8 @@ function createGetterSetter(property: arkts.ClassProperty, arkts.Es2pandaScriptFunctionFlags.SCRIPT_FUNCTION_FLAGS_METHOD | arkts.Es2pandaScriptFunctionFlags.SCRIPT_FUNCTION_FLAGS_GETTER, arkts.Es2pandaModifierFlags.MODIFIER_FLAGS_PUBLIC, arkts.factory.createIdentifier(name), - [] + [], + undefined, ) const setterFunction = arkts.factory.createScriptFunction( @@ -309,7 +311,8 @@ function createGetterSetter(property: arkts.ClassProperty, arkts.Es2pandaScriptFunctionFlags.SCRIPT_FUNCTION_FLAGS_METHOD | arkts.Es2pandaScriptFunctionFlags.SCRIPT_FUNCTION_FLAGS_SETTER | arkts.Es2pandaScriptFunctionFlags.SCRIPT_FUNCTION_FLAGS_OVERLOAD, arkts.Es2pandaModifierFlags.MODIFIER_FLAGS_PUBLIC, arkts.factory.createIdentifier(name), - [] + [], + undefined, ) let setter = arkts.factory.createMethodDefinition( @@ -446,7 +449,8 @@ function createMethodDefinition(methodName: string, arkts.Es2pandaScriptFunctionFlags.SCRIPT_FUNCTION_FLAGS_METHOD, arkts.Es2pandaModifierFlags.MODIFIER_FLAGS_PUBLIC, arkts.factory.createIdentifier(methodName), - [] + [], + undefined, ) ), arkts.Es2pandaModifierFlags.MODIFIER_FLAGS_PUBLIC diff --git a/ui2abc/ui-plugins/src/component-transformer.ts b/ui2abc/ui-plugins/src/component-transformer.ts index 5999ff0f3..c7110a372 100644 --- a/ui2abc/ui-plugins/src/component-transformer.ts +++ b/ui2abc/ui-plugins/src/component-transformer.ts @@ -306,7 +306,8 @@ export class ComponentTransformer extends arkts.AbstractVisitor { arkts.Es2pandaScriptFunctionFlags.SCRIPT_FUNCTION_FLAGS_METHOD, arkts.Es2pandaModifierFlags.MODIFIER_FLAGS_PROTECTED, arkts.factory.createIdentifier(methodName), - [] + [], + undefined, ) ), arkts.Es2pandaModifierFlags.MODIFIER_FLAGS_PROTECTED, @@ -387,7 +388,8 @@ export class ComponentTransformer extends arkts.AbstractVisitor { false ) ]) - ] + ], + undefined, ) ), arkts.Es2pandaModifierFlags.MODIFIER_FLAGS_STATIC, @@ -447,7 +449,8 @@ export class ComponentTransformer extends arkts.AbstractVisitor { scriptFunction.flags, scriptFunction.modifierFlags, arkts.factory.createIdentifier(CustomComponentNames.COMPONENT_BUILD), - [annotation(InternalAnnotations.MEMO)] + [annotation(InternalAnnotations.MEMO)], + undefined, ) const modifiers: arkts.Es2pandaModifierFlags = isDeclaration ? arkts.Es2pandaModifierFlags.MODIFIER_FLAGS_ABSTRACT @@ -579,6 +582,7 @@ export class ComponentTransformer extends arkts.AbstractVisitor { arkts.Es2pandaModifierFlags.MODIFIER_FLAGS_PUBLIC, arkts.factory.createIdentifier("entry"), [annotation(InternalAnnotations.MEMO)], + undefined, ), ), arkts.Es2pandaModifierFlags.MODIFIER_FLAGS_PUBLIC, @@ -642,7 +646,8 @@ function createVoidMethod(methodName: string, parameters: readonly arkts.Express arkts.Es2pandaScriptFunctionFlags.SCRIPT_FUNCTION_FLAGS_METHOD, arkts.Es2pandaModifierFlags.MODIFIER_FLAGS_PROTECTED, arkts.factory.createIdentifier(methodName), - [] + [], + undefined, ) ), arkts.Es2pandaModifierFlags.MODIFIER_FLAGS_PROTECTED, @@ -668,7 +673,8 @@ function createTrueMethod(methodName: string): arkts.MethodDefinition { arkts.Es2pandaScriptFunctionFlags.SCRIPT_FUNCTION_FLAGS_METHOD, arkts.Es2pandaModifierFlags.MODIFIER_FLAGS_PROTECTED, arkts.factory.createIdentifier(methodName), - [] + [], + undefined, ) ), arkts.Es2pandaModifierFlags.MODIFIER_FLAGS_PROTECTED, diff --git a/ui2abc/ui-plugins/src/instantiate-factory-helper.ts b/ui2abc/ui-plugins/src/instantiate-factory-helper.ts index 18a918e77..b289a5f44 100644 --- a/ui2abc/ui-plugins/src/instantiate-factory-helper.ts +++ b/ui2abc/ui-plugins/src/instantiate-factory-helper.ts @@ -52,7 +52,8 @@ function lambdaReturnFilter(node: arkts.AstNode): arkts.AstNode { node.flags, node.modifierFlags, node.id, - node.annotations + node.annotations, + undefined, ) } diff --git a/ui2abc/ui-plugins/src/property-transformers.ts b/ui2abc/ui-plugins/src/property-transformers.ts index 29c6d241b..e7ad19179 100644 --- a/ui2abc/ui-plugins/src/property-transformers.ts +++ b/ui2abc/ui-plugins/src/property-transformers.ts @@ -116,7 +116,8 @@ function createWrappedProperty( arkts.Es2pandaScriptFunctionFlags.SCRIPT_FUNCTION_FLAGS_METHOD | arkts.Es2pandaScriptFunctionFlags.SCRIPT_FUNCTION_FLAGS_GETTER, arkts.Es2pandaModifierFlags.MODIFIER_FLAGS_PUBLIC, arkts.factory.createIdentifier(name), - [] + [], + undefined, ) const setterStatements: arkts.Statement[] = [ @@ -162,7 +163,8 @@ function createWrappedProperty( arkts.Es2pandaScriptFunctionFlags.SCRIPT_FUNCTION_FLAGS_METHOD | arkts.Es2pandaScriptFunctionFlags.SCRIPT_FUNCTION_FLAGS_SETTER | arkts.Es2pandaScriptFunctionFlags.SCRIPT_FUNCTION_FLAGS_OVERLOAD, arkts.Es2pandaModifierFlags.MODIFIER_FLAGS_PUBLIC, arkts.factory.createIdentifier(name), - [] + [], + undefined, ) let setter = arkts.factory.createMethodDefinition( @@ -213,7 +215,8 @@ function addTrackablePropertyTo( arkts.Es2pandaScriptFunctionFlags.SCRIPT_FUNCTION_FLAGS_ARROW, arkts.Es2pandaModifierFlags.MODIFIER_FLAGS_NONE, undefined, - undefined + undefined, + undefined, ) ) ) @@ -236,7 +239,8 @@ function addTrackablePropertyTo( arkts.Es2pandaScriptFunctionFlags.SCRIPT_FUNCTION_FLAGS_METHOD | arkts.Es2pandaScriptFunctionFlags.SCRIPT_FUNCTION_FLAGS_GETTER, arkts.Es2pandaModifierFlags.MODIFIER_FLAGS_PUBLIC, arkts.factory.createIdentifier(propertyName), - [] + [], + undefined, ) const setterFunction = arkts.factory.createScriptFunction( arkts.factory.createBlockStatement([ @@ -255,7 +259,8 @@ function addTrackablePropertyTo( arkts.Es2pandaScriptFunctionFlags.SCRIPT_FUNCTION_FLAGS_METHOD | arkts.Es2pandaScriptFunctionFlags.SCRIPT_FUNCTION_FLAGS_SETTER | arkts.Es2pandaScriptFunctionFlags.SCRIPT_FUNCTION_FLAGS_OVERLOAD, arkts.Es2pandaModifierFlags.MODIFIER_FLAGS_PUBLIC, arkts.factory.createIdentifier(propertyName), - [] + [], + undefined, ) const setter = arkts.factory.createMethodDefinition( arkts.Es2pandaMethodDefinitionKind.METHOD_DEFINITION_KIND_SET, @@ -543,7 +548,8 @@ function callStatementsOnce(statements: arkts.Statement[]): arkts.Statement { arkts.Es2pandaScriptFunctionFlags.SCRIPT_FUNCTION_FLAGS_ARROW, arkts.Es2pandaModifierFlags.MODIFIER_FLAGS_NONE, undefined, - undefined + undefined, + undefined, ) return arkts.factory.createExpressionStatement( arkts.factory.createCallExpression( -- Gitee From 20dc9574ecea4e37a43231dfd98bb633eb6175f8 Mon Sep 17 00:00:00 2001 From: Igor Loginov Date: Tue, 15 Jul 2025 15:43:06 +0300 Subject: [PATCH 02/11] works --- ui2abc/libarkts/generator/options.json5 | 8 ++-- ui2abc/libarkts/native/src/bridges.cc | 44 +++++++++++++++++++ ui2abc/libarkts/native/src/common.cc | 18 +------- ui2abc/libarkts/src/Es2pandaNativeModule.ts | 14 +++++- .../src/arkts-api/InferVoidReturnType.ts | 2 +- .../node-utilities/ScriptFunction.ts | 12 ++--- .../src/arkts-api/utilities/extensions.ts | 8 ++-- ui2abc/libarkts/src/arkts-api/visitor.ts | 2 +- ui2abc/libarkts/src/reexport-for-generated.ts | 4 +- .../arkts-api/recheck/constructor/index.ts | 2 +- .../recheck/imports/recursive/index.ts | 2 +- .../recheck/simple/add-variable/index.ts | 2 +- .../test/arkts-api/recheck/this/index.ts | 2 +- ui2abc/memo-plugin/src/FunctionTransformer.ts | 4 +- .../memo-plugin/src/SignatureTransformer.ts | 2 +- .../src/builder-lambda-transformer.ts | 2 +- ui2abc/ui-plugins/src/class-transformer.ts | 2 +- 17 files changed, 84 insertions(+), 46 deletions(-) diff --git a/ui2abc/libarkts/generator/options.json5 b/ui2abc/libarkts/generator/options.json5 index 63c73e71a..55c00f670 100644 --- a/ui2abc/libarkts/generator/options.json5 +++ b/ui2abc/libarkts/generator/options.json5 @@ -282,12 +282,12 @@ interface: "ScriptFunction", methods: [ { - name: "getPrefferedTypePointer", - definition: "extension_ScriptFunctionGetPrefferedTypePointer", + name: "getPrefferedReturnTypePointer", + definition: "extension_ScriptFunctionGetPrefferedReturnTypePointer", }, { - name: "setPrefferedTypePointer", - definition: "extension_ScriptFunctionSetPrefferedTypePointer", + name: "setPrefferedReturnTypePointer", + definition: "extension_ScriptFunctionSetPrefferedReturnTypePointer", }, ] } diff --git a/ui2abc/libarkts/native/src/bridges.cc b/ui2abc/libarkts/native/src/bridges.cc index cccb117e2..6b8acb9ff 100644 --- a/ui2abc/libarkts/native/src/bridges.cc +++ b/ui2abc/libarkts/native/src/bridges.cc @@ -402,6 +402,50 @@ void impl_DestroyGlobalContext(KNativePointer globalContextPtr) { } KOALA_INTEROP_V1(DestroyGlobalContext, KNativePointer) +// These "Type" bridges are related to checker namespace in es2panda, so work with them carefully +KNativePointer impl_ScriptFunctionGetPreferredReturnType(KNativePointer context, KNativePointer node) +{ + auto _context = reinterpret_cast(context); + auto _node = reinterpret_cast(node); + return GetImpl()->ScriptFunctionGetPreferredReturnType(_context, _node); +} +KOALA_INTEROP_2(ScriptFunctionGetPreferredReturnType, KNativePointer, KNativePointer, KNativePointer) + +void impl_ScriptFunctionSetPreferredReturnType(KNativePointer context, KNativePointer node, KNativePointer type) +{ + auto _context = reinterpret_cast(context); + auto _node = reinterpret_cast(node); + auto _type = reinterpret_cast(type); + GetImpl()->ScriptFunctionSetPreferredReturnType(_context, _node, _type); + return; +} +KOALA_INTEROP_V3(ScriptFunctionSetPreferredReturnType, KNativePointer, KNativePointer, KNativePointer) + +KNativePointer impl_TypeClone(KNativePointer context, KNativePointer type) +{ + auto _context = reinterpret_cast(context); + auto _type = reinterpret_cast(type); + return GetImpl()->TypeClone(_context, _type); +} +KOALA_INTEROP_2(TypeClone, KNativePointer, KNativePointer, KNativePointer) + +KNativePointer impl_TypeToString(KNativePointer context, KNativePointer type) +{ + auto _context = reinterpret_cast(context); + auto _type = reinterpret_cast(type); + auto result = GetImpl()->TypeToStringConst(_context, _type); + return StageArena::strdup(result); +} +KOALA_INTEROP_2(TypeToString, KNativePointer, KNativePointer, KNativePointer) + +KInt impl_TypeTypeFlags(KNativePointer context, KNativePointer type) +{ + auto _context = reinterpret_cast(context); + auto _type = reinterpret_cast(type); + return GetImpl()->TypeTypeFlagsConst(_context, _type); +} +KOALA_INTEROP_2(TypeTypeFlags, KInt, KNativePointer, KNativePointer) + // From koala-wrapper // Improve: check if some code should be generated diff --git a/ui2abc/libarkts/native/src/common.cc b/ui2abc/libarkts/native/src/common.cc index f6a99c815..31dbf1bed 100644 --- a/ui2abc/libarkts/native/src/common.cc +++ b/ui2abc/libarkts/native/src/common.cc @@ -269,23 +269,6 @@ KInt impl_IdentifierIdentifierFlags(KNativePointer contextPtr, KNativePointer no } KOALA_INTEROP_2(IdentifierIdentifierFlags, KInt, KNativePointer, KNativePointer) -KNativePointer impl_TypedPreferredType(KNativePointer context, KNativePointer node) -{ - auto _context = reinterpret_cast(context); - auto _node = reinterpret_cast(node); - return GetImpl()->TypedPreferredTypeConst(_context, _node); -} -KOALA_INTEROP_2(TypedPreferredType, KNativePointer, KNativePointer, KNativePointer) - -KNativePointer impl_TypedSetPreferredType(KNativePointer context, KNativePointer node, KNativePointer type) -{ - auto _context = reinterpret_cast(context); - auto _node = reinterpret_cast(node); - auto _type = reinterpret_cast(type); - return GetImpl()->TypedSetPreferredType(_context, _node, _type); -} -KOALA_INTEROP_3(TypedSetPreferredType, KNativePointer, KNativePointer, KNativePointer, KNativePointer) - /* Improve: NOT FROM API (shouldn't be there) ----------------------------------------------------------------------------------------------------------------------------- @@ -296,6 +279,7 @@ es2panda_Context * cachedContext; static void changeParent(es2panda_AstNode *child) { + // printf("%p -> %d\n", child, GetImpl()->AstNodeTypeConst(cachedContext, child)); GetImpl()->AstNodeSetParent(cachedContext, child, cachedParentNode); } diff --git a/ui2abc/libarkts/src/Es2pandaNativeModule.ts b/ui2abc/libarkts/src/Es2pandaNativeModule.ts index 8c2904ab7..3a8e3500e 100644 --- a/ui2abc/libarkts/src/Es2pandaNativeModule.ts +++ b/ui2abc/libarkts/src/Es2pandaNativeModule.ts @@ -23,6 +23,7 @@ import { KDouble, KUInt, KStringArrayPtr, + KStringPtr, } from "@koalaui/interop" import { Es2pandaNativeModule as GeneratedEs2pandaNativeModule, KNativePointerArray } from "./generated/Es2pandaNativeModule" import * as path from "path" @@ -162,10 +163,19 @@ export class Es2pandaNativeModule { _OptionsArkTsConfig(context: KNativePointer, options: KNativePointer): KNativePointer { throw new Error("Not implemented"); } - _TypedPreferredType(context: KNativePointer, node: KNativePointer): KNativePointer { + _ScriptFunctionGetPreferredReturnType(context: KNativePointer, node: KNativePointer): KNativePointer { throw new Error("Not implemented"); } - _TypedSetPreferredType(context: KNativePointer, node: KNativePointer, type: KNativePointer): KNativePointer { + _ScriptFunctionSetPreferredReturnType(context: KNativePointer, node: KNativePointer, type: KNativePointer): KNativePointer { + throw new Error("Not implemented"); + } + _TypeClone(context: KNativePointer, type: KNativePointer): KNativePointer { + throw new Error("Not implemented"); + } + _TypeToString(context: KNativePointer, type: KNativePointer): KStringPtr { + throw new Error("Not implemented"); + } + _TypeTypeFlags(context: KNativePointer, type: KNativePointer): KInt { throw new Error("Not implemented"); } diff --git a/ui2abc/libarkts/src/arkts-api/InferVoidReturnType.ts b/ui2abc/libarkts/src/arkts-api/InferVoidReturnType.ts index b39b96c03..171c3df53 100644 --- a/ui2abc/libarkts/src/arkts-api/InferVoidReturnType.ts +++ b/ui2abc/libarkts/src/arkts-api/InferVoidReturnType.ts @@ -73,7 +73,7 @@ class InferVoidReturnType extends AbstractVisitor { result.modifierFlags, result.id, result.annotations, - result.getPrefferedTypePointer(), + result.getPrefferedReturnTypePointer(), ) } } diff --git a/ui2abc/libarkts/src/arkts-api/node-utilities/ScriptFunction.ts b/ui2abc/libarkts/src/arkts-api/node-utilities/ScriptFunction.ts index d89ec5bb5..766e23fc4 100644 --- a/ui2abc/libarkts/src/arkts-api/node-utilities/ScriptFunction.ts +++ b/ui2abc/libarkts/src/arkts-api/node-utilities/ScriptFunction.ts @@ -38,7 +38,7 @@ export function createScriptFunction( dataflags: Es2pandaModifierFlags, ident: Identifier | undefined, annotations: readonly AnnotationUsage[] | undefined, - prefferedTypePointer: KNativePointer | undefined, + prefferedReturnTypePointer: KNativePointer | undefined, ) { const res = ScriptFunction.createScriptFunction( databody, @@ -57,8 +57,8 @@ export function createScriptFunction( if (annotations) { res.setAnnotations(annotations) } - if (prefferedTypePointer) { - res.setPrefferedTypePointer(prefferedTypePointer) + if (prefferedReturnTypePointer) { + res.setPrefferedReturnTypePointer(prefferedReturnTypePointer) } return res } @@ -74,7 +74,7 @@ export function updateScriptFunction( dataflags: Es2pandaModifierFlags, ident: Identifier | undefined, annotations: readonly AnnotationUsage[] | undefined, - prefferedTypePointer: KNativePointer | undefined, + prefferedReturnTypePointer: KNativePointer | undefined, ) { if (isSameNativeObject(databody, original.body) && isSameNativeObject(typeParams, original.typeParams) @@ -85,7 +85,7 @@ export function updateScriptFunction( && isSameNativeObject(dataflags, original.modifierFlags) && isSameNativeObject(ident, original.id) && isSameNativeObject(annotations, original.annotations) - && prefferedTypePointer == original.getPrefferedTypePointer() + && prefferedReturnTypePointer == original.getPrefferedReturnTypePointer() ) { return original } @@ -100,7 +100,7 @@ export function updateScriptFunction( dataflags, ident, annotations, - prefferedTypePointer, + prefferedReturnTypePointer, ), original ) diff --git a/ui2abc/libarkts/src/arkts-api/utilities/extensions.ts b/ui2abc/libarkts/src/arkts-api/utilities/extensions.ts index fb65fd5f5..570604141 100644 --- a/ui2abc/libarkts/src/arkts-api/utilities/extensions.ts +++ b/ui2abc/libarkts/src/arkts-api/utilities/extensions.ts @@ -48,10 +48,10 @@ export function extension_MethodDefinitionOnUpdate(this: MethodDefinition, origi } } -export function extension_ScriptFunctionGetPrefferedTypePointer(this: ScriptFunction): KNativePointer { - return global.es2panda._TypedPreferredType(global.context, this.peer) +export function extension_ScriptFunctionGetPrefferedReturnTypePointer(this: ScriptFunction): KNativePointer { + return global.es2panda._ScriptFunctionGetPreferredReturnType(global.context, this.peer) } -export function extension_ScriptFunctionSetPrefferedTypePointer(this: ScriptFunction, typePointer: KNativePointer): KNativePointer { - return global.es2panda._TypedSetPreferredType(global.context, this.peer, typePointer) +export function extension_ScriptFunctionSetPrefferedReturnTypePointer(this: ScriptFunction, typePointer: KNativePointer): KNativePointer { + return global.es2panda._ScriptFunctionSetPreferredReturnType(global.context, this.peer, typePointer) } diff --git a/ui2abc/libarkts/src/arkts-api/visitor.ts b/ui2abc/libarkts/src/arkts-api/visitor.ts index f4de656e4..c5f9f5c4c 100644 --- a/ui2abc/libarkts/src/arkts-api/visitor.ts +++ b/ui2abc/libarkts/src/arkts-api/visitor.ts @@ -248,7 +248,7 @@ export function visitEachChild( node.modifierFlags, nodeVisitor(node.id, visitor), nodesVisitor(node.annotations, visitor), - node.getPrefferedTypePointer(), + node.getPrefferedReturnTypePointer(), ) } if (isETSParameterExpression(node)) { diff --git a/ui2abc/libarkts/src/reexport-for-generated.ts b/ui2abc/libarkts/src/reexport-for-generated.ts index b5ad4732f..dc59f069d 100644 --- a/ui2abc/libarkts/src/reexport-for-generated.ts +++ b/ui2abc/libarkts/src/reexport-for-generated.ts @@ -35,6 +35,6 @@ export { extension_ETSModuleGetNamespaceFlag, extension_MethodDefinitionOnUpdate, extension_MethodDefinitionSetChildrenParentPtr, - extension_ScriptFunctionGetPrefferedTypePointer, - extension_ScriptFunctionSetPrefferedTypePointer, + extension_ScriptFunctionGetPrefferedReturnTypePointer, + extension_ScriptFunctionSetPrefferedReturnTypePointer, } from "./arkts-api/utilities/extensions" diff --git a/ui2abc/libarkts/test/arkts-api/recheck/constructor/index.ts b/ui2abc/libarkts/test/arkts-api/recheck/constructor/index.ts index 023a7ebcf..bf4ec8bb8 100644 --- a/ui2abc/libarkts/test/arkts-api/recheck/constructor/index.ts +++ b/ui2abc/libarkts/test/arkts-api/recheck/constructor/index.ts @@ -41,7 +41,7 @@ class ConstructorWithOverload extends arkts.AbstractVisitor { node.modifierFlags, node.id, node.annotations, - node.getPrefferedTypePointer(), + node.getPrefferedReturnTypePointer(), ) } return node diff --git a/ui2abc/libarkts/test/arkts-api/recheck/imports/recursive/index.ts b/ui2abc/libarkts/test/arkts-api/recheck/imports/recursive/index.ts index 2b82b8039..fa47ebc74 100644 --- a/ui2abc/libarkts/test/arkts-api/recheck/imports/recursive/index.ts +++ b/ui2abc/libarkts/test/arkts-api/recheck/imports/recursive/index.ts @@ -40,7 +40,7 @@ class InsertParameter extends arkts.AbstractVisitor { node.modifierFlags, node.id, node.annotations, - node.getPrefferedTypePointer(), + node.getPrefferedReturnTypePointer(), ) } return node diff --git a/ui2abc/libarkts/test/arkts-api/recheck/simple/add-variable/index.ts b/ui2abc/libarkts/test/arkts-api/recheck/simple/add-variable/index.ts index 86b092ecf..0ea26777f 100644 --- a/ui2abc/libarkts/test/arkts-api/recheck/simple/add-variable/index.ts +++ b/ui2abc/libarkts/test/arkts-api/recheck/simple/add-variable/index.ts @@ -76,7 +76,7 @@ export function addVariableDeclaration(node: arkts.ClassDefinition) { func.modifierFlags, func.id, func.annotations, - func.getPrefferedTypePointer(), + func.getPrefferedReturnTypePointer(), ), ), node.modifierFlags, diff --git a/ui2abc/libarkts/test/arkts-api/recheck/this/index.ts b/ui2abc/libarkts/test/arkts-api/recheck/this/index.ts index 7ad6287bd..a508fc250 100644 --- a/ui2abc/libarkts/test/arkts-api/recheck/this/index.ts +++ b/ui2abc/libarkts/test/arkts-api/recheck/this/index.ts @@ -39,7 +39,7 @@ class AddThisReference extends arkts.AbstractVisitor { node.modifierFlags, node.id, node.annotations, - node.getPrefferedTypePointer(), + node.getPrefferedReturnTypePointer(), ) } return node diff --git a/ui2abc/memo-plugin/src/FunctionTransformer.ts b/ui2abc/memo-plugin/src/FunctionTransformer.ts index d266b3866..da6b43e69 100644 --- a/ui2abc/memo-plugin/src/FunctionTransformer.ts +++ b/ui2abc/memo-plugin/src/FunctionTransformer.ts @@ -209,7 +209,7 @@ export class FunctionTransformer extends arkts.AbstractVisitor { scriptFunction.modifierFlags, scriptFunction.id, scriptFunction.annotations, - scriptFunction.getPrefferedTypePointer(), + scriptFunction.getPrefferedReturnTypePointer(), ) } @@ -246,7 +246,7 @@ export class FunctionTransformer extends arkts.AbstractVisitor { scriptFunction.modifierFlags, scriptFunction.id, scriptFunction.annotations, - scriptFunction.getPrefferedTypePointer(), + scriptFunction.getPrefferedReturnTypePointer(), ) } diff --git a/ui2abc/memo-plugin/src/SignatureTransformer.ts b/ui2abc/memo-plugin/src/SignatureTransformer.ts index 3678659a5..ba31b00c1 100644 --- a/ui2abc/memo-plugin/src/SignatureTransformer.ts +++ b/ui2abc/memo-plugin/src/SignatureTransformer.ts @@ -62,7 +62,7 @@ export class SignatureTransformer extends arkts.AbstractVisitor { node.modifierFlags, node.id, node.annotations, - node.getPrefferedTypePointer(), + node.getPrefferedReturnTypePointer(), ) } if (arkts.isETSFunctionType(node)) { diff --git a/ui2abc/ui-plugins/src/builder-lambda-transformer.ts b/ui2abc/ui-plugins/src/builder-lambda-transformer.ts index 59f408c8a..9a42a7916 100644 --- a/ui2abc/ui-plugins/src/builder-lambda-transformer.ts +++ b/ui2abc/ui-plugins/src/builder-lambda-transformer.ts @@ -389,7 +389,7 @@ function transformComponentBuilder( func.modifierFlags, node.id, newAnnotations, - func.getPrefferedTypePointer(), + func.getPrefferedReturnTypePointer(), ) const result = arkts.factory.updateMethodDefinition( diff --git a/ui2abc/ui-plugins/src/class-transformer.ts b/ui2abc/ui-plugins/src/class-transformer.ts index aad1f2e8e..38ee30e70 100644 --- a/ui2abc/ui-plugins/src/class-transformer.ts +++ b/ui2abc/ui-plugins/src/class-transformer.ts @@ -186,7 +186,7 @@ export class ClassTransformer extends arkts.AbstractVisitor { method.function.modifierFlags, method.function.id, method.function.annotations, - method.function.getPrefferedTypePointer(), + method.function.getPrefferedReturnTypePointer(), ) ), method.modifierFlags, -- Gitee From 5da9962758f1db48f550bd7a7c9e44083fb2e5d3 Mon Sep 17 00:00:00 2001 From: Igor Loginov Date: Tue, 15 Jul 2025 16:39:49 +0300 Subject: [PATCH 03/11] demo --- arkoala-arkts/trivial/user/src/ets/page1.ets | 2 +- ...urnType.ts => SetReturnTypeToPreffered.ts} | 58 +++++++------------ ui2abc/libarkts/src/arkts-api/index.ts | 2 +- ui2abc/libarkts/src/index.ts | 2 +- ui2abc/libarkts/src/plugin-utils.ts | 4 +- 5 files changed, 26 insertions(+), 42 deletions(-) rename ui2abc/libarkts/src/arkts-api/{InferVoidReturnType.ts => SetReturnTypeToPreffered.ts} (52%) diff --git a/arkoala-arkts/trivial/user/src/ets/page1.ets b/arkoala-arkts/trivial/user/src/ets/page1.ets index 80f1cf135..facae0674 100644 --- a/arkoala-arkts/trivial/user/src/ets/page1.ets +++ b/arkoala-arkts/trivial/user/src/ets/page1.ets @@ -169,7 +169,7 @@ struct Page1 { .backgroundColor(Color.Gray) .justifyContent(FlexAlign.Center) }, - (item:string): string => item + (item:string) => item ) } } diff --git a/ui2abc/libarkts/src/arkts-api/InferVoidReturnType.ts b/ui2abc/libarkts/src/arkts-api/SetReturnTypeToPreffered.ts similarity index 52% rename from ui2abc/libarkts/src/arkts-api/InferVoidReturnType.ts rename to ui2abc/libarkts/src/arkts-api/SetReturnTypeToPreffered.ts index 171c3df53..f51a8603d 100644 --- a/ui2abc/libarkts/src/arkts-api/InferVoidReturnType.ts +++ b/ui2abc/libarkts/src/arkts-api/SetReturnTypeToPreffered.ts @@ -14,42 +14,27 @@ */ import { factory } from "./factory/nodeFactory" -import { BlockStatement, isReturnStatement, isScriptFunction, Program, ScriptFunction } from "../generated" +import { BlockStatement, ETSPrimitiveType, ETSTypeReference, isScriptFunction, Program } from "../generated" import { AbstractVisitor } from "./AbstractVisitor" import { AstNode } from "./peers/AstNode" import { Es2pandaPrimitiveType, Es2pandaScriptFunctionFlags } from "src/generated/Es2pandaEnums" +import { global } from "./static/global" +import { unpackString } from "./utilities/private" -interface IsScriptFunctionRoot { - isScriptFunctionRoot: boolean -} - -// Improve: this is to workaround compiler not beeing able to infer return type on recheck -class CheckReturns extends AbstractVisitor { - visitor(node: AstNode, options?: IsScriptFunctionRoot): AstNode { - if (isReturnStatement(node) && node.argument !== undefined) { - this.seenNonVoidReturn = true - } - if (isScriptFunction(node) && !options?.isScriptFunctionRoot) { - return node - } - return this.visitEachChild(node) - } - - seenNonVoidReturn: boolean = false - static instance?: CheckReturns -} - -// This function checks that it is possible to infer return type of script function as void -function checkReturns(node: AstNode): boolean { - if (!CheckReturns.instance) { - CheckReturns.instance = new CheckReturns() +// This is still a workaround for type inference in recheck +// since we don't know how to properly work with checker namespace type +function createType(str: string): ETSTypeReference | ETSPrimitiveType { + if (str == "void") { + return factory.createETSPrimitiveType(Es2pandaPrimitiveType.PRIMITIVE_TYPE_VOID) } - CheckReturns.instance.seenNonVoidReturn = false - CheckReturns.instance.visitor(node, { isScriptFunctionRoot: true }) - return CheckReturns.instance.seenNonVoidReturn == false + return factory.createETSTypeReference( + factory.createETSTypeReferencePart( + factory.createIdentifier(str), + ), + ) } -class InferVoidReturnType extends AbstractVisitor { +class SetReturnTypeToPreffered extends AbstractVisitor { visitor(node: BlockStatement): BlockStatement visitor(node: AstNode): AstNode { const result = this.visitEachChild(node) @@ -58,22 +43,21 @@ class InferVoidReturnType extends AbstractVisitor { !result.isConstructor && // constructors should not have return type (result.flags & Es2pandaScriptFunctionFlags.SCRIPT_FUNCTION_FLAGS_SETTER) == 0 // setters should not return void ) { - const isVoid = checkReturns(result) - if (isVoid) { + const peer = result.getPrefferedReturnTypePointer() + if (peer) { + const typeStr = unpackString(global.es2panda._TypeToString(global.context, peer)) return factory.updateScriptFunction( result, result.body, result.typeParams, result.params, - factory.createETSPrimitiveType( - Es2pandaPrimitiveType.PRIMITIVE_TYPE_VOID, - ), + createType(typeStr), result.hasReceiver, result.flags, result.modifierFlags, result.id, result.annotations, - result.getPrefferedReturnTypePointer(), + undefined, ) } } @@ -81,6 +65,6 @@ class InferVoidReturnType extends AbstractVisitor { } } -export function inferVoidReturnType(program: Program) { - program.setAst(new InferVoidReturnType().visitor(program.ast)) +export function setReturnTypeToPreffered(program: Program) { + program.setAst(new SetReturnTypeToPreffered().visitor(program.ast)) } diff --git a/ui2abc/libarkts/src/arkts-api/index.ts b/ui2abc/libarkts/src/arkts-api/index.ts index fdfccb94e..47a7d776f 100644 --- a/ui2abc/libarkts/src/arkts-api/index.ts +++ b/ui2abc/libarkts/src/arkts-api/index.ts @@ -26,7 +26,7 @@ export * from "./CheckedBackFilter" export * from "./SetBaseOverloads" export * from "./plugins" export * from "./ImportStorage" -export * from "./InferVoidReturnType" +export * from "./SetReturnTypeToPreffered" export * from "./ProgramProvider" export * from "./peers/AstNode" diff --git a/ui2abc/libarkts/src/index.ts b/ui2abc/libarkts/src/index.ts index 7518cded8..a5e12375b 100644 --- a/ui2abc/libarkts/src/index.ts +++ b/ui2abc/libarkts/src/index.ts @@ -29,7 +29,7 @@ export * from "./arkts-api/CheckedBackFilter" export * from "./arkts-api/SetBaseOverloads" export * from "./arkts-api/plugins" export * from "./arkts-api/ImportStorage" -export * from "./arkts-api/InferVoidReturnType" +export * from "./arkts-api/SetReturnTypeToPreffered" export * from "./arkts-api/ProgramProvider" export * from "./arkts-api/node-utilities/Program" export * from "./arkts-api/node-utilities/ArkTsConfig" diff --git a/ui2abc/libarkts/src/plugin-utils.ts b/ui2abc/libarkts/src/plugin-utils.ts index d5a3208b9..e490ab045 100644 --- a/ui2abc/libarkts/src/plugin-utils.ts +++ b/ui2abc/libarkts/src/plugin-utils.ts @@ -22,7 +22,7 @@ import { ChainExpressionFilter, ProgramTransformer, Program, - inferVoidReturnType, + setReturnTypeToPreffered, ProgramProvider, CompilationOptions, dumpProgramSrcFormatted @@ -122,7 +122,7 @@ function setAllParents(ast: AstNode) { function stateSpecificPreFilters(program: Program, state: Es2pandaContextState) { if (state == Es2pandaContextState.ES2PANDA_STATE_CHECKED) { - inferVoidReturnType(program) + setReturnTypeToPreffered(program) } } -- Gitee From aa65869ceee011f1212a90b4dd40a06a578162e5 Mon Sep 17 00:00:00 2001 From: Igor Loginov Date: Tue, 15 Jul 2025 16:41:25 +0300 Subject: [PATCH 04/11] fix --- ui2abc/libarkts/native/src/common.cc | 1 - 1 file changed, 1 deletion(-) diff --git a/ui2abc/libarkts/native/src/common.cc b/ui2abc/libarkts/native/src/common.cc index 31dbf1bed..1cbfddc79 100644 --- a/ui2abc/libarkts/native/src/common.cc +++ b/ui2abc/libarkts/native/src/common.cc @@ -279,7 +279,6 @@ es2panda_Context * cachedContext; static void changeParent(es2panda_AstNode *child) { - // printf("%p -> %d\n", child, GetImpl()->AstNodeTypeConst(cachedContext, child)); GetImpl()->AstNodeSetParent(cachedContext, child, cachedParentNode); } -- Gitee From 316744f023f444aac1d54be0f9d95d84151e21fa Mon Sep 17 00:00:00 2001 From: Igor Loginov Date: Tue, 15 Jul 2025 17:44:29 +0300 Subject: [PATCH 05/11] improve --- .../src/arkts-api/SetReturnTypeToPreffered.ts | 51 +++++++++++++++++-- 1 file changed, 47 insertions(+), 4 deletions(-) diff --git a/ui2abc/libarkts/src/arkts-api/SetReturnTypeToPreffered.ts b/ui2abc/libarkts/src/arkts-api/SetReturnTypeToPreffered.ts index f51a8603d..2425e7a4d 100644 --- a/ui2abc/libarkts/src/arkts-api/SetReturnTypeToPreffered.ts +++ b/ui2abc/libarkts/src/arkts-api/SetReturnTypeToPreffered.ts @@ -14,19 +14,61 @@ */ import { factory } from "./factory/nodeFactory" -import { BlockStatement, ETSPrimitiveType, ETSTypeReference, isScriptFunction, Program } from "../generated" +import { BlockStatement, isScriptFunction, Program, TypeNode } from "../generated" import { AbstractVisitor } from "./AbstractVisitor" import { AstNode } from "./peers/AstNode" import { Es2pandaPrimitiveType, Es2pandaScriptFunctionFlags } from "src/generated/Es2pandaEnums" import { global } from "./static/global" import { unpackString } from "./utilities/private" -// This is still a workaround for type inference in recheck -// since we don't know how to properly work with checker namespace type -function createType(str: string): ETSTypeReference | ETSPrimitiveType { +// This is a workaround to convert checker.type to ir.type +function createType(str: string): TypeNode { + console.log(str) + if (str == "undefined") { + return factory.createETSUndefinedType() + } if (str == "void") { return factory.createETSPrimitiveType(Es2pandaPrimitiveType.PRIMITIVE_TYPE_VOID) } + if (str == "Int") { + return factory.createETSPrimitiveType(Es2pandaPrimitiveType.PRIMITIVE_TYPE_INT) + } + if (str == "Double") { + return factory.createETSPrimitiveType(Es2pandaPrimitiveType.PRIMITIVE_TYPE_DOUBLE) + } + + let currentDepth = 0 + let unionStart = -1 + const unionTypes: string[] = [] + for (let i = 0; i < str.length; i++) { + if (str[i] == '<') currentDepth++ + if (str[i] == '>') currentDepth-- + if (currentDepth == 0 && str[i] == '|') { + unionTypes.push(str.substring(unionStart + 1, i)) + unionStart = i + } + } + unionTypes.push(str.substring(unionStart + 1)) + if (unionTypes.length > 1) { + return factory.createETSUnionType( + unionTypes.map(it => createType(it)), + ) + } + + const templateStart = str.indexOf('<') + if (templateStart != -1) { + const id = str.substring(0, templateStart) + const templateTypes = str.substring(templateStart + 1, str.length - 1).split(',') + return factory.createETSTypeReference( + factory.createETSTypeReferencePart( + factory.createIdentifier(id), + factory.createTSTypeParameterInstantiation( + templateTypes.map(it => createType(it)), + ), + ), + ) + } + return factory.createETSTypeReference( factory.createETSTypeReferencePart( factory.createIdentifier(str), @@ -34,6 +76,7 @@ function createType(str: string): ETSTypeReference | ETSPrimitiveType { ) } +// This a workaround for type inference not working on recheck class SetReturnTypeToPreffered extends AbstractVisitor { visitor(node: BlockStatement): BlockStatement visitor(node: AstNode): AstNode { -- Gitee From 718c1b33c2f2ed9b7ac8f00471dbab80036cb331 Mon Sep 17 00:00:00 2001 From: Igor Loginov Date: Tue, 15 Jul 2025 18:02:05 +0300 Subject: [PATCH 06/11] fix --- ...reffered.ts => SetReturnTypeToPreferred.ts} | 18 ++++++++++++------ ui2abc/libarkts/src/arkts-api/index.ts | 2 +- .../arkts-api/node-utilities/ScriptFunction.ts | 12 ++++++------ .../src/arkts-api/utilities/extensions.ts | 4 ++-- ui2abc/libarkts/src/arkts-api/visitor.ts | 2 +- ui2abc/libarkts/src/index.ts | 2 +- ui2abc/libarkts/src/plugin-utils.ts | 4 ++-- ui2abc/libarkts/src/reexport-for-generated.ts | 4 ++-- ui2abc/memo-plugin/src/FunctionTransformer.ts | 4 ++-- ui2abc/memo-plugin/src/SignatureTransformer.ts | 2 +- .../src/builder-lambda-transformer.ts | 2 +- ui2abc/ui-plugins/src/class-transformer.ts | 2 +- 12 files changed, 32 insertions(+), 26 deletions(-) rename ui2abc/libarkts/src/arkts-api/{SetReturnTypeToPreffered.ts => SetReturnTypeToPreferred.ts} (87%) diff --git a/ui2abc/libarkts/src/arkts-api/SetReturnTypeToPreffered.ts b/ui2abc/libarkts/src/arkts-api/SetReturnTypeToPreferred.ts similarity index 87% rename from ui2abc/libarkts/src/arkts-api/SetReturnTypeToPreffered.ts rename to ui2abc/libarkts/src/arkts-api/SetReturnTypeToPreferred.ts index 2425e7a4d..c3d490416 100644 --- a/ui2abc/libarkts/src/arkts-api/SetReturnTypeToPreffered.ts +++ b/ui2abc/libarkts/src/arkts-api/SetReturnTypeToPreferred.ts @@ -77,7 +77,7 @@ function createType(str: string): TypeNode { } // This a workaround for type inference not working on recheck -class SetReturnTypeToPreffered extends AbstractVisitor { +class SetReturnTypeToPreferred extends AbstractVisitor { visitor(node: BlockStatement): BlockStatement visitor(node: AstNode): AstNode { const result = this.visitEachChild(node) @@ -86,21 +86,27 @@ class SetReturnTypeToPreffered extends AbstractVisitor { !result.isConstructor && // constructors should not have return type (result.flags & Es2pandaScriptFunctionFlags.SCRIPT_FUNCTION_FLAGS_SETTER) == 0 // setters should not return void ) { - const peer = result.getPrefferedReturnTypePointer() + const peer = result.getPreferredReturnTypePointer() if (peer) { const typeStr = unpackString(global.es2panda._TypeToString(global.context, peer)) + const returnTypeAnnotation = createType(typeStr) + // TODO + if (typeStr == "void|PromiseLike") { + console.log(returnTypeAnnotation.dumpJson()) + return result + } return factory.updateScriptFunction( result, result.body, result.typeParams, result.params, - createType(typeStr), + returnTypeAnnotation, result.hasReceiver, result.flags, result.modifierFlags, result.id, result.annotations, - undefined, + peer, ) } } @@ -108,6 +114,6 @@ class SetReturnTypeToPreffered extends AbstractVisitor { } } -export function setReturnTypeToPreffered(program: Program) { - program.setAst(new SetReturnTypeToPreffered().visitor(program.ast)) +export function setReturnTypeToPreferred(program: Program) { + program.setAst(new SetReturnTypeToPreferred().visitor(program.ast)) } diff --git a/ui2abc/libarkts/src/arkts-api/index.ts b/ui2abc/libarkts/src/arkts-api/index.ts index 47a7d776f..4aa9ade87 100644 --- a/ui2abc/libarkts/src/arkts-api/index.ts +++ b/ui2abc/libarkts/src/arkts-api/index.ts @@ -26,7 +26,7 @@ export * from "./CheckedBackFilter" export * from "./SetBaseOverloads" export * from "./plugins" export * from "./ImportStorage" -export * from "./SetReturnTypeToPreffered" +export * from "./SetReturnTypeToPreferred" export * from "./ProgramProvider" export * from "./peers/AstNode" diff --git a/ui2abc/libarkts/src/arkts-api/node-utilities/ScriptFunction.ts b/ui2abc/libarkts/src/arkts-api/node-utilities/ScriptFunction.ts index 766e23fc4..a61cc2076 100644 --- a/ui2abc/libarkts/src/arkts-api/node-utilities/ScriptFunction.ts +++ b/ui2abc/libarkts/src/arkts-api/node-utilities/ScriptFunction.ts @@ -38,7 +38,7 @@ export function createScriptFunction( dataflags: Es2pandaModifierFlags, ident: Identifier | undefined, annotations: readonly AnnotationUsage[] | undefined, - prefferedReturnTypePointer: KNativePointer | undefined, + PreferredReturnTypePointer: KNativePointer | undefined, ) { const res = ScriptFunction.createScriptFunction( databody, @@ -57,8 +57,8 @@ export function createScriptFunction( if (annotations) { res.setAnnotations(annotations) } - if (prefferedReturnTypePointer) { - res.setPrefferedReturnTypePointer(prefferedReturnTypePointer) + if (PreferredReturnTypePointer) { + res.setPreferredReturnTypePointer(PreferredReturnTypePointer) } return res } @@ -74,7 +74,7 @@ export function updateScriptFunction( dataflags: Es2pandaModifierFlags, ident: Identifier | undefined, annotations: readonly AnnotationUsage[] | undefined, - prefferedReturnTypePointer: KNativePointer | undefined, + PreferredReturnTypePointer: KNativePointer | undefined, ) { if (isSameNativeObject(databody, original.body) && isSameNativeObject(typeParams, original.typeParams) @@ -85,7 +85,7 @@ export function updateScriptFunction( && isSameNativeObject(dataflags, original.modifierFlags) && isSameNativeObject(ident, original.id) && isSameNativeObject(annotations, original.annotations) - && prefferedReturnTypePointer == original.getPrefferedReturnTypePointer() + && PreferredReturnTypePointer == original.getPreferredReturnTypePointer() ) { return original } @@ -100,7 +100,7 @@ export function updateScriptFunction( dataflags, ident, annotations, - prefferedReturnTypePointer, + PreferredReturnTypePointer, ), original ) diff --git a/ui2abc/libarkts/src/arkts-api/utilities/extensions.ts b/ui2abc/libarkts/src/arkts-api/utilities/extensions.ts index 570604141..488e43d72 100644 --- a/ui2abc/libarkts/src/arkts-api/utilities/extensions.ts +++ b/ui2abc/libarkts/src/arkts-api/utilities/extensions.ts @@ -48,10 +48,10 @@ export function extension_MethodDefinitionOnUpdate(this: MethodDefinition, origi } } -export function extension_ScriptFunctionGetPrefferedReturnTypePointer(this: ScriptFunction): KNativePointer { +export function extension_ScriptFunctionGetPreferredReturnTypePointer(this: ScriptFunction): KNativePointer { return global.es2panda._ScriptFunctionGetPreferredReturnType(global.context, this.peer) } -export function extension_ScriptFunctionSetPrefferedReturnTypePointer(this: ScriptFunction, typePointer: KNativePointer): KNativePointer { +export function extension_ScriptFunctionSetPreferredReturnTypePointer(this: ScriptFunction, typePointer: KNativePointer): KNativePointer { return global.es2panda._ScriptFunctionSetPreferredReturnType(global.context, this.peer, typePointer) } diff --git a/ui2abc/libarkts/src/arkts-api/visitor.ts b/ui2abc/libarkts/src/arkts-api/visitor.ts index c5f9f5c4c..d4732e891 100644 --- a/ui2abc/libarkts/src/arkts-api/visitor.ts +++ b/ui2abc/libarkts/src/arkts-api/visitor.ts @@ -248,7 +248,7 @@ export function visitEachChild( node.modifierFlags, nodeVisitor(node.id, visitor), nodesVisitor(node.annotations, visitor), - node.getPrefferedReturnTypePointer(), + node.getPreferredReturnTypePointer(), ) } if (isETSParameterExpression(node)) { diff --git a/ui2abc/libarkts/src/index.ts b/ui2abc/libarkts/src/index.ts index a5e12375b..d927ebd89 100644 --- a/ui2abc/libarkts/src/index.ts +++ b/ui2abc/libarkts/src/index.ts @@ -29,7 +29,7 @@ export * from "./arkts-api/CheckedBackFilter" export * from "./arkts-api/SetBaseOverloads" export * from "./arkts-api/plugins" export * from "./arkts-api/ImportStorage" -export * from "./arkts-api/SetReturnTypeToPreffered" +export * from "./arkts-api/SetReturnTypeToPreferred" export * from "./arkts-api/ProgramProvider" export * from "./arkts-api/node-utilities/Program" export * from "./arkts-api/node-utilities/ArkTsConfig" diff --git a/ui2abc/libarkts/src/plugin-utils.ts b/ui2abc/libarkts/src/plugin-utils.ts index e490ab045..1c3cae7ac 100644 --- a/ui2abc/libarkts/src/plugin-utils.ts +++ b/ui2abc/libarkts/src/plugin-utils.ts @@ -22,7 +22,7 @@ import { ChainExpressionFilter, ProgramTransformer, Program, - setReturnTypeToPreffered, + setReturnTypeToPreferred, ProgramProvider, CompilationOptions, dumpProgramSrcFormatted @@ -122,7 +122,7 @@ function setAllParents(ast: AstNode) { function stateSpecificPreFilters(program: Program, state: Es2pandaContextState) { if (state == Es2pandaContextState.ES2PANDA_STATE_CHECKED) { - setReturnTypeToPreffered(program) + setReturnTypeToPreferred(program) } } diff --git a/ui2abc/libarkts/src/reexport-for-generated.ts b/ui2abc/libarkts/src/reexport-for-generated.ts index dc59f069d..9a4f5acfd 100644 --- a/ui2abc/libarkts/src/reexport-for-generated.ts +++ b/ui2abc/libarkts/src/reexport-for-generated.ts @@ -35,6 +35,6 @@ export { extension_ETSModuleGetNamespaceFlag, extension_MethodDefinitionOnUpdate, extension_MethodDefinitionSetChildrenParentPtr, - extension_ScriptFunctionGetPrefferedReturnTypePointer, - extension_ScriptFunctionSetPrefferedReturnTypePointer, + extension_ScriptFunctionGetPreferredReturnTypePointer, + extension_ScriptFunctionSetPreferredReturnTypePointer, } from "./arkts-api/utilities/extensions" diff --git a/ui2abc/memo-plugin/src/FunctionTransformer.ts b/ui2abc/memo-plugin/src/FunctionTransformer.ts index da6b43e69..f840d8c49 100644 --- a/ui2abc/memo-plugin/src/FunctionTransformer.ts +++ b/ui2abc/memo-plugin/src/FunctionTransformer.ts @@ -209,7 +209,7 @@ export class FunctionTransformer extends arkts.AbstractVisitor { scriptFunction.modifierFlags, scriptFunction.id, scriptFunction.annotations, - scriptFunction.getPrefferedReturnTypePointer(), + scriptFunction.getPreferredReturnTypePointer(), ) } @@ -246,7 +246,7 @@ export class FunctionTransformer extends arkts.AbstractVisitor { scriptFunction.modifierFlags, scriptFunction.id, scriptFunction.annotations, - scriptFunction.getPrefferedReturnTypePointer(), + scriptFunction.getPreferredReturnTypePointer(), ) } diff --git a/ui2abc/memo-plugin/src/SignatureTransformer.ts b/ui2abc/memo-plugin/src/SignatureTransformer.ts index ba31b00c1..c60c8f9f3 100644 --- a/ui2abc/memo-plugin/src/SignatureTransformer.ts +++ b/ui2abc/memo-plugin/src/SignatureTransformer.ts @@ -62,7 +62,7 @@ export class SignatureTransformer extends arkts.AbstractVisitor { node.modifierFlags, node.id, node.annotations, - node.getPrefferedReturnTypePointer(), + node.getPreferredReturnTypePointer(), ) } if (arkts.isETSFunctionType(node)) { diff --git a/ui2abc/ui-plugins/src/builder-lambda-transformer.ts b/ui2abc/ui-plugins/src/builder-lambda-transformer.ts index 9a42a7916..ebef1ead4 100644 --- a/ui2abc/ui-plugins/src/builder-lambda-transformer.ts +++ b/ui2abc/ui-plugins/src/builder-lambda-transformer.ts @@ -389,7 +389,7 @@ function transformComponentBuilder( func.modifierFlags, node.id, newAnnotations, - func.getPrefferedReturnTypePointer(), + func.getPreferredReturnTypePointer(), ) const result = arkts.factory.updateMethodDefinition( diff --git a/ui2abc/ui-plugins/src/class-transformer.ts b/ui2abc/ui-plugins/src/class-transformer.ts index 38ee30e70..a22645fb2 100644 --- a/ui2abc/ui-plugins/src/class-transformer.ts +++ b/ui2abc/ui-plugins/src/class-transformer.ts @@ -186,7 +186,7 @@ export class ClassTransformer extends arkts.AbstractVisitor { method.function.modifierFlags, method.function.id, method.function.annotations, - method.function.getPrefferedReturnTypePointer(), + method.function.getPreferredReturnTypePointer(), ) ), method.modifierFlags, -- Gitee From 9bf35d38ea6d9ba07a49ff21ef2020ce27c96d16 Mon Sep 17 00:00:00 2001 From: Igor Loginov Date: Fri, 18 Jul 2025 11:18:30 +0300 Subject: [PATCH 07/11] fix --- ui2abc/libarkts/generator/options.json5 | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/ui2abc/libarkts/generator/options.json5 b/ui2abc/libarkts/generator/options.json5 index 55c00f670..9c9c7ddbb 100644 --- a/ui2abc/libarkts/generator/options.json5 +++ b/ui2abc/libarkts/generator/options.json5 @@ -282,12 +282,12 @@ interface: "ScriptFunction", methods: [ { - name: "getPrefferedReturnTypePointer", - definition: "extension_ScriptFunctionGetPrefferedReturnTypePointer", + name: "getPreferredReturnTypePointer", + definition: "extension_ScriptFunctionGetPreferredReturnTypePointer", }, { - name: "setPrefferedReturnTypePointer", - definition: "extension_ScriptFunctionSetPrefferedReturnTypePointer", + name: "setPreferredReturnTypePointer", + definition: "extension_ScriptFunctionSetPreferredReturnTypePointer", }, ] } -- Gitee From 212885b3bd952cd802a3ec959682a9a41ddaf1b4 Mon Sep 17 00:00:00 2001 From: Igor Loginov Date: Fri, 18 Jul 2025 15:53:53 +0300 Subject: [PATCH 08/11] Some more attempts to work with preffered types --- ui2abc/libarkts/native/src/bridges.cc | 108 ++++++++++++++-- ui2abc/libarkts/src/Es2pandaNativeModule.ts | 37 +++++- .../src/arkts-api/SetReturnTypeToPreferred.ts | 119 ------------------ ui2abc/libarkts/src/arkts-api/index.ts | 1 - .../src/arkts-api/utilities/extensions.ts | 4 +- .../src/generated/Es2pandaNativeModule.ts | 2 +- .../src/generated/peers/ScriptFunction.ts | 4 + ui2abc/libarkts/src/index.ts | 1 - ui2abc/libarkts/src/plugin-utils.ts | 16 --- ui2abc/memo-plugin/demo/demo/demo.ets | 13 +- ui2abc/memo-plugin/src/MemoFactory.ts | 22 +++- 11 files changed, 162 insertions(+), 165 deletions(-) delete mode 100644 ui2abc/libarkts/src/arkts-api/SetReturnTypeToPreferred.ts diff --git a/ui2abc/libarkts/native/src/bridges.cc b/ui2abc/libarkts/native/src/bridges.cc index 6b8acb9ff..7cf8c037e 100644 --- a/ui2abc/libarkts/native/src/bridges.cc +++ b/ui2abc/libarkts/native/src/bridges.cc @@ -402,16 +402,16 @@ void impl_DestroyGlobalContext(KNativePointer globalContextPtr) { } KOALA_INTEROP_V1(DestroyGlobalContext, KNativePointer) -// These "Type" bridges are related to checker namespace in es2panda, so work with them carefully -KNativePointer impl_ScriptFunctionGetPreferredReturnType(KNativePointer context, KNativePointer node) +// All these "Checker_" bridges are related to checker namespace in es2panda, so work with them carefully +KNativePointer impl_Checker_ScriptFunctionGetPreferredReturnType(KNativePointer context, KNativePointer node) { auto _context = reinterpret_cast(context); auto _node = reinterpret_cast(node); return GetImpl()->ScriptFunctionGetPreferredReturnType(_context, _node); } -KOALA_INTEROP_2(ScriptFunctionGetPreferredReturnType, KNativePointer, KNativePointer, KNativePointer) +KOALA_INTEROP_2(Checker_ScriptFunctionGetPreferredReturnType, KNativePointer, KNativePointer, KNativePointer) -void impl_ScriptFunctionSetPreferredReturnType(KNativePointer context, KNativePointer node, KNativePointer type) +void impl_Checker_ScriptFunctionSetPreferredReturnType(KNativePointer context, KNativePointer node, KNativePointer type) { auto _context = reinterpret_cast(context); auto _node = reinterpret_cast(node); @@ -419,32 +419,116 @@ void impl_ScriptFunctionSetPreferredReturnType(KNativePointer context, KNativePo GetImpl()->ScriptFunctionSetPreferredReturnType(_context, _node, _type); return; } -KOALA_INTEROP_V3(ScriptFunctionSetPreferredReturnType, KNativePointer, KNativePointer, KNativePointer) +KOALA_INTEROP_V3(Checker_ScriptFunctionSetPreferredReturnType, KNativePointer, KNativePointer, KNativePointer) -KNativePointer impl_TypeClone(KNativePointer context, KNativePointer type) +KNativePointer impl_Checker_TypeClone(KNativePointer context, KNativePointer type) { auto _context = reinterpret_cast(context); auto _type = reinterpret_cast(type); return GetImpl()->TypeClone(_context, _type); } -KOALA_INTEROP_2(TypeClone, KNativePointer, KNativePointer, KNativePointer) +KOALA_INTEROP_2(Checker_TypeClone, KNativePointer, KNativePointer, KNativePointer) -KNativePointer impl_TypeToString(KNativePointer context, KNativePointer type) +KNativePointer impl_Checker_TypeToString(KNativePointer context, KNativePointer type) { auto _context = reinterpret_cast(context); auto _type = reinterpret_cast(type); auto result = GetImpl()->TypeToStringConst(_context, _type); return StageArena::strdup(result); } -KOALA_INTEROP_2(TypeToString, KNativePointer, KNativePointer, KNativePointer) +KOALA_INTEROP_2(Checker_TypeToString, KNativePointer, KNativePointer, KNativePointer) -KInt impl_TypeTypeFlags(KNativePointer context, KNativePointer type) +KNativePointer impl_Checker_CreateETSFunctionTypeChecker(KNativePointer context, KNativePointer signature) { auto _context = reinterpret_cast(context); + auto _signature = reinterpret_cast(signature); + return GetImpl()->CreateETSFunctionTypeChecker(_context, _signature); +} +KOALA_INTEROP_2(Checker_CreateETSFunctionTypeChecker, KNativePointer, KNativePointer, KNativePointer) + +KNativePointer impl_Checker_CreateSignature(KNativePointer context, KNativePointer signatureInfo, KNativePointer returnType, KNativePointer func) +{ + auto _context = reinterpret_cast(context); + auto _signatureInfo = reinterpret_cast(signatureInfo); + auto _returnType = reinterpret_cast(returnType); + auto _func = reinterpret_cast(func); + return GetImpl()->CreateSignature(_context, _signatureInfo, _returnType, _func); +} +KOALA_INTEROP_4(Checker_CreateSignature, KNativePointer, KNativePointer, KNativePointer, KNativePointer, KNativePointer) + +KNativePointer impl_Checker_SignatureGetSignatureInfo(KNativePointer context, KNativePointer signature) +{ + auto _context = reinterpret_cast(context); + auto _signature = reinterpret_cast(signature); + return GetImpl()->SignatureGetSignatureInfo(_context, _signature); +} +KOALA_INTEROP_2(Checker_SignatureGetSignatureInfo, KNativePointer, KNativePointer, KNativePointer) + +KNativePointer impl_Checker_AstNodeCheck(KNativePointer context, KNativePointer astNode) +{ + auto _context = reinterpret_cast(context); + auto _astNode = reinterpret_cast(astNode); + return GetImpl()->AstNodeCheck(_context, _astNode); +} +KOALA_INTEROP_2(Checker_AstNodeCheck, KNativePointer, KNativePointer, KNativePointer) + +void impl_Checker_AstNodeCleanCheckInformation(KNativePointer context, KNativePointer astNode) +{ + auto _context = reinterpret_cast(context); + auto _astNode = reinterpret_cast(astNode); + GetImpl()->AstNodeCleanCheckInformation(_context, _astNode); +} +KOALA_INTEROP_V2(Checker_AstNodeCleanCheckInformation, KNativePointer, KNativePointer) + +KNativePointer impl_Checker_ArrowFunctionExpressionCreateReturnNodeFromType(KNativePointer context, KNativePointer astNode, KNativePointer type) +{ + auto _context = reinterpret_cast(context); + auto _astNode = reinterpret_cast(astNode); auto _type = reinterpret_cast(type); - return GetImpl()->TypeTypeFlagsConst(_context, _type); + return GetImpl()->ArrowFunctionExpressionCreateReturnNodeFromType(_context, _astNode, _type); +} +KOALA_INTEROP_3(Checker_ArrowFunctionExpressionCreateReturnNodeFromType, KNativePointer, KNativePointer, KNativePointer, KNativePointer) + +KNativePointer impl_Checker_ArrowFunctionExpressionCreateTypeAnnotation(KNativePointer context, KNativePointer astNode) +{ + auto _context = reinterpret_cast(context); + auto _astNode = reinterpret_cast(astNode); + return GetImpl()->ArrowFunctionExpressionCreateTypeAnnotation(_context, _astNode); +} +KOALA_INTEROP_2(Checker_ArrowFunctionExpressionCreateTypeAnnotation, KNativePointer, KNativePointer, KNativePointer) + +KNativePointer impl_Checker_ScriptFunctionSignature(KNativePointer context, KNativePointer astNode) +{ + auto _context = reinterpret_cast(context); + auto _astNode = reinterpret_cast(astNode); + return GetImpl()->ScriptFunctionSignature(_context, _astNode); +} +KOALA_INTEROP_2(Checker_ScriptFunctionSignature, KNativePointer, KNativePointer, KNativePointer) + +void impl_Checker_CallExpressionSetUncheckedType(KNativePointer context, KNativePointer astNode, KNativePointer type) +{ + auto _context = reinterpret_cast(context); + auto _astNode = reinterpret_cast(astNode); + auto _type = reinterpret_cast(type); + return GetImpl()->CallExpressionSetUncheckedType(_context, _astNode, _type); +} +KOALA_INTEROP_V3(Checker_CallExpressionSetUncheckedType, KNativePointer, KNativePointer, KNativePointer) + +KBoolean impl_Checker_AstNodeIsTypedConst(KNativePointer context, KNativePointer astNode) +{ + auto _context = reinterpret_cast(context); + auto _astNode = reinterpret_cast(astNode); + return GetImpl()->AstNodeIsTypedConst(_context, _astNode); +} +KOALA_INTEROP_2(Checker_AstNodeIsTypedConst, KBoolean, KNativePointer, KNativePointer) + +KNativePointer impl_Checker_TypeNodeGetType(KNativePointer context, KNativePointer astNode) +{ + auto _context = reinterpret_cast(context); + auto _astNode = reinterpret_cast(astNode); + return GetImpl()->TypeNodeGetType(_context, _astNode); } -KOALA_INTEROP_2(TypeTypeFlags, KInt, KNativePointer, KNativePointer) +KOALA_INTEROP_2(Checker_TypeNodeGetType, KNativePointer, KNativePointer, KNativePointer) // From koala-wrapper // Improve: check if some code should be generated diff --git a/ui2abc/libarkts/src/Es2pandaNativeModule.ts b/ui2abc/libarkts/src/Es2pandaNativeModule.ts index 3a8e3500e..8ee71b578 100644 --- a/ui2abc/libarkts/src/Es2pandaNativeModule.ts +++ b/ui2abc/libarkts/src/Es2pandaNativeModule.ts @@ -163,19 +163,46 @@ export class Es2pandaNativeModule { _OptionsArkTsConfig(context: KNativePointer, options: KNativePointer): KNativePointer { throw new Error("Not implemented"); } - _ScriptFunctionGetPreferredReturnType(context: KNativePointer, node: KNativePointer): KNativePointer { + _Checker_ScriptFunctionGetPreferredReturnType(context: KNativePointer, node: KNativePointer): KNativePointer { throw new Error("Not implemented"); } - _ScriptFunctionSetPreferredReturnType(context: KNativePointer, node: KNativePointer, type: KNativePointer): KNativePointer { + _Checker_ScriptFunctionSetPreferredReturnType(context: KNativePointer, node: KNativePointer, type: KNativePointer): KNativePointer { throw new Error("Not implemented"); } - _TypeClone(context: KNativePointer, type: KNativePointer): KNativePointer { + _Checker_TypeClone(context: KNativePointer, type: KNativePointer): KNativePointer { throw new Error("Not implemented"); } - _TypeToString(context: KNativePointer, type: KNativePointer): KStringPtr { + _Checker_TypeToString(context: KNativePointer, type: KNativePointer): KNativePointer { throw new Error("Not implemented"); } - _TypeTypeFlags(context: KNativePointer, type: KNativePointer): KInt { + _Checker_CreateETSFunctionTypeChecker(context: KNativePointer, signature: KNativePointer): KNativePointer { + throw new Error("Not implemented"); + } + _Checker_CreateSignature(context: KNativePointer, signatureInfo: KNativePointer, returnType: KNativePointer, func: KNativePointer): KNativePointer { + throw new Error("Not implemented"); + } + _Checker_AstNodeCheck(context: KNativePointer, node: KNativePointer): KNativePointer { + throw new Error("Not implemented"); + } + _Checker_AstNodeCleanCheckInformation(context: KNativePointer, node: KNativePointer): void { + throw new Error("Not implemented"); + } + _Checker_ArrowFunctionExpressionCreateReturnNodeFromType(context: KNativePointer, node: KNativePointer, type: KNativePointer): KNativePointer { + throw new Error("Not implemented"); + } + _Checker_ArrowFunctionExpressionCreateTypeAnnotation(context: KNativePointer, node: KNativePointer): KNativePointer { + throw new Error("Not implemented"); + } + _Checker_ScriptFunctionSignature(context: KNativePointer, node: KNativePointer): KNativePointer { + throw new Error("Not implemented"); + } + _Checker_CallExpressionSetUncheckedType(context: KNativePointer, node: KNativePointer, type: KNativePointer): void { + throw new Error("Not implemented"); + } + _Checker_AstNodeIsTyped(context: KNativePointer, node: KNativePointer): KBoolean { + throw new Error("Not implemented"); + } + _Checker_TypeNodeGetType(context: KNativePointer, node: KNativePointer): KNativePointer { throw new Error("Not implemented"); } diff --git a/ui2abc/libarkts/src/arkts-api/SetReturnTypeToPreferred.ts b/ui2abc/libarkts/src/arkts-api/SetReturnTypeToPreferred.ts deleted file mode 100644 index c3d490416..000000000 --- a/ui2abc/libarkts/src/arkts-api/SetReturnTypeToPreferred.ts +++ /dev/null @@ -1,119 +0,0 @@ -/* - * Copyright (c) 2022-2023 Huawei Device Co., Ltd. - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { factory } from "./factory/nodeFactory" -import { BlockStatement, isScriptFunction, Program, TypeNode } from "../generated" -import { AbstractVisitor } from "./AbstractVisitor" -import { AstNode } from "./peers/AstNode" -import { Es2pandaPrimitiveType, Es2pandaScriptFunctionFlags } from "src/generated/Es2pandaEnums" -import { global } from "./static/global" -import { unpackString } from "./utilities/private" - -// This is a workaround to convert checker.type to ir.type -function createType(str: string): TypeNode { - console.log(str) - if (str == "undefined") { - return factory.createETSUndefinedType() - } - if (str == "void") { - return factory.createETSPrimitiveType(Es2pandaPrimitiveType.PRIMITIVE_TYPE_VOID) - } - if (str == "Int") { - return factory.createETSPrimitiveType(Es2pandaPrimitiveType.PRIMITIVE_TYPE_INT) - } - if (str == "Double") { - return factory.createETSPrimitiveType(Es2pandaPrimitiveType.PRIMITIVE_TYPE_DOUBLE) - } - - let currentDepth = 0 - let unionStart = -1 - const unionTypes: string[] = [] - for (let i = 0; i < str.length; i++) { - if (str[i] == '<') currentDepth++ - if (str[i] == '>') currentDepth-- - if (currentDepth == 0 && str[i] == '|') { - unionTypes.push(str.substring(unionStart + 1, i)) - unionStart = i - } - } - unionTypes.push(str.substring(unionStart + 1)) - if (unionTypes.length > 1) { - return factory.createETSUnionType( - unionTypes.map(it => createType(it)), - ) - } - - const templateStart = str.indexOf('<') - if (templateStart != -1) { - const id = str.substring(0, templateStart) - const templateTypes = str.substring(templateStart + 1, str.length - 1).split(',') - return factory.createETSTypeReference( - factory.createETSTypeReferencePart( - factory.createIdentifier(id), - factory.createTSTypeParameterInstantiation( - templateTypes.map(it => createType(it)), - ), - ), - ) - } - - return factory.createETSTypeReference( - factory.createETSTypeReferencePart( - factory.createIdentifier(str), - ), - ) -} - -// This a workaround for type inference not working on recheck -class SetReturnTypeToPreferred extends AbstractVisitor { - visitor(node: BlockStatement): BlockStatement - visitor(node: AstNode): AstNode { - const result = this.visitEachChild(node) - if (isScriptFunction(result) && - result.returnTypeAnnotation === undefined && - !result.isConstructor && // constructors should not have return type - (result.flags & Es2pandaScriptFunctionFlags.SCRIPT_FUNCTION_FLAGS_SETTER) == 0 // setters should not return void - ) { - const peer = result.getPreferredReturnTypePointer() - if (peer) { - const typeStr = unpackString(global.es2panda._TypeToString(global.context, peer)) - const returnTypeAnnotation = createType(typeStr) - // TODO - if (typeStr == "void|PromiseLike") { - console.log(returnTypeAnnotation.dumpJson()) - return result - } - return factory.updateScriptFunction( - result, - result.body, - result.typeParams, - result.params, - returnTypeAnnotation, - result.hasReceiver, - result.flags, - result.modifierFlags, - result.id, - result.annotations, - peer, - ) - } - } - return result - } -} - -export function setReturnTypeToPreferred(program: Program) { - program.setAst(new SetReturnTypeToPreferred().visitor(program.ast)) -} diff --git a/ui2abc/libarkts/src/arkts-api/index.ts b/ui2abc/libarkts/src/arkts-api/index.ts index 4aa9ade87..4ca4a56f8 100644 --- a/ui2abc/libarkts/src/arkts-api/index.ts +++ b/ui2abc/libarkts/src/arkts-api/index.ts @@ -26,7 +26,6 @@ export * from "./CheckedBackFilter" export * from "./SetBaseOverloads" export * from "./plugins" export * from "./ImportStorage" -export * from "./SetReturnTypeToPreferred" export * from "./ProgramProvider" export * from "./peers/AstNode" diff --git a/ui2abc/libarkts/src/arkts-api/utilities/extensions.ts b/ui2abc/libarkts/src/arkts-api/utilities/extensions.ts index 488e43d72..50a932c5b 100644 --- a/ui2abc/libarkts/src/arkts-api/utilities/extensions.ts +++ b/ui2abc/libarkts/src/arkts-api/utilities/extensions.ts @@ -49,9 +49,9 @@ export function extension_MethodDefinitionOnUpdate(this: MethodDefinition, origi } export function extension_ScriptFunctionGetPreferredReturnTypePointer(this: ScriptFunction): KNativePointer { - return global.es2panda._ScriptFunctionGetPreferredReturnType(global.context, this.peer) + return global.es2panda._Checker_ScriptFunctionGetPreferredReturnType(global.context, this.peer) } export function extension_ScriptFunctionSetPreferredReturnTypePointer(this: ScriptFunction, typePointer: KNativePointer): KNativePointer { - return global.es2panda._ScriptFunctionSetPreferredReturnType(global.context, this.peer, typePointer) + return global.es2panda._Checker_ScriptFunctionSetPreferredReturnType(global.context, this.peer, typePointer) } diff --git a/ui2abc/libarkts/src/generated/Es2pandaNativeModule.ts b/ui2abc/libarkts/src/generated/Es2pandaNativeModule.ts index 2b91f19e3..9b91746b2 100644 --- a/ui2abc/libarkts/src/generated/Es2pandaNativeModule.ts +++ b/ui2abc/libarkts/src/generated/Es2pandaNativeModule.ts @@ -29,7 +29,7 @@ import { KLong } from "@koalaui/interop" -// Improve: this type should be in interop +// TODO: this type should be in interop export type KNativePointerArray = BigUint64Array export class Es2pandaNativeModule { diff --git a/ui2abc/libarkts/src/generated/peers/ScriptFunction.ts b/ui2abc/libarkts/src/generated/peers/ScriptFunction.ts index 853fd3194..11e9ce840 100644 --- a/ui2abc/libarkts/src/generated/peers/ScriptFunction.ts +++ b/ui2abc/libarkts/src/generated/peers/ScriptFunction.ts @@ -42,6 +42,8 @@ import { Identifier } from "./Identifier" import { ReturnStatement } from "./ReturnStatement" import { TSTypeParameterDeclaration } from "./TSTypeParameterDeclaration" import { TypeNode } from "./TypeNode" +import { extension_ScriptFunctionGetPreferredReturnTypePointer } from "./../../reexport-for-generated" +import { extension_ScriptFunctionSetPreferredReturnTypePointer } from "./../../reexport-for-generated" export class ScriptFunction extends AstNode { constructor(pointer: KNativePointer) { @@ -265,6 +267,8 @@ export class ScriptFunction extends AstNode { global.generatedEs2panda._ScriptFunctionAddAnnotations(global.context, this.peer, passNode(annotations)) return this } + getPreferredReturnTypePointer = extension_ScriptFunctionGetPreferredReturnTypePointer + setPreferredReturnTypePointer = extension_ScriptFunctionSetPreferredReturnTypePointer protected readonly brandScriptFunction: undefined } export function isScriptFunction(node: object | undefined): node is ScriptFunction { diff --git a/ui2abc/libarkts/src/index.ts b/ui2abc/libarkts/src/index.ts index d927ebd89..bf93407f3 100644 --- a/ui2abc/libarkts/src/index.ts +++ b/ui2abc/libarkts/src/index.ts @@ -29,7 +29,6 @@ export * from "./arkts-api/CheckedBackFilter" export * from "./arkts-api/SetBaseOverloads" export * from "./arkts-api/plugins" export * from "./arkts-api/ImportStorage" -export * from "./arkts-api/SetReturnTypeToPreferred" export * from "./arkts-api/ProgramProvider" export * from "./arkts-api/node-utilities/Program" export * from "./arkts-api/node-utilities/ArkTsConfig" diff --git a/ui2abc/libarkts/src/plugin-utils.ts b/ui2abc/libarkts/src/plugin-utils.ts index 1c3cae7ac..3f4b8543b 100644 --- a/ui2abc/libarkts/src/plugin-utils.ts +++ b/ui2abc/libarkts/src/plugin-utils.ts @@ -17,17 +17,14 @@ import { Es2pandaContextState, PluginContext, ImportStorage, - setBaseOverloads, arktsGlobal, ChainExpressionFilter, ProgramTransformer, Program, - setReturnTypeToPreferred, ProgramProvider, CompilationOptions, dumpProgramSrcFormatted } from "./arkts-api" -import { AstNode } from "./reexport-for-generated" export interface RunTransformerHooks { onProgramTransformStart?(options: CompilationOptions, program: Program): void @@ -75,9 +72,6 @@ export function runTransformerOnProgram(program: Program, options: CompilationOp // Save currently existing imports in the program const importStorage = new ImportStorage(program, options.state == Es2pandaContextState.ES2PANDA_STATE_PARSED) - // Run some common plugins that should be run before plugin usage and depends on the current state - stateSpecificPreFilters(program, options.state) - // Run the plugin itself transform?.(program, options, pluginContext) @@ -116,16 +110,6 @@ export function runTransformer(prog: Program, state: Es2pandaContextState, trans } } -function setAllParents(ast: AstNode) { - arktsGlobal.es2panda._AstNodeUpdateAll(arktsGlobal.context, ast.peer) -} - -function stateSpecificPreFilters(program: Program, state: Es2pandaContextState) { - if (state == Es2pandaContextState.ES2PANDA_STATE_CHECKED) { - setReturnTypeToPreferred(program) - } -} - function stateSpecificPostFilters(program: Program, state: Es2pandaContextState) { if (state == Es2pandaContextState.ES2PANDA_STATE_CHECKED) { program.setAst(new ChainExpressionFilter().visitor(program.ast)) diff --git a/ui2abc/memo-plugin/demo/demo/demo.ets b/ui2abc/memo-plugin/demo/demo/demo.ets index b1459d445..01f692626 100644 --- a/ui2abc/memo-plugin/demo/demo/demo.ets +++ b/ui2abc/memo-plugin/demo/demo/demo.ets @@ -33,12 +33,13 @@ function Stringer( @memo content?: () => void ): void { - NodeAttach(():StringerNode => - new StringerNode(), (node: StringerNode): void => { - node.data = arg - console.log("I am recomputing with arg: ", arg) - content?.() - }) + NodeAttach(() => new StringerNode(), + (node: StringerNode): void => { + node.data = arg + console.log("I am recomputing with arg: ", arg) + content?.() + } + ) } const state = mutableState(17) diff --git a/ui2abc/memo-plugin/src/MemoFactory.ts b/ui2abc/memo-plugin/src/MemoFactory.ts index 2926254bc..573522bf6 100644 --- a/ui2abc/memo-plugin/src/MemoFactory.ts +++ b/ui2abc/memo-plugin/src/MemoFactory.ts @@ -342,7 +342,7 @@ export class factory { // Compute static createLambdaWrapper(node: arkts.Expression): arkts.ArrowFunctionExpression { - return arkts.factory.createArrowFunctionExpression( + const result = arkts.factory.createArrowFunctionExpression( arkts.factory.createScriptFunction( arkts.factory.createBlockStatement([ arkts.factory.createReturnStatement(node) @@ -358,13 +358,31 @@ export class factory { undefined, ) ) + if (arkts.isArrowFunctionExpression(node)) { + if (!arkts.global.es2panda._Checker_ScriptFunctionGetPreferredReturnType(arkts.global.context, node.function!.peer)) { + return result + } + console.log("START") + const rv = arkts.global.es2panda._Checker_ArrowFunctionExpressionCreateTypeAnnotation( + arkts.global.context, node.peer + ) + console.log(rv) + const str = arkts.global.generatedEs2panda._AstNodeDumpEtsSrcConst(arkts.global.context, rv) as arkts.KNativePointer + console.log("AST DUMP = ", arkts.unpackString(str)) + const type2 = arkts.global.es2panda._Checker_TypeNodeGetType(arkts.global.context, rv) + const str2 = arkts.global.es2panda._Checker_TypeToString(arkts.global.context, type2) as arkts.KNativePointer + console.log("STR = ", arkts.unpackString(str2)) + result.function!.setPreferredReturnTypePointer(type2) + console.log(arkts.global.es2panda._Checker_ScriptFunctionSignature(arkts.global.context, result.function!.peer)) + } + return result } static createComputeExpression(hash: arkts.Expression, node: arkts.Expression): arkts.CallExpression { return arkts.factory.createCallExpression( arkts.factory.createMemberExpression( arkts.factory.createIdentifier(RuntimeNames.CONTEXT, undefined), arkts.factory.createIdentifier(RuntimeNames.COMPUTE, undefined), - arkts.Es2pandaMemberExpressionKind.MEMBER_EXPRESSION_KIND_PROPERTY_ACCESS, + arkts.Es2pandaMemberExpressionKind.MEMBER_EXPRESSION_KIND_NONE, false, false ), -- Gitee From 6dd7e3eb67d9f143a8970db9ce1f3ac3c1355199 Mon Sep 17 00:00:00 2001 From: Igor Loginov Date: Fri, 18 Jul 2025 15:59:51 +0300 Subject: [PATCH 09/11] empty -- Gitee From 5af7d28bbafd55fcc45d2e21927e878f2cb7dadc Mon Sep 17 00:00:00 2001 From: Igor Loginov Date: Fri, 18 Jul 2025 18:26:58 +0300 Subject: [PATCH 10/11] more --- ui2abc/libarkts/native/src/bridges.cc | 94 +------------------ ui2abc/libarkts/src/Es2pandaNativeModule.ts | 30 ------ .../node-utilities/ScriptFunction.ts | 12 +-- .../src/arkts-api/utilities/public.ts | 26 ++++- ui2abc/memo-plugin/src/MemoFactory.ts | 27 ++---- 5 files changed, 37 insertions(+), 152 deletions(-) diff --git a/ui2abc/libarkts/native/src/bridges.cc b/ui2abc/libarkts/native/src/bridges.cc index 7cf8c037e..2b5bad943 100644 --- a/ui2abc/libarkts/native/src/bridges.cc +++ b/ui2abc/libarkts/native/src/bridges.cc @@ -403,6 +403,8 @@ void impl_DestroyGlobalContext(KNativePointer globalContextPtr) { KOALA_INTEROP_V1(DestroyGlobalContext, KNativePointer) // All these "Checker_" bridges are related to checker namespace in es2panda, so work with them carefully +// Checker.Type does reset on recheck, so modifying them makes no sence +// It seems that compiler does not provide API to convert Checker.Type to ir.Type KNativePointer impl_Checker_ScriptFunctionGetPreferredReturnType(KNativePointer context, KNativePointer node) { auto _context = reinterpret_cast(context); @@ -421,14 +423,6 @@ void impl_Checker_ScriptFunctionSetPreferredReturnType(KNativePointer context, K } KOALA_INTEROP_V3(Checker_ScriptFunctionSetPreferredReturnType, KNativePointer, KNativePointer, KNativePointer) -KNativePointer impl_Checker_TypeClone(KNativePointer context, KNativePointer type) -{ - auto _context = reinterpret_cast(context); - auto _type = reinterpret_cast(type); - return GetImpl()->TypeClone(_context, _type); -} -KOALA_INTEROP_2(Checker_TypeClone, KNativePointer, KNativePointer, KNativePointer) - KNativePointer impl_Checker_TypeToString(KNativePointer context, KNativePointer type) { auto _context = reinterpret_cast(context); @@ -438,90 +432,6 @@ KNativePointer impl_Checker_TypeToString(KNativePointer context, KNativePointer } KOALA_INTEROP_2(Checker_TypeToString, KNativePointer, KNativePointer, KNativePointer) -KNativePointer impl_Checker_CreateETSFunctionTypeChecker(KNativePointer context, KNativePointer signature) -{ - auto _context = reinterpret_cast(context); - auto _signature = reinterpret_cast(signature); - return GetImpl()->CreateETSFunctionTypeChecker(_context, _signature); -} -KOALA_INTEROP_2(Checker_CreateETSFunctionTypeChecker, KNativePointer, KNativePointer, KNativePointer) - -KNativePointer impl_Checker_CreateSignature(KNativePointer context, KNativePointer signatureInfo, KNativePointer returnType, KNativePointer func) -{ - auto _context = reinterpret_cast(context); - auto _signatureInfo = reinterpret_cast(signatureInfo); - auto _returnType = reinterpret_cast(returnType); - auto _func = reinterpret_cast(func); - return GetImpl()->CreateSignature(_context, _signatureInfo, _returnType, _func); -} -KOALA_INTEROP_4(Checker_CreateSignature, KNativePointer, KNativePointer, KNativePointer, KNativePointer, KNativePointer) - -KNativePointer impl_Checker_SignatureGetSignatureInfo(KNativePointer context, KNativePointer signature) -{ - auto _context = reinterpret_cast(context); - auto _signature = reinterpret_cast(signature); - return GetImpl()->SignatureGetSignatureInfo(_context, _signature); -} -KOALA_INTEROP_2(Checker_SignatureGetSignatureInfo, KNativePointer, KNativePointer, KNativePointer) - -KNativePointer impl_Checker_AstNodeCheck(KNativePointer context, KNativePointer astNode) -{ - auto _context = reinterpret_cast(context); - auto _astNode = reinterpret_cast(astNode); - return GetImpl()->AstNodeCheck(_context, _astNode); -} -KOALA_INTEROP_2(Checker_AstNodeCheck, KNativePointer, KNativePointer, KNativePointer) - -void impl_Checker_AstNodeCleanCheckInformation(KNativePointer context, KNativePointer astNode) -{ - auto _context = reinterpret_cast(context); - auto _astNode = reinterpret_cast(astNode); - GetImpl()->AstNodeCleanCheckInformation(_context, _astNode); -} -KOALA_INTEROP_V2(Checker_AstNodeCleanCheckInformation, KNativePointer, KNativePointer) - -KNativePointer impl_Checker_ArrowFunctionExpressionCreateReturnNodeFromType(KNativePointer context, KNativePointer astNode, KNativePointer type) -{ - auto _context = reinterpret_cast(context); - auto _astNode = reinterpret_cast(astNode); - auto _type = reinterpret_cast(type); - return GetImpl()->ArrowFunctionExpressionCreateReturnNodeFromType(_context, _astNode, _type); -} -KOALA_INTEROP_3(Checker_ArrowFunctionExpressionCreateReturnNodeFromType, KNativePointer, KNativePointer, KNativePointer, KNativePointer) - -KNativePointer impl_Checker_ArrowFunctionExpressionCreateTypeAnnotation(KNativePointer context, KNativePointer astNode) -{ - auto _context = reinterpret_cast(context); - auto _astNode = reinterpret_cast(astNode); - return GetImpl()->ArrowFunctionExpressionCreateTypeAnnotation(_context, _astNode); -} -KOALA_INTEROP_2(Checker_ArrowFunctionExpressionCreateTypeAnnotation, KNativePointer, KNativePointer, KNativePointer) - -KNativePointer impl_Checker_ScriptFunctionSignature(KNativePointer context, KNativePointer astNode) -{ - auto _context = reinterpret_cast(context); - auto _astNode = reinterpret_cast(astNode); - return GetImpl()->ScriptFunctionSignature(_context, _astNode); -} -KOALA_INTEROP_2(Checker_ScriptFunctionSignature, KNativePointer, KNativePointer, KNativePointer) - -void impl_Checker_CallExpressionSetUncheckedType(KNativePointer context, KNativePointer astNode, KNativePointer type) -{ - auto _context = reinterpret_cast(context); - auto _astNode = reinterpret_cast(astNode); - auto _type = reinterpret_cast(type); - return GetImpl()->CallExpressionSetUncheckedType(_context, _astNode, _type); -} -KOALA_INTEROP_V3(Checker_CallExpressionSetUncheckedType, KNativePointer, KNativePointer, KNativePointer) - -KBoolean impl_Checker_AstNodeIsTypedConst(KNativePointer context, KNativePointer astNode) -{ - auto _context = reinterpret_cast(context); - auto _astNode = reinterpret_cast(astNode); - return GetImpl()->AstNodeIsTypedConst(_context, _astNode); -} -KOALA_INTEROP_2(Checker_AstNodeIsTypedConst, KBoolean, KNativePointer, KNativePointer) - KNativePointer impl_Checker_TypeNodeGetType(KNativePointer context, KNativePointer astNode) { auto _context = reinterpret_cast(context); diff --git a/ui2abc/libarkts/src/Es2pandaNativeModule.ts b/ui2abc/libarkts/src/Es2pandaNativeModule.ts index 8ee71b578..3351d0290 100644 --- a/ui2abc/libarkts/src/Es2pandaNativeModule.ts +++ b/ui2abc/libarkts/src/Es2pandaNativeModule.ts @@ -169,39 +169,9 @@ export class Es2pandaNativeModule { _Checker_ScriptFunctionSetPreferredReturnType(context: KNativePointer, node: KNativePointer, type: KNativePointer): KNativePointer { throw new Error("Not implemented"); } - _Checker_TypeClone(context: KNativePointer, type: KNativePointer): KNativePointer { - throw new Error("Not implemented"); - } _Checker_TypeToString(context: KNativePointer, type: KNativePointer): KNativePointer { throw new Error("Not implemented"); } - _Checker_CreateETSFunctionTypeChecker(context: KNativePointer, signature: KNativePointer): KNativePointer { - throw new Error("Not implemented"); - } - _Checker_CreateSignature(context: KNativePointer, signatureInfo: KNativePointer, returnType: KNativePointer, func: KNativePointer): KNativePointer { - throw new Error("Not implemented"); - } - _Checker_AstNodeCheck(context: KNativePointer, node: KNativePointer): KNativePointer { - throw new Error("Not implemented"); - } - _Checker_AstNodeCleanCheckInformation(context: KNativePointer, node: KNativePointer): void { - throw new Error("Not implemented"); - } - _Checker_ArrowFunctionExpressionCreateReturnNodeFromType(context: KNativePointer, node: KNativePointer, type: KNativePointer): KNativePointer { - throw new Error("Not implemented"); - } - _Checker_ArrowFunctionExpressionCreateTypeAnnotation(context: KNativePointer, node: KNativePointer): KNativePointer { - throw new Error("Not implemented"); - } - _Checker_ScriptFunctionSignature(context: KNativePointer, node: KNativePointer): KNativePointer { - throw new Error("Not implemented"); - } - _Checker_CallExpressionSetUncheckedType(context: KNativePointer, node: KNativePointer, type: KNativePointer): void { - throw new Error("Not implemented"); - } - _Checker_AstNodeIsTyped(context: KNativePointer, node: KNativePointer): KBoolean { - throw new Error("Not implemented"); - } _Checker_TypeNodeGetType(context: KNativePointer, node: KNativePointer): KNativePointer { throw new Error("Not implemented"); } diff --git a/ui2abc/libarkts/src/arkts-api/node-utilities/ScriptFunction.ts b/ui2abc/libarkts/src/arkts-api/node-utilities/ScriptFunction.ts index a61cc2076..b940b89b9 100644 --- a/ui2abc/libarkts/src/arkts-api/node-utilities/ScriptFunction.ts +++ b/ui2abc/libarkts/src/arkts-api/node-utilities/ScriptFunction.ts @@ -38,7 +38,7 @@ export function createScriptFunction( dataflags: Es2pandaModifierFlags, ident: Identifier | undefined, annotations: readonly AnnotationUsage[] | undefined, - PreferredReturnTypePointer: KNativePointer | undefined, + preferredReturnTypePointer?: KNativePointer, ) { const res = ScriptFunction.createScriptFunction( databody, @@ -57,8 +57,8 @@ export function createScriptFunction( if (annotations) { res.setAnnotations(annotations) } - if (PreferredReturnTypePointer) { - res.setPreferredReturnTypePointer(PreferredReturnTypePointer) + if (preferredReturnTypePointer) { + res.setPreferredReturnTypePointer(preferredReturnTypePointer) } return res } @@ -74,7 +74,7 @@ export function updateScriptFunction( dataflags: Es2pandaModifierFlags, ident: Identifier | undefined, annotations: readonly AnnotationUsage[] | undefined, - PreferredReturnTypePointer: KNativePointer | undefined, + preferredReturnTypePointer?: KNativePointer, ) { if (isSameNativeObject(databody, original.body) && isSameNativeObject(typeParams, original.typeParams) @@ -85,7 +85,7 @@ export function updateScriptFunction( && isSameNativeObject(dataflags, original.modifierFlags) && isSameNativeObject(ident, original.id) && isSameNativeObject(annotations, original.annotations) - && PreferredReturnTypePointer == original.getPreferredReturnTypePointer() + && preferredReturnTypePointer == original.getPreferredReturnTypePointer() ) { return original } @@ -100,7 +100,7 @@ export function updateScriptFunction( dataflags, ident, annotations, - PreferredReturnTypePointer, + preferredReturnTypePointer, ), original ) diff --git a/ui2abc/libarkts/src/arkts-api/utilities/public.ts b/ui2abc/libarkts/src/arkts-api/utilities/public.ts index c2e27db4a..76234476d 100644 --- a/ui2abc/libarkts/src/arkts-api/utilities/public.ts +++ b/ui2abc/libarkts/src/arkts-api/utilities/public.ts @@ -17,7 +17,7 @@ import { global } from "../static/global" import { isNumber, throwError, withWarning } from "../../utils" import { KNativePointer, nullptr, KInt} from "@koalaui/interop" import { passNode, passNodeArray, unpackNodeArray, unpackNonNullableNode, passString, unpackString } from "./private" -import { Es2pandaContextState, Es2pandaModifierFlags, Es2pandaMethodDefinitionKind } from "../../generated/Es2pandaEnums" +import { Es2pandaContextState, Es2pandaModifierFlags, Es2pandaMethodDefinitionKind, Es2pandaPrimitiveType } from "../../generated/Es2pandaEnums" import type { AstNode } from "../peers/AstNode" import { isSameNativeObject } from "../peers/ArktsObject" import { @@ -40,10 +40,12 @@ import { isNumberLiteral, Property, MemberExpression, - isMethodDefinition + isMethodDefinition, + TypeNode, } from "../../generated" import { Config } from "../peers/Config" import { Context } from "../peers/Context" +import { factory } from "../factory/nodeFactory" import { NodeCache } from "../node-cache" import { listPrograms } from "../plugins" @@ -342,4 +344,22 @@ export function getProgramFromAstNode(node: AstNode): Program { export function importDeclarationInsert(node: ETSImportDeclaration, program: Program): void { global.es2panda._InsertETSImportDeclarationAndParse(global.context, program.peer, node.peer) -} \ No newline at end of file +} + +export function tryConvertCheckerTypeToTypeNode(typePeer: KNativePointer | undefined): TypeNode | undefined { + if (!typePeer) { + return undefined + } + const str = unpackString(global.es2panda._Checker_TypeToString(global.context, typePeer)) + if (str == "void") { + return factory.createETSPrimitiveType(Es2pandaPrimitiveType.PRIMITIVE_TYPE_VOID) + } + if (str == "String" || str == "StringerNode") { + return factory.createETSTypeReference( + factory.createETSTypeReferencePart( + factory.createIdentifier(str) + ) + ) + } + return undefined +} diff --git a/ui2abc/memo-plugin/src/MemoFactory.ts b/ui2abc/memo-plugin/src/MemoFactory.ts index 573522bf6..4a8c8e071 100644 --- a/ui2abc/memo-plugin/src/MemoFactory.ts +++ b/ui2abc/memo-plugin/src/MemoFactory.ts @@ -320,7 +320,10 @@ export class factory { } static deduceArrowWrapperType(arrow: arkts.ArrowFunctionExpression): arkts.TypeNode|undefined { const origType: arkts.TypeNode | undefined = arrow.function?.returnTypeAnnotation - if (origType == undefined) return undefined + const origPreferredType: arkts.TypeNode | undefined = arkts.tryConvertCheckerTypeToTypeNode( + arrow.function?.getPreferredReturnTypePointer() + ) + if (origType == undefined && origPreferredType == undefined) return undefined const params = arrow.function?.params?.map(it => { const param = it as arkts.ETSParameterExpression return arkts.factory.createETSParameterExpression( @@ -333,7 +336,7 @@ export class factory { return arkts.factory.createETSFunctionType( undefined, params, - origType.clone(), + origType ? origType.clone() : origPreferredType, false, arkts.Es2pandaScriptFunctionFlags.SCRIPT_FUNCTION_FLAGS_NONE, undefined @@ -342,7 +345,7 @@ export class factory { // Compute static createLambdaWrapper(node: arkts.Expression): arkts.ArrowFunctionExpression { - const result = arkts.factory.createArrowFunctionExpression( + return arkts.factory.createArrowFunctionExpression( arkts.factory.createScriptFunction( arkts.factory.createBlockStatement([ arkts.factory.createReturnStatement(node) @@ -358,24 +361,6 @@ export class factory { undefined, ) ) - if (arkts.isArrowFunctionExpression(node)) { - if (!arkts.global.es2panda._Checker_ScriptFunctionGetPreferredReturnType(arkts.global.context, node.function!.peer)) { - return result - } - console.log("START") - const rv = arkts.global.es2panda._Checker_ArrowFunctionExpressionCreateTypeAnnotation( - arkts.global.context, node.peer - ) - console.log(rv) - const str = arkts.global.generatedEs2panda._AstNodeDumpEtsSrcConst(arkts.global.context, rv) as arkts.KNativePointer - console.log("AST DUMP = ", arkts.unpackString(str)) - const type2 = arkts.global.es2panda._Checker_TypeNodeGetType(arkts.global.context, rv) - const str2 = arkts.global.es2panda._Checker_TypeToString(arkts.global.context, type2) as arkts.KNativePointer - console.log("STR = ", arkts.unpackString(str2)) - result.function!.setPreferredReturnTypePointer(type2) - console.log(arkts.global.es2panda._Checker_ScriptFunctionSignature(arkts.global.context, result.function!.peer)) - } - return result } static createComputeExpression(hash: arkts.Expression, node: arkts.Expression): arkts.CallExpression { return arkts.factory.createCallExpression( -- Gitee From 5620852ed0576b7d384472a9b5c7703c758d3fb2 Mon Sep 17 00:00:00 2001 From: Igor Loginov Date: Fri, 18 Jul 2025 18:42:30 +0300 Subject: [PATCH 11/11] disable temporary --- ui2abc/libarkts/src/Es2pandaNativeModule.ts | 2 +- ui2abc/libarkts/src/arkts-api/utilities/extensions.ts | 4 ++-- ui2abc/memo-plugin/src/MemoFactory.ts | 10 +++++----- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/ui2abc/libarkts/src/Es2pandaNativeModule.ts b/ui2abc/libarkts/src/Es2pandaNativeModule.ts index 3351d0290..53e1cb9e9 100644 --- a/ui2abc/libarkts/src/Es2pandaNativeModule.ts +++ b/ui2abc/libarkts/src/Es2pandaNativeModule.ts @@ -166,7 +166,7 @@ export class Es2pandaNativeModule { _Checker_ScriptFunctionGetPreferredReturnType(context: KNativePointer, node: KNativePointer): KNativePointer { throw new Error("Not implemented"); } - _Checker_ScriptFunctionSetPreferredReturnType(context: KNativePointer, node: KNativePointer, type: KNativePointer): KNativePointer { + _Checker_ScriptFunctionSetPreferredReturnType(context: KNativePointer, node: KNativePointer, type: KNativePointer): void { throw new Error("Not implemented"); } _Checker_TypeToString(context: KNativePointer, type: KNativePointer): KNativePointer { diff --git a/ui2abc/libarkts/src/arkts-api/utilities/extensions.ts b/ui2abc/libarkts/src/arkts-api/utilities/extensions.ts index 50a932c5b..01b553eed 100644 --- a/ui2abc/libarkts/src/arkts-api/utilities/extensions.ts +++ b/ui2abc/libarkts/src/arkts-api/utilities/extensions.ts @@ -52,6 +52,6 @@ export function extension_ScriptFunctionGetPreferredReturnTypePointer(this: Scri return global.es2panda._Checker_ScriptFunctionGetPreferredReturnType(global.context, this.peer) } -export function extension_ScriptFunctionSetPreferredReturnTypePointer(this: ScriptFunction, typePointer: KNativePointer): KNativePointer { - return global.es2panda._Checker_ScriptFunctionSetPreferredReturnType(global.context, this.peer, typePointer) +export function extension_ScriptFunctionSetPreferredReturnTypePointer(this: ScriptFunction, typePointer: KNativePointer): void { + global.es2panda._Checker_ScriptFunctionSetPreferredReturnType(global.context, this.peer, typePointer) } diff --git a/ui2abc/memo-plugin/src/MemoFactory.ts b/ui2abc/memo-plugin/src/MemoFactory.ts index 4a8c8e071..a39ef1003 100644 --- a/ui2abc/memo-plugin/src/MemoFactory.ts +++ b/ui2abc/memo-plugin/src/MemoFactory.ts @@ -320,10 +320,10 @@ export class factory { } static deduceArrowWrapperType(arrow: arkts.ArrowFunctionExpression): arkts.TypeNode|undefined { const origType: arkts.TypeNode | undefined = arrow.function?.returnTypeAnnotation - const origPreferredType: arkts.TypeNode | undefined = arkts.tryConvertCheckerTypeToTypeNode( - arrow.function?.getPreferredReturnTypePointer() - ) - if (origType == undefined && origPreferredType == undefined) return undefined + // const origPreferredType: arkts.TypeNode | undefined = arkts.tryConvertCheckerTypeToTypeNode( + // arrow.function?.getPreferredReturnTypePointer() + // ) + if (origType == undefined/* && origPreferredType == undefined*/) return undefined const params = arrow.function?.params?.map(it => { const param = it as arkts.ETSParameterExpression return arkts.factory.createETSParameterExpression( @@ -336,7 +336,7 @@ export class factory { return arkts.factory.createETSFunctionType( undefined, params, - origType ? origType.clone() : origPreferredType, + /*origType ? */origType.clone()/* : origPreferredType*/, false, arkts.Es2pandaScriptFunctionFlags.SCRIPT_FUNCTION_FLAGS_NONE, undefined -- Gitee