@@ -14,6 +14,7 @@ import type {
1414 OriginalScope ,
1515 ScopeInfo ,
1616 SourceMapJson ,
17+ SubRangeBinding ,
1718} from "../scopes.d.ts" ;
1819import { TokenIterator } from "../vlq.ts" ;
1920
@@ -74,6 +75,7 @@ class Decoder {
7475 readonly #rangeStack: GeneratedRange [ ] = [ ] ;
7576
7677 #flatOriginalScopes: OriginalScope [ ] = [ ] ;
78+ #subRangeBindingsForRange = new Map < number , [ number , number , number ] [ ] > ( ) ;
7779
7880 constructor ( scopes : string , names : string [ ] , options ?: { mode : DecodeMode } ) {
7981 this . #encodedScopes = scopes ;
@@ -169,6 +171,21 @@ class Decoder {
169171 this . #handleGeneratedRangeBindingsItem( valueIdxs ) ;
170172 break ;
171173 }
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+ }
172189 case Tag . GENERATED_RANGE_CALL_SITE : {
173190 this . #handleGeneratedRangeCallSite(
174191 iter . nextUnsignedVLQ ( ) ,
@@ -331,6 +348,7 @@ class Decoder {
331348 }
332349
333350 this . #rangeStack. push ( range ) ;
351+ this . #subRangeBindingsForRange. clear ( ) ;
334352 }
335353
336354 #handleGeneratedRangeBindingsItem( valueIdxs : number [ ] ) {
@@ -351,6 +369,19 @@ class Decoder {
351369 }
352370 }
353371
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+
354385 #handleGeneratedRangeCallSite(
355386 sourceIndex : number ,
356387 line : number ,
@@ -392,6 +423,8 @@ class Decoder {
392423 column : this . #rangeState. column ,
393424 } ;
394425
426+ this . #handleGeneratedRangeSubRangeBindings( range ) ;
427+
395428 if ( this . #rangeStack. length > 0 ) {
396429 const parent = this . #rangeStack. at ( - 1 ) ! ;
397430 range . parent = parent ;
@@ -401,6 +434,48 @@ class Decoder {
401434 }
402435 }
403436
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+
404479 #resolveName( index : number ) : string {
405480 if ( index < 0 || index >= this . #names. length ) {
406481 this . #throwInStrictMode( "Illegal index into the 'names' array" ) ;
0 commit comments