diff --git a/koala-wrapper/src/arkts-api/peers/AstNode.ts b/koala-wrapper/src/arkts-api/peers/AstNode.ts index 6d49f5da998e17e29a875d811c038959fc96cb90..70aa3907923b427696b19ae9466f714c1436868c 100644 --- a/koala-wrapper/src/arkts-api/peers/AstNode.ts +++ b/koala-wrapper/src/arkts-api/peers/AstNode.ts @@ -20,6 +20,7 @@ import { throwError } from '../../utils'; import { Es2pandaModifierFlags } from '../../generated/Es2pandaEnums'; import { ArktsObject } from './ArktsObject'; import { SourcePosition } from './SourcePosition'; +import { copyCacheToClonedNode } from '../utilities/nodeCache'; export abstract class AstNode extends ArktsObject { protected constructor(peer: KNativePointer) { @@ -99,6 +100,7 @@ export abstract class AstNode extends ArktsObject { const clonedNode = unpackNonNullableNode( global.generatedEs2panda._AstNodeClone(global.context, this.peer, this.parent?.peer ?? nullptr) ); + copyCacheToClonedNode(this, clonedNode); clonedNode.parent = undefined; return clonedNode as this; } diff --git a/koala-wrapper/src/arkts-api/utilities/nodeCache.ts b/koala-wrapper/src/arkts-api/utilities/nodeCache.ts index 046b515367307e4585a72fb2355c588cdcd08b04..9d37f2e652b24033c1284818f1d3248d0c8c670d 100644 --- a/koala-wrapper/src/arkts-api/utilities/nodeCache.ts +++ b/koala-wrapper/src/arkts-api/utilities/nodeCache.ts @@ -18,6 +18,7 @@ import { Es2pandaAstNodeType } from '../../Es2pandaEnums'; import { AstNode, UnsupportedNode } from '../peers/AstNode'; import { global } from '../static/global'; import { getOrPut, nodeByType } from '../class-by-peer'; +import { traverseASTSync } from './private'; export interface AstNodeCacheValue { peer: KNativePointer; @@ -37,6 +38,22 @@ export interface AstNodeCacheValueMetadata { hasMemoEntry?: boolean; } +export function copyCacheToClonedNode(original: AstNode, cloned: AstNode, shouldRefresh?: boolean): void { + const traverseCallbackFn = (_original: AstNode, _cloned: AstNode): boolean => { + if (!NodeCache.getInstance().has(_original)) { + return false; + } + if (shouldRefresh) { + NodeCache.getInstance().refresh(_original, _cloned); + } else { + const value = NodeCache.getInstance().get(_original)!; + NodeCache.getInstance().collect(_cloned, value.metadata); + } + return false; + }; + traverseASTSync(original, cloned, traverseCallbackFn); +} + export class NodeCache { private _isCollected: boolean = false; private cacheMap: Map; diff --git a/koala-wrapper/src/arkts-api/utilities/private.ts b/koala-wrapper/src/arkts-api/utilities/private.ts index bab346fc8cc22b3ae7a201e9812c7ec8f5622ca9..ed5b22b5ca8812c8e8011a2c933844ee641bcf73 100644 --- a/koala-wrapper/src/arkts-api/utilities/private.ts +++ b/koala-wrapper/src/arkts-api/utilities/private.ts @@ -197,3 +197,19 @@ export function attachModifiers(node: T, original: T): T { node.modifiers = original.modifiers; return node; } + +export function traverseASTSync( + left: AstNode, + right: AstNode, + callbackFn: (left: AstNode, right: AstNode) => boolean +): void { + const shouldStop = callbackFn(left, right); + if (shouldStop) { + return; + } + const leftChildren = left.getChildren(); + const rightChildren = right.getChildren(); + for (let i = 0; i < leftChildren.length; i++) { + traverseASTSync(leftChildren[i], rightChildren[i], callbackFn); + } +}