Skip to content

Commit b02dab4

Browse files
committed
Remove 'this'-related tx flag usage from transformConstructorBody
1 parent 510bef6 commit b02dab4

File tree

14 files changed

+315
-261
lines changed

14 files changed

+315
-261
lines changed

src/compiler/binder.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3839,6 +3839,7 @@ namespace ts {
38393839

38403840
case SyntaxKind.ThisKeyword:
38413841
// Mark this node and its ancestors as containing a lexical `this` keyword.
3842+
transformFlags |= TransformFlags.AssertES2015;
38423843
transformFlags |= TransformFlags.ContainsLexicalThis;
38433844
break;
38443845

src/compiler/transformers/es2015.ts

Lines changed: 218 additions & 229 deletions
Large diffs are not rendered by default.

src/compiler/transformers/es2017.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -438,7 +438,7 @@ namespace ts {
438438
)
439439
);
440440

441-
addStatementsAfterPrologue(statements, endLexicalEnvironment());
441+
insertStatementsAfterStandardPrologue(statements, endLexicalEnvironment());
442442

443443
// Minor optimization, emit `_super` helper to capture `super` access in an arrow.
444444
// This step isn't needed if we eventually transform this to ES5.
@@ -448,7 +448,7 @@ namespace ts {
448448
enableSubstitutionForAsyncMethodsWithSuper();
449449
const variableStatement = createSuperAccessVariableStatement(resolver, node, capturedSuperProperties);
450450
substitutedSuperAccessors[getNodeId(variableStatement)] = true;
451-
addStatementsAfterPrologue(statements, [variableStatement]);
451+
insertStatementsAfterStandardPrologue(statements, [variableStatement]);
452452
}
453453

454454
const block = createBlock(statements, /*multiLine*/ true);

src/compiler/transformers/es2018.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -689,12 +689,12 @@ namespace ts {
689689
enableSubstitutionForAsyncMethodsWithSuper();
690690
const variableStatement = createSuperAccessVariableStatement(resolver, node, capturedSuperProperties);
691691
substitutedSuperAccessors[getNodeId(variableStatement)] = true;
692-
addStatementsAfterPrologue(statements, [variableStatement]);
692+
insertStatementsAfterStandardPrologue(statements, [variableStatement]);
693693
}
694694

695695
statements.push(returnStatement);
696696

697-
addStatementsAfterPrologue(statements, endLexicalEnvironment());
697+
insertStatementsAfterStandardPrologue(statements, endLexicalEnvironment());
698698
const block = updateBlock(node.body!, statements);
699699

