diff --git a/arkui-plugins/common/program-visitor.ts b/arkui-plugins/common/program-visitor.ts index 9327b9075aadf6c5ecde84d8f41361d1f7ae06de..6e17f88e54dec52cdf087c9b18d2e555c4c00f5a 100644 --- a/arkui-plugins/common/program-visitor.ts +++ b/arkui-plugins/common/program-visitor.ts @@ -271,6 +271,7 @@ export class ProgramVisitor extends AbstractVisitor { } this.visitTransformer(transformer, script, externalSourceName, program); arkts.setAllParents(script); + arkts.setAllRange(script); if (!transformer.isExternal) { debugDumpAstNode( script, diff --git a/koala-wrapper/native/src/bridges.cc b/koala-wrapper/native/src/bridges.cc index 380cab265664a6d45de5f175cbd550fb8eb935d3..e88a6e43b833fbd05b1ae1115f2e8e1bcc15bd07 100644 --- a/koala-wrapper/native/src/bridges.cc +++ b/koala-wrapper/native/src/bridges.cc @@ -633,6 +633,16 @@ void impl_AstNodeSetStart(KNativePointer context, KNativePointer receiver, KNati } KOALA_INTEROP_V3(AstNodeSetStart, KNativePointer, KNativePointer, KNativePointer) +void impl_AstNodeSetRange(KNativePointer context, KNativePointer receiver, KNativePointer range) +{ + const auto _context = reinterpret_cast(context); + const auto _receiver = reinterpret_cast(receiver); + const auto _range = reinterpret_cast(range); + GetImpl()->AstNodeSetRange(_context, _receiver, _range); + return; +} +KOALA_INTEROP_V3(AstNodeSetRange, KNativePointer, KNativePointer, KNativePointer); + KNativePointer impl_AstNodeEndConst(KNativePointer context, KNativePointer receiver) { const auto _context = reinterpret_cast(context); diff --git a/koala-wrapper/native/src/common.cc b/koala-wrapper/native/src/common.cc index 29baa82db80f92c41980e9f36373686a97da7f75..3ce928a953b3ab5b01ca006dcfd7fee4a6261cf4 100644 --- a/koala-wrapper/native/src/common.cc +++ b/koala-wrapper/native/src/common.cc @@ -363,6 +363,67 @@ KBoolean impl_ProgramCanSkipPhases(KNativePointer context, KNativePointer progra } KOALA_INTEROP_2(ProgramCanSkipPhases, KBoolean, KNativePointer, KNativePointer) +// 1. 线程局部变量只保留 context 指针 +thread_local es2panda_Context *cachedCtx; + +// 2. 全局(或局部)指针,指向当前父节点的 range +static es2panda_SourceRange *cachedParentRange = nullptr; + +// 3. 给子节点设置 range(带行列号判断) +static void SetChildRange(es2panda_AstNode *child) +{ + /*---------- 取子节点自己的 range ----------*/ + es2panda_SourceRange *childRange = + GetImpl()->AstNodeRangeConst(cachedCtx, child); + if (!childRange) // 容错:拿不到 range 直接返回 + return; + + KNativePointer childStart = + GetImpl()->SourceRangeStart(cachedCtx, childRange); + KNativePointer childEnd = + GetImpl()->SourceRangeEnd(cachedCtx, childRange); + + /*---------- 取 start / end 的行列号 ----------*/ + auto startLine = GetImpl()->SourcePositionLine(cachedCtx, childStart); + auto startCol = GetImpl()->SourcePositionCol(cachedCtx, childStart); + auto endLine = GetImpl()->SourcePositionLine(cachedCtx, childEnd); + auto endCol = GetImpl()->SourcePositionCol(cachedCtx, childEnd); + + /*---------- 只有行列均为 1 才用父 range ----------*/ + if (startLine == 1 && startCol == 1 && + endLine == 1 && endCol == 1) + { + GetImpl()->AstNodeSetRange(cachedCtx, child, cachedParentRange); + } + // 否则保持子节点原有 range,不做任何操作 +} + +// 4. 对每个父节点执行的回调 +static void PropagateParentRange(es2panda_AstNode *parent, void *arg) +{ + cachedCtx = static_cast(arg); + + // 拿到父节点的 range 指针 + es2panda_SourceRange *parentRange = GetImpl()->AstNodeRangeConst(cachedCtx, parent); + cachedParentRange = parentRange; // 只用指针,不拷贝值 + + GetImpl()->AstNodeIterateConst(cachedCtx, parent, SetChildRange); +} + +// 5. 导出函数保持不变 +KNativePointer impl_AstNodeSetAllRange(KNativePointer contextPtr, + KNativePointer programPtr) +{ + auto context = reinterpret_cast(contextPtr); + auto program = reinterpret_cast(programPtr); + + GetImpl()->AstNodeForEach(program, PropagateParentRange, context); + return program; +} + +KOALA_INTEROP_2(AstNodeSetAllRange, + KNativePointer, KNativePointer, KNativePointer) + /* ----------------------------------------------------------------------------------------------------------------------------- */ diff --git a/koala-wrapper/src/Es2pandaNativeModule.ts b/koala-wrapper/src/Es2pandaNativeModule.ts index 2ade57a5adb790745ec5c02ff8685ff204062eb0..2235ccb844e9216c4423f84c4f00cfa5b69f3ab9 100644 --- a/koala-wrapper/src/Es2pandaNativeModule.ts +++ b/koala-wrapper/src/Es2pandaNativeModule.ts @@ -684,6 +684,9 @@ export class Es2pandaNativeModule { _AstNodeUpdateAll(context: KPtr, node: KPtr): void { throw new Error('Not implemented'); } + _AstNodeSetAllRange(context: KPtr, node: KPtr): void { + throw new Error('Not implemented'); + } _AstNodeSetOriginalNode(context: KPtr, ast: KPtr, originalNode: KPtr): void { throw new Error('Not implemented'); } @@ -741,6 +744,9 @@ export class Es2pandaNativeModule { _IsETSUnionType(ast: KPtr): KBoolean { throw new Error('Not implemented'); } + _AstNodeSetRange(context: KNativePointer, node: KNativePointer, range: KNativePointer): KNativePointer { + throw new Error('Not implemented'); + } _IsETSFunctionType(ast: KPtr): KBoolean { throw new Error('Not implemented'); diff --git a/koala-wrapper/src/arkts-api/peers/AstNode.ts b/koala-wrapper/src/arkts-api/peers/AstNode.ts index 6d49f5da998e17e29a875d811c038959fc96cb90..b98bfb61704fc32d8aa35ad854a5326c716e9def 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 { SourceRange } from './SourceRange'; export abstract class AstNode extends ArktsObject { protected constructor(peer: KNativePointer) { @@ -152,6 +153,14 @@ export abstract class AstNode extends ArktsObject { public set endPosition(end: SourcePosition) { global.es2panda._AstNodeSetEnd(global.context, this.peer, end.peer); } + + public get range(): SourceRange { + return new SourceRange(global.es2panda._AstNodeRangeConst(global.context, this.peer)); + } + + public set range(range: SourceRange) { + global.es2panda._AstNodeSetRange(global.context, this.peer, range.peer); + } } export class UnsupportedNode extends AstNode { diff --git a/koala-wrapper/src/arkts-api/utilities/public.ts b/koala-wrapper/src/arkts-api/utilities/public.ts index b7e5706196b31a9e5c0fc00c8dfb2a3f2595f542..c619f83dc495cfdd92b810f703b13262c50b8a01 100644 --- a/koala-wrapper/src/arkts-api/utilities/public.ts +++ b/koala-wrapper/src/arkts-api/utilities/public.ts @@ -261,6 +261,10 @@ export function setAllParents(ast: AstNode): void { global.es2panda._AstNodeUpdateAll(global.context, ast.peer); } +export function setAllRange(ast: AstNode): void { + global.es2panda._AstNodeSetAllRange(global.context, ast.peer); +} + export function generateTsDeclarationsFromContext( outputDeclEts: string, outputEts: string,