@@ -184,15 +184,38 @@ export class TraceNode extends Node implements PossiblyNamed {
184
184
const innerRef = this . nodeAdapter . getReference ( name ) ;
185
185
if ( innerRef ) {
186
186
const reference = new ReferenceByName < TraceNode > ( innerRef . name ) ;
187
- if ( innerRef ?. referred ) {
188
- reference . referred = this . make ( innerRef . referred ) ;
187
+ const refTarget = innerRef ?. referred ;
188
+ if ( refTarget instanceof NodeAdapter ) {
189
+ const referred = this . make ( innerRef . referred ) ;
190
+ reference . referred = referred . withParent ( this . computeParentForReference ( refTarget ) ) ;
189
191
}
190
192
return reference ;
191
193
} else {
192
194
return undefined ;
193
195
}
194
196
}
195
197
198
+ private computeParentForReference ( refTarget : NodeAdapter ) {
199
+ let node : TraceNode | undefined = undefined ;
200
+ let tempParent : TraceNode | undefined = undefined ;
201
+ while ( refTarget . parent ) {
202
+ const parent = this . make ( refTarget . parent ) ;
203
+ if ( node ) {
204
+ node . parent = parent ;
205
+ } else {
206
+ tempParent = parent ;
207
+ }
208
+ node = parent ;
209
+ refTarget = refTarget . parent ;
210
+ }
211
+ if ( tempParent ) {
212
+ const newParent = this . getRoot ( ) . get ( tempParent . getPathFromRoot ( ) ) ;
213
+ if ( newParent instanceof Node ) {
214
+ return newParent ;
215
+ }
216
+ }
217
+ }
218
+
196
219
private makeChild ( child : Node | undefined | NodeAdapter , name : string | symbol ) {
197
220
if ( child instanceof NodeAdapter ) {
198
221
return this . make ( child ) . withParent ( this ) ;
@@ -259,4 +282,23 @@ export class TraceNode extends Node implements PossiblyNamed {
259
282
isStatement ( ) : boolean {
260
283
return this . nodeAdapter . isStatement ( ) ;
261
284
}
285
+
286
+ get ( path : ( string | number ) [ ] ) {
287
+ // eslint-disable-next-line @typescript-eslint/no-this-alias
288
+ let node : Node | Node [ ] | undefined = this ;
289
+ for ( const elem of path ) {
290
+ if ( typeof elem == "string" ) {
291
+ if ( node instanceof Node ) {
292
+ node = node . getChild ( elem ) ;
293
+ } else {
294
+ throw new Error ( "Invalid path at " + elem + ", expected node, got " + node ) ;
295
+ }
296
+ } else if ( Array . isArray ( node ) ) {
297
+ node = node [ elem ] ;
298
+ } else {
299
+ throw new Error ( "Invalid path at " + elem + ", expected children, got " + node ) ;
300
+ }
301
+ }
302
+ return node ;
303
+ }
262
304
}
0 commit comments