Skip to content

Commit 4be4e56

Browse files
authored
Hoisted declarations should occur after prologue directives (#24386)
1 parent a0b5780 commit 4be4e56

File tree

85 files changed

+129
-125
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

85 files changed

+129
-125
lines changed

src/compiler/core.ts

Lines changed: 0 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1006,21 +1006,6 @@ namespace ts {
10061006
return to;
10071007
}
10081008

1009-
/**
1010-
* Appends a range of value to begin of an array, returning the array.
1011-
*
1012-
* @param to The array to which `value` is to be appended. If `to` is `undefined`, a new array
1013-
* is created if `value` was appended.
1014-
* @param from The values to append to the array. If `from` is `undefined`, nothing is
1015-
* appended. If an element of `from` is `undefined`, that element is not appended.
1016-
*/
1017-
export function prependRange<T>(to: T[], from: ReadonlyArray<T> | undefined): T[] | undefined {
1018-
if (from === undefined || from.length === 0) return to;
1019-
if (to === undefined) return from.slice();
1020-
to.unshift(...from);
1021-
return to;
1022-
}
1023-
10241009
/**
10251010
* @return Whether the value was added.
10261011
*/

src/compiler/transformers/es2015.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -529,7 +529,7 @@ namespace ts {
529529
createVariableStatement(/*modifiers*/ undefined,
530530
createVariableDeclarationList(taggedTemplateStringDeclarations)));
531531
}
532-
prependRange(statements, endLexicalEnvironment());
532+
prependStatements(statements, endLexicalEnvironment());
533533
exitSubtree(ancestorFacts, HierarchyFacts.None, HierarchyFacts.None);
534534
return updateSourceFileNode(
535535
node,
@@ -837,7 +837,7 @@ namespace ts {
837837
setEmitFlags(statement, EmitFlags.NoComments | EmitFlags.NoTokenSourceMaps);
838838
statements.push(statement);
839839

840-
prependRange(statements, endLexicalEnvironment());
840+
prependStatements(statements, endLexicalEnvironment());
841841

842842
const block = createBlock(setTextRange(createNodeArray(statements), /*location*/ node.members), /*multiLine*/ true);
843843
setEmitFlags(block, EmitFlags.NoComments);
@@ -980,7 +980,7 @@ namespace ts {
980980
);
981981
}
982982

983-
prependRange(statements, endLexicalEnvironment());
983+
prependStatements(statements, endLexicalEnvironment());
984984

985985
if (constructor) {
986986
prependCaptureNewTargetIfNeeded(statements, constructor, /*copyOnWrite*/ false);
@@ -1896,7 +1896,7 @@ namespace ts {
18961896
}
18971897

18981898
const lexicalEnvironment = context.endLexicalEnvironment();
1899-
prependRange(statements, lexicalEnvironment);
1899+
prependStatements(statements, lexicalEnvironment);
19001900

19011901
prependCaptureNewTargetIfNeeded(statements, node, /*copyOnWrite*/ false);
19021902

@@ -2712,7 +2712,7 @@ namespace ts {
27122712
if (loopOutParameters.length) {
27132713
copyOutParameters(loopOutParameters, CopyDirection.ToOutParameter, statements);
27142714
}
2715-
prependRange(statements, lexicalEnvironment);
2715+
prependStatements(statements, lexicalEnvironment);
27162716
loopBody = createBlock(statements, /*multiline*/ true);
27172717
}
27182718

src/compiler/transformers/es2017.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -413,7 +413,7 @@ namespace ts {
413413
)
414414
);
415415

416-
prependRange(statements, endLexicalEnvironment());
416+
prependStatements(statements, endLexicalEnvironment());
417417

418418
const block = createBlock(statements, /*multiLine*/ true);
419419
setTextRange(block, node.body);

src/compiler/transformers/esnext.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -663,7 +663,7 @@ namespace ts {
663663
)
664664
);
665665

666-
prependRange(statements, endLexicalEnvironment());
666+
prependStatements(statements, endLexicalEnvironment());
667667
const block = updateBlock(node.body!, statements);
668668

