From e72a9d81db90e8323b16e30c1016eea86dd58552 Mon Sep 17 00:00:00 2001 From: Alexander Gorshenev Date: Wed, 30 Jul 2025 11:20:58 +0300 Subject: [PATCH] More cases for @Build to @memo translation Signed-off-by: Alexander Gorshenev --- .../ui-plugins/src/annotation-translator.ts | 10 +++++-- ui2abc/ui-plugins/src/utils.ts | 27 +++++++++++++++++-- 2 files changed, 33 insertions(+), 4 deletions(-) diff --git a/ui2abc/ui-plugins/src/annotation-translator.ts b/ui2abc/ui-plugins/src/annotation-translator.ts index aee2d4e32..3ec8af741 100644 --- a/ui2abc/ui-plugins/src/annotation-translator.ts +++ b/ui2abc/ui-plugins/src/annotation-translator.ts @@ -14,7 +14,7 @@ */ import * as arkts from "@koalaui/libarkts" -import { DecoratorNames, hasDecorator, hasBuilderDecorator, replaceDecorator } from "./utils" +import { DecoratorNames, hasDecorator, hasBuilderDecorator, replaceParameterDecorator, replaceTypeAliasDecorator, replaceFunctionTypeDecorator } from "./utils" import { annotation } from "./common/arkts-utils" import { CustomComponentNames, InternalAnnotations } from "./utils" @@ -55,7 +55,13 @@ export class AnnotationsTransformer extends arkts.AbstractVisitor { return node } if (arkts.isETSParameterExpression(node) && hasDecorator(node, DecoratorNames.BUILDER)) { - return replaceDecorator(node, DecoratorNames.BUILDER, InternalAnnotations.MEMO) + return replaceParameterDecorator(node, DecoratorNames.BUILDER, InternalAnnotations.MEMO) + } + if (arkts.isTSTypeAliasDeclaration(node) && hasDecorator(node, DecoratorNames.BUILDER)) { + return replaceTypeAliasDecorator(node, DecoratorNames.BUILDER, InternalAnnotations.MEMO) + } + if (arkts.isETSFunctionType(node) && hasDecorator(node, DecoratorNames.BUILDER)) { + return replaceFunctionTypeDecorator(node, DecoratorNames.BUILDER, InternalAnnotations.MEMO) } return node } diff --git a/ui2abc/ui-plugins/src/utils.ts b/ui2abc/ui-plugins/src/utils.ts index 072802416..78b7c399f 100644 --- a/ui2abc/ui-plugins/src/utils.ts +++ b/ui2abc/ui-plugins/src/utils.ts @@ -298,7 +298,17 @@ export function isDecoratorAnnotation(anno: arkts.AnnotationUsage, decoratorName return getAnnotationName(anno) === decoratorName; } -export function hasDecorator(property: arkts.ClassProperty | arkts.ClassDefinition | arkts.ClassDeclaration | arkts.MethodDefinition | arkts.FunctionDeclaration | arkts.ETSParameterExpression, decoratorName: DecoratorNames): boolean { +export function hasDecorator(property: + arkts.ClassProperty | + arkts.ClassDefinition | + arkts.ClassDeclaration | + arkts.MethodDefinition | + arkts.FunctionDeclaration | + arkts.ETSParameterExpression | + arkts.TSTypeAliasDeclaration | + arkts.ETSFunctionType, + decoratorName: DecoratorNames +): boolean { if (arkts.isMethodDefinition(property)) { return property.function!.annotations.some((anno) => isDecoratorAnnotation(anno, decoratorName)); } @@ -308,12 +318,25 @@ export function hasDecorator(property: arkts.ClassProperty | arkts.ClassDefiniti return property.annotations.some((anno) => isDecoratorAnnotation(anno, decoratorName)); } -export function replaceDecorator(node: arkts.ETSParameterExpression, oldName: DecoratorNames, newName: string) { +export function replaceParameterDecorator(node: arkts.ETSParameterExpression, oldName: DecoratorNames, newName: string) { if (node.annotations.find(annotation => annotation.baseName?.name == oldName) == undefined) return node let newAnnotations = node.annotations?.map(anno => isDecoratorAnnotation(anno, oldName) ? annotation(newName) : anno) return arkts.factory.updateETSParameterExpression(node, node.ident, node.isOptional, node.initializer, newAnnotations) } +export function replaceTypeAliasDecorator(node: arkts.TSTypeAliasDeclaration, oldName: DecoratorNames, newName: string) { + if (node.annotations.find(annotation => annotation.baseName?.name == oldName) == undefined) return node + let newAnnotations = node.annotations?.map(anno => isDecoratorAnnotation(anno, oldName) ? annotation(newName) : anno) + return arkts.factory.updateTSTypeAliasDeclaration(node, node.id, node.typeParams, node.typeAnnotation, newAnnotations, node.modifierFlags) +} + +export function replaceFunctionTypeDecorator(node: arkts.ETSFunctionType, oldName: DecoratorNames, newName: string) { + if (node.annotations.find(annotation => annotation.baseName?.name == oldName) == undefined) return node + let newAnnotations = node.annotations?.map(anno => isDecoratorAnnotation(anno, oldName) ? annotation(newName) : anno) + return arkts.factory.updateETSFunctionType(node, node.typeParams, node.params, node.returnType, node.isExtensionFunction, node.flags, newAnnotations) +} + + export function hasBuilderDecorator(property: arkts.ClassProperty | arkts.ClassDefinition | arkts.ClassDeclaration | arkts.MethodDefinition | arkts.FunctionDeclaration): boolean { return hasDecorator(property, DecoratorNames.BUILDER) || hasDecorator(property, DecoratorNames.LOCAL_BUILDER) } -- Gitee