@@ -2629,6 +2629,71 @@ namespace ts {
26292629 return node ;
26302630 }
26312631
2632+ interface UnscopedEmitHelpersWithLines {
2633+ helper : UnscopedEmitHelpers ;
2634+ lines : ReadonlyArray < string > ;
2635+ }
2636+
2637+ let allUnscopedEmitHelpers : ReadonlyArray < UnscopedEmitHelpersWithLines > | undefined ;
2638+ function getAllUnscopedEmitHelpers ( ) {
2639+ return allUnscopedEmitHelpers ||
2640+ ( allUnscopedEmitHelpers = [
2641+ getUnscopedEmitHelperWithLines ( valuesHelper ) ,
2642+ getUnscopedEmitHelperWithLines ( readHelper ) ,
2643+ getUnscopedEmitHelperWithLines ( spreadHelper ) ,
2644+ getUnscopedEmitHelperWithLines ( restHelper ) ,
2645+ getUnscopedEmitHelperWithLines ( decorateHelper ) ,
2646+ getUnscopedEmitHelperWithLines ( metadataHelper ) ,
2647+ getUnscopedEmitHelperWithLines ( paramHelper ) ,
2648+ getUnscopedEmitHelperWithLines ( awaiterHelper ) ,
2649+ getUnscopedEmitHelperWithLines ( assignHelper ) ,
2650+ getUnscopedEmitHelperWithLines ( awaitHelper ) ,
2651+ getUnscopedEmitHelperWithLines ( asyncGeneratorHelper ) ,
2652+ getUnscopedEmitHelperWithLines ( asyncDelegator ) ,
2653+ getUnscopedEmitHelperWithLines ( asyncValues ) ,
2654+ getUnscopedEmitHelperWithLines ( extendsHelper ) ,
2655+ getUnscopedEmitHelperWithLines ( templateObjectHelper ) ,
2656+ getUnscopedEmitHelperWithLines ( generatorHelper ) ,
2657+ getUnscopedEmitHelperWithLines ( importStarHelper ) ,
2658+ getUnscopedEmitHelperWithLines ( importDefaultHelper )
2659+ ] ) ;
2660+ }
2661+
2662+ function getUnscopedEmitHelperWithLines ( helper : UnscopedEmitHelpers ) : UnscopedEmitHelpersWithLines {
2663+ const helperLines = helper . text . split ( / \r \n ? | \n / g) ;
2664+ const indentation = guessIndentation ( helperLines ) ;
2665+ const lines : string [ ] = [ ] ;
2666+ for ( const lineText of helperLines ) {
2667+ const line = indentation ? lineText . slice ( indentation ) : lineText ;
2668+ if ( line . length ) {
2669+ lines . push ( line ) ;
2670+ }
2671+ }
2672+ return { helper, lines } ;
2673+ }
2674+
2675+ function tryGetUnscopedEmitHelper ( text : string , pos : number ) {
2676+ const allHelpers = getAllUnscopedEmitHelpers ( ) ;
2677+ if ( pos >= text . length ) return undefined ;
2678+ for ( const { helper, lines } of allHelpers ) {
2679+ let newPos = pos ;
2680+ for ( const line of lines ) {
2681+ const startIndex = text . indexOf ( line , newPos ) ;
2682+ if ( startIndex !== newPos ) {
2683+ newPos = - 1 ;
2684+ break ;
2685+ }
2686+ newPos = skipTrivia ( text , newPos + line . length , /*stopAfterLineBreak*/ true ) ;
2687+ }
2688+
2689+ // Found match
2690+ if ( newPos !== - 1 ) {
2691+ return { helper, newPos } ;
2692+ }
2693+ }
2694+ return undefined ;
2695+ }
2696+
26322697 export function createUnparsedSourceFile ( text : string ) : UnparsedSource ;
26332698 export function createUnparsedSourceFile ( inputFile : InputFiles , type : "js" | "dts" ) : UnparsedSource ;
26342699 export function createUnparsedSourceFile ( text : string , mapPath : string | undefined , map : string | undefined ) : UnparsedSource ;
@@ -2649,7 +2714,11 @@ namespace ts {
26492714 node . sourceMapText = map ;
26502715 }
26512716 const text = node . text ;
2717+
2718+ // Shebang
26522719 let pos = isShebangTrivia ( text , 0 ) ? skipTrivia ( text , 0 , /*stopAfterLineBreak*/ true ) : 0 ;
2720+
2721+ // Prologue
26532722 const scanner = createScanner ( ScriptTarget . Latest , /*skipTrivia*/ true , /*languageVariant*/ undefined , text , /*onError*/ undefined , pos ) ;
26542723 let prologues : UnparsedPrologue [ ] | undefined ;
26552724 while ( scanner . scan ( ) === SyntaxKind . StringLiteral ) {
@@ -2663,8 +2732,20 @@ namespace ts {
26632732 prologue . text = prologueText ;
26642733 ( prologues || ( prologues = [ ] ) ) . push ( prologue ) ;
26652734 }
2735+
2736+ // Helpers
2737+ let helpers : UnscopedEmitHelpers [ ] | undefined ;
2738+ while ( true ) {
2739+ const helperInfo = tryGetUnscopedEmitHelper ( text , pos ) ;
2740+ if ( ! helperInfo ) break ;
2741+ pos = helperInfo . newPos ;
2742+ ( helpers || ( helpers = [ ] ) ) . push ( helperInfo . helper ) ;
2743+ }
2744+
2745+ // Rest of the text
26662746 node . pos = pos ;
26672747 node . prologues = prologues || emptyArray ;
2748+ node . helpers = helpers ;
26682749 node . getLineAndCharacterOfPosition = pos => getLineAndCharacterOfPosition ( node , pos ) ;
26692750 return node ;
26702751 }
@@ -3390,7 +3471,7 @@ namespace ts {
33903471 return setEmitFlags ( createIdentifier ( name ) , EmitFlags . HelperName | EmitFlags . AdviseOnEmitNode ) ;
33913472 }
33923473
3393- const valuesHelper : EmitHelper = {
3474+ export const valuesHelper : UnscopedEmitHelpers = {
33943475 name : "typescript:values" ,
33953476 scoped : false ,
33963477 text : `
@@ -3418,7 +3499,7 @@ namespace ts {
34183499 ) ;
34193500 }
34203501
3421- const readHelper : EmitHelper = {
3502+ export const readHelper : UnscopedEmitHelpers = {
34223503 name : "typescript:read" ,
34233504 scoped : false ,
34243505 text : `
@@ -3454,7 +3535,7 @@ namespace ts {
34543535 ) ;
34553536 }
34563537
3457- const spreadHelper : EmitHelper = {
3538+ export const spreadHelper : UnscopedEmitHelpers = {
34583539 name : "typescript:spread" ,
34593540 scoped : false ,
34603541 text : `
0 commit comments