700700
if (emitSuperHelpers && hasSuperElementAccess) {
@@ -726,7 +726,7 @@ namespace ts {
726726
const leadingStatements = endLexicalEnvironment();
727727
if (statementOffset > 0 || some(statements) || some(leadingStatements)) {
728728
const block = convertToFunctionBody(body, /*multiLine*/ true);
729-
addStatementsAfterPrologue(statements, leadingStatements);
729+
insertStatementsAfterStandardPrologue(statements, leadingStatements);
730730
addRange(statements, block.statements.slice(statementOffset));
731731
return updateBlock(block, setTextRange(createNodeArray(statements), block.statements));
732732
}

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-
addStatementsAfterPrologue(statements, endLexicalEnvironment());
590+
insertStatementsAfterStandardPrologue(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
@@ -100,7 +100,7 @@ namespace ts {
100100
append(statements, visitNode(currentModuleInfo.externalHelpersImportDeclaration, sourceElementVisitor, isStatement));
101101
addRange(statements, visitNodes(node.statements, sourceElementVisitor, isStatement, statementOffset));
102102
addExportEqualsIfNeeded(statements, /*emitAsReturn*/ false);
103-
addStatementsAfterPrologue(statements, endLexicalEnvironment());
103+
insertStatementsAfterStandardPrologue(statements, endLexicalEnvironment());
104104

105105
const updated = updateSourceFileNode(node, setTextRange(createNodeArray(statements), node.statements));
106106
if (currentModuleInfo.hasExportStarsToExportValues && !compilerOptions.importHelpers) {
@@ -432,7 +432,7 @@ namespace ts {
432432

433433
// End the lexical environment for the module body
434434
// and merge any new lexical declarations.
435-
addStatementsAfterPrologue(statements, endLexicalEnvironment());
435+
insertStatementsAfterStandardPrologue(statements, endLexicalEnvironment());
436436

437437
const body = createBlock(statements, /*multiLine*/ true);
438438
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-
addStatementsAfterPrologue(statements, endLexicalEnvironment());
260+
insertStatementsAfterStandardPrologue(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
@@ -675,7 +675,7 @@ namespace ts {
675675
setEmitFlags(statement, EmitFlags.NoComments | EmitFlags.NoTokenSourceMaps);
676676
statements.push(statement);
677677

678-
addStatementsAfterPrologue(statements, context.endLexicalEnvironment());
678+
insertStatementsAfterStandardPrologue(statements, context.endLexicalEnvironment());
679679

680680
const iife = createImmediatelyInvokedArrowFunction(statements);
681681
setEmitFlags(iife, EmitFlags.TypeScriptClassWrapper);
@@ -2672,7 +2672,7 @@ namespace ts {
26722672
const statements: Statement[] = [];
26732673
startLexicalEnvironment();
26742674
const members = map(node.members, transformEnumMember);
2675-
addStatementsAfterPrologue(statements, endLexicalEnvironment());
2675+
insertStatementsAfterStandardPrologue(statements, endLexicalEnvironment());
26762676
addRange(statements, members);
26772677

26782678
currentNamespaceContainerName = savedCurrentNamespaceLocalName;
@@ -2993,7 +2993,7 @@ namespace ts {
29932993
statementsLocation = moveRangePos(moduleBlock.statements, -1);
29942994
}
29952995

2996-
addStatementsAfterPrologue(statements, endLexicalEnvironment());
2996+
insertStatementsAfterStandardPrologue(statements, endLexicalEnvironment());
29972997
currentNamespaceContainerName = savedCurrentNamespaceContainerName;
29982998
currentNamespace = savedCurrentNamespace;
29992999
currentScopeFirstDeclarationsOfName = savedCurrentScopeFirstDeclarationsOfName;

src/compiler/utilities.ts

Lines changed: 43 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -401,10 +401,7 @@ namespace ts {
401401
return !nodeIsMissing(node);
402402
}
403403

404-
/**
405-
* Prepends statements to an array while taking care of prologue directives.
406-
*/
407-
export function addStatementsAfterPrologue<T extends Statement>(to: T[], from: ReadonlyArray<T> | undefined): T[] {
404+
function insertStatementsAfterPrologue<T extends Statement>(to: T[], from: ReadonlyArray<T> | undefined, isPrologueDirective: (node: Node) => boolean): T[] {
408405
if (from === undefined || from.length === 0) return to;
409406
let statementIndex = 0;
410407
// skip all prologue directives to insert at the correct position
@@ -417,6 +414,46 @@ namespace ts {
417414
return to;
418415
}
419416

417+
function insertStatementAfterPrologue<T extends Statement>(to: T[], statement: T | undefined, isPrologueDirective: (node: Node) => boolean): T[] {
418+
if (statement === undefined) return to;
419+
let statementIndex = 0;
420+
// skip all prologue directives to insert at the correct position
421+
for (; statementIndex < to.length; ++statementIndex) {
422+
if (!isPrologueDirective(to[statementIndex])) {
423+
break;
424+
}
425+
}
426+
to.splice(statementIndex, 0, statement);
427+
return to;
428+
}
429+
430+
431+
function isAnyPrologueDirective(node: Node) {
432+
return isPrologueDirective(node) || !!(getEmitFlags(node) & EmitFlags.CustomPrologue);
433+
}
434+
435+
/**
436+
* Prepends statements to an array while taking care of prologue directives.
437+
*/
438+
export function insertStatementsAfterStandardPrologue<T extends Statement>(to: T[], from: ReadonlyArray<T> | undefined): T[] {
439+
return insertStatementsAfterPrologue(to, from, isPrologueDirective);
440+
}
441+
442+
export function insertStatementsAfterCustomPrologue<T extends Statement>(to: T[], from: ReadonlyArray<T> | undefined): T[] {
443+
return insertStatementsAfterPrologue(to, from, isAnyPrologueDirective);
444+
}
445+
446+
/**
447+
* Prepends statements to an array while taking care of prologue directives.
448+
*/
449+
export function insertStatementAfterStandardPrologue<T extends Statement>(to: T[], statement: T | undefined): T[] {
450+
return insertStatementAfterPrologue(to, statement, isPrologueDirective);
451+
}
452+
453+
export function insertStatementAfterCustomPrologue<T extends Statement>(to: T[], statement: T | undefined): T[] {
454+
return insertStatementAfterPrologue(to, statement, isAnyPrologueDirective);
455+
}
456+
420457
/**
421458
* Determine if the given comment is a triple-slash
422459
*
@@ -3418,8 +3455,8 @@ namespace ts {
34183455
return computeLineAndCharacterOfPosition(lineMap, pos).line;
34193456
}
34203457

3421-
export function getFirstConstructorWithBody(node: ClassLikeDeclaration): ConstructorDeclaration | undefined {
3422-
return find(node.members, (member): member is ConstructorDeclaration => isConstructorDeclaration(member) && nodeIsPresent(member.body));
3458+
export function getFirstConstructorWithBody(node: ClassLikeDeclaration): ConstructorDeclaration & { body: FunctionBody } | undefined {
3459+
return find(node.members, (member): member is ConstructorDeclaration & { body: FunctionBody } => isConstructorDeclaration(member) && nodeIsPresent(member.body));
34233460
}
34243461

34253462
function getSetAccessorValueParameter(accessor: SetAccessorDeclaration): ParameterDeclaration | undefined {

src/compiler/visitor.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1478,8 +1478,8 @@ namespace ts {
14781478
}
14791479

14801480
return isNodeArray(statements)
1481-
? setTextRange(createNodeArray(addStatementsAfterPrologue(statements.slice(), declarations)), statements)
1482-
: addStatementsAfterPrologue(statements, declarations);
1481+
? setTextRange(createNodeArray(insertStatementsAfterStandardPrologue(statements.slice(), declarations)), statements)
1482+
: insertStatementsAfterStandardPrologue(statements, declarations);
14831483
}
14841484

14851485
/**

0 commit comments

Comments
 (0)