diff --git a/ui2abc/libarkts/src/arkts-api/node-utilities/ArrowFunctionExpression.ts b/ui2abc/libarkts/src/arkts-api/node-utilities/ArrowFunctionExpression.ts index cde917fbf48318f4765a56e9dc122b77566db141..ee94ffeecbdc01300d461462ed5e4cc20cf53984 100644 --- a/ui2abc/libarkts/src/arkts-api/node-utilities/ArrowFunctionExpression.ts +++ b/ui2abc/libarkts/src/arkts-api/node-utilities/ArrowFunctionExpression.ts @@ -16,6 +16,7 @@ import { ArrowFunctionExpression, AnnotationUsage, ScriptFunction } from "../../generated" import { isSameNativeObject } from "../peers/ArktsObject" import { updateNodeByNode } from "../utilities/private" +import type { AstNode } from '../peers/AstNode'; export function createArrowFunctionExpression( func?: ScriptFunction, @@ -30,20 +31,55 @@ export function createArrowFunctionExpression( return res } +// export function updateArrowFunctionExpression( +// original: ArrowFunctionExpression, +// func?: ScriptFunction, +// annotations?: readonly AnnotationUsage[], +// ): ArrowFunctionExpression { +// if (isSameNativeObject(original.function, func) +// && isSameNativeObject(original.annotations, annotations)) { +// return original +// } +// return updateNodeByNode( +// createArrowFunctionExpression( +// func, +// annotations, +// ), +// original +// ) +// } + +export function updateThenAttach( + update: (original: T, ...args: ARGS) => T, + ...attachFuncs: ((node: T, original: T) => T)[] +): (node: T, ...args: ARGS) => T { + return (node: T, ...args: ARGS) => { + let _node: T = update(node, ...args); + attachFuncs.forEach((attach) => { + _node = attach(_node, node); + }); + return _node; + }; +} + +export function attachModifiers(node: T, original: T): T { + node.modifiers = original.modifiers; + return node; +} + + export function updateArrowFunctionExpression( original: ArrowFunctionExpression, - func?: ScriptFunction, - annotations?: readonly AnnotationUsage[], + func: ScriptFunction, ): ArrowFunctionExpression { - if (isSameNativeObject(original.function, func) - && isSameNativeObject(original.annotations, annotations)) { - return original + if (isSameNativeObject(func, original.function)) { + return original; } - return updateNodeByNode( - createArrowFunctionExpression( - func, - annotations, - ), - original - ) -} + + const update = updateThenAttach( + ArrowFunctionExpression.updateArrowFunctionExpression, + attachModifiers, + (node: ArrowFunctionExpression, original: ArrowFunctionExpression) => node.setAnnotations(original.annotations) + ); + return update(original, func); +} \ No newline at end of file