@@ -14,6 +14,7 @@ import type {
14
14
OriginalScope ,
15
15
ScopeInfo ,
16
16
SourceMapJson ,
17
+ SubRangeBinding ,
17
18
} from "../scopes.d.ts" ;
18
19
import { TokenIterator } from "../vlq.ts" ;
19
20
@@ -74,6 +75,7 @@ class Decoder {
74
75
readonly #rangeStack: GeneratedRange [ ] = [ ] ;
75
76
76
77
#flatOriginalScopes: OriginalScope [ ] = [ ] ;
78
+ #subRangeBindingsForRange = new Map < number , [ number , number , number ] [ ] > ( ) ;
77
79
78
80
constructor ( scopes : string , names : string [ ] , options ?: { mode : DecodeMode } ) {
79
81
this . #encodedScopes = scopes ;
@@ -169,6 +171,21 @@ class Decoder {
169
171
this . #handleGeneratedRangeBindingsItem( valueIdxs ) ;
170
172
break ;
171
173
}
174
+ case Tag . GENERATED_RANGE_SUBRANGE_BINDING : {
175
+ const variableIndex = iter . nextUnsignedVLQ ( ) ;
176
+ const bindings : [ number , number , number ] [ ] = [ ] ;
177
+
178
+ while ( iter . hasNext ( ) && iter . peek ( ) !== "," ) {
179
+ bindings . push ( [
180
+ iter . nextUnsignedVLQ ( ) ,
181
+ iter . nextUnsignedVLQ ( ) ,
182
+ iter . nextUnsignedVLQ ( ) ,
183
+ ] ) ;
184
+ }
185
+
186
+ this . #recordGeneratedSubRangeBindingItem( variableIndex , bindings ) ;
187
+ break ;
188
+ }
172
189
case Tag . GENERATED_RANGE_CALL_SITE : {
173
190
this . #handleGeneratedRangeCallSite(
174
191
iter . nextUnsignedVLQ ( ) ,
@@ -331,6 +348,7 @@ class Decoder {
331
348
}
332
349
333
350
this . #rangeStack. push ( range ) ;
351
+ this . #subRangeBindingsForRange. clear ( ) ;
334
352
}
335
353
336
354
#handleGeneratedRangeBindingsItem( valueIdxs : number [ ] ) {
@@ -351,6 +369,19 @@ class Decoder {
351
369
}
352
370
}
353
371
372
+ #recordGeneratedSubRangeBindingItem(
373
+ variableIndex : number ,
374
+ bindings : [ number , number , number ] [ ] ,
375
+ ) {
376
+ if ( this . #subRangeBindingsForRange. has ( variableIndex ) ) {
377
+ this . #throwInStrictMode(
378
+ "Encountered multiple GENERATED_RANGE_SUBRANGE_BINDING items for the same variable" ,
379
+ ) ;
380
+ return ;
381
+ }
382
+ this . #subRangeBindingsForRange. set ( variableIndex , bindings ) ;
383
+ }
384
+
354
385
#handleGeneratedRangeCallSite(
355
386
sourceIndex : number ,
356
387
line : number ,
@@ -392,6 +423,8 @@ class Decoder {
392
423
column : this . #rangeState. column ,
393
424
} ;
394
425
426
+ this . #handleGeneratedRangeSubRangeBindings( range ) ;
427
+
395
428
if ( this . #rangeStack. length > 0 ) {
396
429
const parent = this . #rangeStack. at ( - 1 ) ! ;
397
430
range . parent = parent ;
@@ -401,6 +434,48 @@ class Decoder {
401
434
}
402
435
}
403
436
437
+ #handleGeneratedRangeSubRangeBindings( range : GeneratedRange ) {
438
+ for ( const [ variableIndex , bindings ] of this . #subRangeBindingsForRange) {
439
+ const value = range . values [ variableIndex ] ;
440
+ const subRanges : SubRangeBinding [ ] = [ ] ;
441
+ range . values [ variableIndex ] = subRanges ;
442
+
443
+ let lastLine = range . start . line ;
444
+ let lastColumn = range . start . column ;
445
+
446
+ subRanges . push ( {
447
+ from : { line : lastLine , column : lastColumn } ,
448
+ to : { line : 0 , column : 0 } ,
449
+ value : value as string | undefined ,
450
+ } ) ;
451
+
452
+ for ( const [ binding , line , column ] of bindings ) {
453
+ lastLine += line ;
454
+ if ( line === 0 ) {
455
+ lastColumn += column ;
456
+ } else {
457
+ lastColumn = column ;
458
+ }
459
+
460
+ subRanges . push ( {
461
+ from : { line : lastLine , column : lastColumn } ,
462
+ to : { line : 0 , column : 0 } , // This will be fixed in the post-processing step.
463
+ value : binding === 0 ? undefined : this . #resolveName( binding - 1 ) ,
464
+ } ) ;
465
+ }
466
+ }
467
+
468
+ for ( const value of range . values ) {
469
+ if ( Array . isArray ( value ) ) {
470
+ const subRanges = value ;
471
+ for ( let i = 0 ; i < subRanges . length - 1 ; ++ i ) {
472
+ subRanges [ i ] . to = subRanges [ i + 1 ] . from ;
473
+ }
474
+ subRanges [ subRanges . length - 1 ] . to = range . end ;
475
+ }
476
+ }
477
+ }
478
+
404
479
#resolveName( index : number ) : string {
405
480
if ( index < 0 || index >= this . #names. length ) {
406
481
this . #throwInStrictMode( "Illegal index into the 'names' array" ) ;
0 commit comments