669669
// Minor optimization, emit `_super` helper to capture `super` access in an arrow.
@@ -695,7 +695,7 @@ namespace ts {
695695
const leadingStatements = endLexicalEnvironment();
696696
if (statementOffset > 0 || some(statements) || some(leadingStatements)) {
697697
const block = convertToFunctionBody(body, /*multiLine*/ true);
698-
prependRange(statements, leadingStatements);
698+
prependStatements(statements, leadingStatements);
699699
addRange(statements, block.statements.slice(statementOffset));
700700
return updateBlock(block, setTextRange(createNodeArray(statements), block.statements));
701701
}

src/compiler/transformers/generators.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -587,7 +587,7 @@ namespace ts {
587587
transformAndEmitStatements(body.statements, statementOffset);
588588

589589
const buildResult = build();
590-
prependRange(statements, endLexicalEnvironment());
590+
prependStatements(statements, endLexicalEnvironment());
591591
statements.push(createReturn(buildResult));
592592

593593
// Restore previous generator state

src/compiler/transformers/module/module.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,7 @@ namespace ts {
9797
append(statements, visitNode(currentModuleInfo.externalHelpersImportDeclaration, sourceElementVisitor, isStatement));
9898
addRange(statements, visitNodes(node.statements, sourceElementVisitor, isStatement, statementOffset));
9999
addExportEqualsIfNeeded(statements, /*emitAsReturn*/ false);
100-
prependRange(statements, endLexicalEnvironment());
100+
prependStatements(statements, endLexicalEnvironment());
101101

102102
const updated = updateSourceFileNode(node, setTextRange(createNodeArray(statements), node.statements));
103103
if (currentModuleInfo.hasExportStarsToExportValues && !compilerOptions.importHelpers) {
@@ -426,7 +426,7 @@ namespace ts {
426426

427427
// End the lexical environment for the module body
428428
// and merge any new lexical declarations.
429-
prependRange(statements, endLexicalEnvironment());
429+
prependStatements(statements, endLexicalEnvironment());
430430

431431
const body = createBlock(statements, /*multiLine*/ true);
432432
if (currentModuleInfo.hasExportStarsToExportValues && !compilerOptions.importHelpers) {

src/compiler/transformers/module/system.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -257,7 +257,7 @@ namespace ts {
257257
// We emit hoisted variables early to align roughly with our previous emit output.
258258
// Two key differences in this approach are:
259259
// - Temporary variables will appear at the top rather than at the bottom of the file
260-
prependRange(statements, endLexicalEnvironment());
260+
prependStatements(statements, endLexicalEnvironment());
261261

262262
const exportStarFunction = addExportStarIfNeeded(statements)!; // TODO: GH#18217
263263
const moduleObject = createObjectLiteral([

src/compiler/transformers/ts.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -669,7 +669,7 @@ namespace ts {
669669
setEmitFlags(statement, EmitFlags.NoComments | EmitFlags.NoTokenSourceMaps);
670670
statements.push(statement);
671671

672-
prependRange(statements, context.endLexicalEnvironment());
672+
prependStatements(statements, context.endLexicalEnvironment());
673673

674674
const iife = createImmediatelyInvokedArrowFunction(statements);
675675
setEmitFlags(iife, EmitFlags.TypeScriptClassWrapper);
@@ -2693,7 +2693,7 @@ namespace ts {
26932693
const statements: Statement[] = [];
26942694
startLexicalEnvironment();
26952695
const members = map(node.members, transformEnumMember);
2696-
prependRange(statements, endLexicalEnvironment());
2696+
prependStatements(statements, endLexicalEnvironment());
26972697
addRange(statements, members);
26982698

26992699
currentNamespaceContainerName = savedCurrentNamespaceLocalName;
@@ -3008,7 +3008,7 @@ namespace ts {
30083008
statementsLocation = moveRangePos(moduleBlock.statements, -1);
30093009
}
30103010

3011-
prependRange(statements, endLexicalEnvironment());
3011+
prependStatements(statements, endLexicalEnvironment());
30123012
currentNamespaceContainerName = savedCurrentNamespaceContainerName;
30133013
currentNamespace = savedCurrentNamespace;
30143014
currentScopeFirstDeclarationsOfName = savedCurrentScopeFirstDeclarationsOfName;

src/compiler/utilities.ts

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -254,6 +254,25 @@ namespace ts {
254254
return !nodeIsMissing(node);
255255
}
256256

257+
/**
258+
* Appends a range of value to begin of an array, returning the array.
259+
*
260+
* @param to The array to which `value` is to be appended. If `to` is `undefined`, a new array
261+
* is created if `value` was appended.
262+
* @param from The values to append to the array. If `from` is `undefined`, nothing is
263+
* appended. If an element of `from` is `undefined`, that element is not appended.
264+
*/
265+
export function prependStatements<T extends Statement>(to: T[], from: ReadonlyArray<T> | undefined): T[] | undefined {
266+
if (from === undefined || from.length === 0) return to;
267+
if (to === undefined) return from.slice();
268+
const prologue = to.length && isPrologueDirective(to[0]) && to.shift();
269+
to.unshift(...from);
270+
if (prologue) {
271+
to.unshift(prologue);
272+
}
273+
return to;
274+
}
275+
257276
/**
258277
* Determine if the given comment is a triple-slash
259278
*

src/compiler/visitor.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1469,7 +1469,7 @@ namespace ts {
14691469

14701470
return isNodeArray(statements)
14711471
? setTextRange(createNodeArray(concatenate(declarations, statements)), statements)
1472-
: prependRange(statements, declarations);
1472+
: prependStatements(statements, declarations);
14731473
}
14741474

14751475
/**

0 commit comments

Comments
 (0)