Skip to content

Commit 5a3312c

Browse files
committed
Merge branch 'main' into babel-let-const
2 parents 65cf21d + f2df10f commit 5a3312c

30 files changed

+392
-217
lines changed

package-lock.json

Lines changed: 6 additions & 6 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/compiler/binder.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -501,6 +501,8 @@ export function bindSourceFile(file: SourceFile, options: CompilerOptions) {
501501
}
502502

503503
function createBinder(): (file: SourceFile, options: CompilerOptions) => void {
504+
// Why var? It avoids TDZ checks in the runtime which can be costly.
505+
// See: https://github.com/microsoft/TypeScript/issues/52924
504506
/* eslint-disable no-var */
505507
var file: SourceFile;
506508
var options: CompilerOptions;

src/compiler/checker.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1378,6 +1378,8 @@ export function isInstantiatedModule(node: ModuleDeclaration, preserveConstEnums
13781378

13791379
/** @internal */
13801380
export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
1381+
// Why var? It avoids TDZ checks in the runtime which can be costly.
1382+
// See: https://github.com/microsoft/TypeScript/issues/52924
13811383
/* eslint-disable no-var */
13821384
var getPackagesMap = memoize(() => {
13831385
// A package name maps to true when we detect it has .d.ts files.

src/compiler/emitter.ts

Lines changed: 70 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -737,15 +737,19 @@ export function getFirstProjectOutput(configFile: ParsedCommandLine, ignoreCase:
737737
/** @internal */
738738
// targetSourceFile is when users only want one file in entire project to be emitted. This is used in compileOnSave feature
739739
export function emitFiles(resolver: EmitResolver, host: EmitHost, targetSourceFile: SourceFile | undefined, { scriptTransformers, declarationTransformers }: EmitTransformers, emitOnly?: boolean | EmitOnly, onlyBuildInfo?: boolean, forceDtsEmit?: boolean): EmitResult {
740-
const compilerOptions = host.getCompilerOptions();
741-
const sourceMapDataList: SourceMapEmitResult[] | undefined = (compilerOptions.sourceMap || compilerOptions.inlineSourceMap || getAreDeclarationMapsEnabled(compilerOptions)) ? [] : undefined;
742-
const emittedFilesList: string[] | undefined = compilerOptions.listEmittedFiles ? [] : undefined;
743-
const emitterDiagnostics = createDiagnosticCollection();
744-
const newLine = getNewLineCharacter(compilerOptions);
745-
const writer = createTextWriter(newLine);
746-
const { enter, exit } = performance.createTimer("printTime", "beforePrint", "afterPrint");
747-
let bundleBuildInfo: BundleBuildInfo | undefined;
748-
let emitSkipped = false;
740+
// Why var? It avoids TDZ checks in the runtime which can be costly.
741+
// See: https://github.com/microsoft/TypeScript/issues/52924
742+
/* eslint-disable no-var */
743+
var compilerOptions = host.getCompilerOptions();
744+
var sourceMapDataList: SourceMapEmitResult[] | undefined = (compilerOptions.sourceMap || compilerOptions.inlineSourceMap || getAreDeclarationMapsEnabled(compilerOptions)) ? [] : undefined;
745+
var emittedFilesList: string[] | undefined = compilerOptions.listEmittedFiles ? [] : undefined;
746+
var emitterDiagnostics = createDiagnosticCollection();
747+
var newLine = getNewLineCharacter(compilerOptions);
748+
var writer = createTextWriter(newLine);
749+
var { enter, exit } = performance.createTimer("printTime", "beforePrint", "afterPrint");
750+
var bundleBuildInfo: BundleBuildInfo | undefined;
751+
var emitSkipped = false;
752+
/* eslint-enable no-var */
749753

750754
// Emit each output file
751755
enter();
@@ -1356,7 +1360,10 @@ export const createPrinterWithRemoveCommentsNeverAsciiEscape = /* @__PURE__ */ m
13561360
export const createPrinterWithRemoveCommentsOmitTrailingSemicolon = /* @__PURE__ */ memoize(() => createPrinter({ removeComments: true, omitTrailingSemicolon: true }));
13571361

13581362
export function createPrinter(printerOptions: PrinterOptions = {}, handlers: PrintHandlers = {}): Printer {
1359-
const {
1363+
// Why var? It avoids TDZ checks in the runtime which can be costly.
1364+
// See: https://github.com/microsoft/TypeScript/issues/52924
1365+
/* eslint-disable no-var */
1366+
var {
13601367
hasGlobalName,
13611368
onEmitNode = noEmitNotification,
13621369
isEmitNotificationEnabled,
@@ -1369,63 +1376,64 @@ export function createPrinter(printerOptions: PrinterOptions = {}, handlers: Pri
13691376
onAfterEmitToken
13701377
} = handlers;
13711378

1372-
const extendedDiagnostics = !!printerOptions.extendedDiagnostics;
1373-
const newLine = getNewLineCharacter(printerOptions);
1374-
const moduleKind = getEmitModuleKind(printerOptions);
1375-
const bundledHelpers = new Map<string, boolean>();
1376-
1377-
let currentSourceFile: SourceFile | undefined;
1378-
let nodeIdToGeneratedName: string[]; // Map of generated names for specific nodes.
1379-
let nodeIdToGeneratedPrivateName: string[]; // Map of generated names for specific nodes.
1380-
let autoGeneratedIdToGeneratedName: string[]; // Map of generated names for temp and loop variables.
1381-
let generatedNames: Set<string>; // Set of names generated by the NameGenerator.
1382-
let formattedNameTempFlagsStack: (Map<string, TempFlags> | undefined)[];
1383-
let formattedNameTempFlags: Map<string, TempFlags> | undefined;
1384-
let privateNameTempFlagsStack: TempFlags[]; // Stack of enclosing name generation scopes.
1385-
let privateNameTempFlags: TempFlags; // TempFlags for the current name generation scope.
1386-
let tempFlagsStack: TempFlags[]; // Stack of enclosing name generation scopes.
1387-
let tempFlags: TempFlags; // TempFlags for the current name generation scope.
1388-
let reservedNamesStack: (Set<string> | undefined)[]; // Stack of reserved names in enclosing name generation scopes.
1389-
let reservedNames: Set<string> | undefined; // Names reserved in nested name generation scopes.
1390-
let reservedPrivateNamesStack: (Set<string> | undefined)[]; // Stack of reserved member names in enclosing name generation scopes.
1391-
let reservedPrivateNames: Set<string> | undefined; // Member names reserved in nested name generation scopes.
1392-
let preserveSourceNewlines = printerOptions.preserveSourceNewlines; // Can be overridden inside nodes with the `IgnoreSourceNewlines` emit flag.
1393-
let nextListElementPos: number | undefined; // See comment in `getLeadingLineTerminatorCount`.
1394-
1395-
let writer: EmitTextWriter;
1396-
let ownWriter: EmitTextWriter; // Reusable `EmitTextWriter` for basic printing.
1397-
let write = writeBase;
1398-
let isOwnFileEmit: boolean;
1399-
const bundleFileInfo = printerOptions.writeBundleFileInfo ? { sections: [] } as BundleFileInfo : undefined;
1400-
const relativeToBuildInfo = bundleFileInfo ? Debug.checkDefined(printerOptions.relativeToBuildInfo) : undefined;
1401-
const recordInternalSection = printerOptions.recordInternalSection;
1402-
let sourceFileTextPos = 0;
1403-
let sourceFileTextKind: BundleFileTextLikeKind = BundleFileSectionKind.Text;
1379+
var extendedDiagnostics = !!printerOptions.extendedDiagnostics;
1380+
var newLine = getNewLineCharacter(printerOptions);
1381+
var moduleKind = getEmitModuleKind(printerOptions);
1382+
var bundledHelpers = new Map<string, boolean>();
1383+
1384+
var currentSourceFile: SourceFile | undefined;
1385+
var nodeIdToGeneratedName: string[]; // Map of generated names for specific nodes.
1386+
var nodeIdToGeneratedPrivateName: string[]; // Map of generated names for specific nodes.
1387+
var autoGeneratedIdToGeneratedName: string[]; // Map of generated names for temp and loop variables.
1388+
var generatedNames: Set<string>; // Set of names generated by the NameGenerator.
1389+
var formattedNameTempFlagsStack: (Map<string, TempFlags> | undefined)[];
1390+
var formattedNameTempFlags: Map<string, TempFlags> | undefined;
1391+
var privateNameTempFlagsStack: TempFlags[]; // Stack of enclosing name generation scopes.
1392+
var privateNameTempFlags: TempFlags; // TempFlags for the current name generation scope.
1393+
var tempFlagsStack: TempFlags[]; // Stack of enclosing name generation scopes.
1394+
var tempFlags: TempFlags; // TempFlags for the current name generation scope.
1395+
var reservedNamesStack: (Set<string> | undefined)[]; // Stack of reserved names in enclosing name generation scopes.
1396+
var reservedNames: Set<string> | undefined; // Names reserved in nested name generation scopes.
1397+
var reservedPrivateNamesStack: (Set<string> | undefined)[]; // Stack of reserved member names in enclosing name generation scopes.
1398+
var reservedPrivateNames: Set<string> | undefined; // Member names reserved in nested name generation scopes.
1399+
var preserveSourceNewlines = printerOptions.preserveSourceNewlines; // Can be overridden inside nodes with the `IgnoreSourceNewlines` emit flag.
1400+
var nextListElementPos: number | undefined; // See comment in `getLeadingLineTerminatorCount`.
1401+
1402+
var writer: EmitTextWriter;
1403+
var ownWriter: EmitTextWriter; // Reusable `EmitTextWriter` for basic printing.
1404+
var write = writeBase;
1405+
var isOwnFileEmit: boolean;
1406+
var bundleFileInfo = printerOptions.writeBundleFileInfo ? { sections: [] } as BundleFileInfo : undefined;
1407+
var relativeToBuildInfo = bundleFileInfo ? Debug.checkDefined(printerOptions.relativeToBuildInfo) : undefined;
1408+
var recordInternalSection = printerOptions.recordInternalSection;
1409+
var sourceFileTextPos = 0;
1410+
var sourceFileTextKind: BundleFileTextLikeKind = BundleFileSectionKind.Text;
14041411

14051412
// Source Maps
1406-
let sourceMapsDisabled = true;
1407-
let sourceMapGenerator: SourceMapGenerator | undefined;
1408-
let sourceMapSource: SourceMapSource;
1409-
let sourceMapSourceIndex = -1;
1410-
let mostRecentlyAddedSourceMapSource: SourceMapSource;
1411-
let mostRecentlyAddedSourceMapSourceIndex = -1;
1413+
var sourceMapsDisabled = true;
1414+
var sourceMapGenerator: SourceMapGenerator | undefined;
1415+
var sourceMapSource: SourceMapSource;
1416+
var sourceMapSourceIndex = -1;
1417+
var mostRecentlyAddedSourceMapSource: SourceMapSource;
1418+
var mostRecentlyAddedSourceMapSourceIndex = -1;
14121419

14131420
// Comments
1414-
let containerPos = -1;
1415-
let containerEnd = -1;
1416-
let declarationListContainerEnd = -1;
1417-
let currentLineMap: readonly number[] | undefined;
1418-
let detachedCommentsInfo: { nodePos: number, detachedCommentEndPos: number }[] | undefined;
1419-
let hasWrittenComment = false;
1420-
let commentsDisabled = !!printerOptions.removeComments;
1421-
let lastSubstitution: Node | undefined;
1422-
let currentParenthesizerRule: ParenthesizerRule<any> | undefined;
1423-
const { enter: enterComment, exit: exitComment } = performance.createTimerIf(extendedDiagnostics, "commentTime", "beforeComment", "afterComment");
1424-
const parenthesizer = factory.parenthesizer;
1425-
const typeArgumentParenthesizerRuleSelector: OrdinalParentheizerRuleSelector<TypeNode> = {
1421+
var containerPos = -1;
1422+
var containerEnd = -1;
1423+
var declarationListContainerEnd = -1;
1424+
var currentLineMap: readonly number[] | undefined;
1425+
var detachedCommentsInfo: { nodePos: number, detachedCommentEndPos: number }[] | undefined;
1426+
var hasWrittenComment = false;
1427+
var commentsDisabled = !!printerOptions.removeComments;
1428+
var lastSubstitution: Node | undefined;
1429+
var currentParenthesizerRule: ParenthesizerRule<any> | undefined;
1430+
var { enter: enterComment, exit: exitComment } = performance.createTimerIf(extendedDiagnostics, "commentTime", "beforeComment", "afterComment");
1431+
var parenthesizer = factory.parenthesizer;
1432+
var typeArgumentParenthesizerRuleSelector: OrdinalParentheizerRuleSelector<TypeNode> = {
14261433
select: index => index === 0 ? parenthesizer.parenthesizeLeadingTypeArgument : undefined
14271434
};
1428-
const emitBinaryExpression = createEmitBinaryExpression();
1435+
var emitBinaryExpression = createEmitBinaryExpression();
1436+
/* eslint-enable no-var */
14291437

14301438
reset();
14311439
return {
@@ -1567,7 +1575,7 @@ export function createPrinter(printerOptions: PrinterOptions = {}, handlers: Pri
15671575
writeLine();
15681576
const pos = writer.getTextPos();
15691577
const savedSections = bundleFileInfo && bundleFileInfo.sections;
1570-
if (savedSections) bundleFileInfo.sections = [];
1578+
if (savedSections) bundleFileInfo!.sections = [];
15711579
print(EmitHint.Unspecified, prepend, /*sourceFile*/ undefined);
15721580
if (bundleFileInfo) {
15731581
const newSections = bundleFileInfo.sections;

src/compiler/factory/nodeFactory.ts

Lines changed: 2 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@ import {
5858
ConstructorDeclaration,
5959
ConstructorTypeNode,
6060
ConstructSignatureDeclaration,
61+
containsObjectRestOrSpread,
6162
ContinueStatement,
6263
createBaseNodeFactory,
6364
createNodeConverters,
@@ -114,7 +115,6 @@ import {
114115
getAllUnscopedEmitHelpers,
115116
getBuildInfo,
116117
getCommentRange,
117-
getElementsOfBindingOrAssignmentPattern,
118118
getEmitFlags,
119119
getIdentifierTypeArguments,
120120
getJSDocTypeAliasName,
@@ -124,7 +124,6 @@ import {
124124
getSourceMapRange,
125125
getSyntheticLeadingComments,
126126
getSyntheticTrailingComments,
127-
getTargetOfBindingOrAssignmentElement,
128127
getTextOfIdentifierOrLiteral,
129128
hasInvalidEscape,
130129
HasModifiers,
@@ -150,7 +149,6 @@ import {
150149
isArray,
151150
isArrayLiteralExpression,
152151
isArrowFunction,
153-
isAssignmentPattern,
154152
isBinaryExpression,
155153
isCallChain,
156154
isClassDeclaration,
@@ -3326,24 +3324,7 @@ export function createNodeFactory(flags: NodeFactoryFlags, baseFactory: BaseNode
33263324
}
33273325

33283326
function propagateAssignmentPatternFlags(node: AssignmentPattern): TransformFlags {
3329-
if (node.transformFlags & TransformFlags.ContainsObjectRestOrSpread) return TransformFlags.ContainsObjectRestOrSpread;
3330-
if (node.transformFlags & TransformFlags.ContainsES2018) {
3331-
// check for nested spread assignments, otherwise '{ x: { a, ...b } = foo } = c'
3332-
// will not be correctly interpreted by the ES2018 transformer
3333-
for (const element of getElementsOfBindingOrAssignmentPattern(node)) {
3334-
const target = getTargetOfBindingOrAssignmentElement(element);
3335-
if (target && isAssignmentPattern(target)) {
3336-
if (target.transformFlags & TransformFlags.ContainsObjectRestOrSpread) {
3337-
return TransformFlags.ContainsObjectRestOrSpread;
3338-
}
3339-
if (target.transformFlags & TransformFlags.ContainsES2018) {
3340-
const flags = propagateAssignmentPatternFlags(target);
3341-
if (flags) return flags;
3342-
}
3343-
}
3344-
}
3345-
}
3346-
return TransformFlags.None;
3327+
return containsObjectRestOrSpread(node) ? TransformFlags.ContainsObjectRestOrSpread : TransformFlags.None;
33473328
}
33483329

33493330
// @api

src/compiler/factory/utilities.ts

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import {
77
AssertionLevel,
88
AssignmentExpression,
99
AssignmentOperatorOrHigher,
10+
AssignmentPattern,
1011
BinaryExpression,
1112
BinaryOperator,
1213
BinaryOperatorToken,
@@ -76,6 +77,7 @@ import {
7677
InternalEmitFlags,
7778
isAssignmentExpression,
7879
isAssignmentOperator,
80+
isAssignmentPattern,
7981
isBlock,
8082
isCommaListExpression,
8183
isComputedPropertyName,
@@ -174,6 +176,7 @@ import {
174176
TextRange,
175177
ThisTypeNode,
176178
Token,
179+
TransformFlags,
177180
TypeNode,
178181
} from "../_namespaces/ts";
179182

@@ -1742,3 +1745,31 @@ export function flattenCommaList(node: Expression) {
17421745
flattenCommaListWorker(node, expressions);
17431746
return expressions;
17441747
}
1748+
1749+
/**
1750+
* Walk an AssignmentPattern to determine if it contains object rest (`...`) syntax. We cannot rely on
1751+
* propagation of `TransformFlags.ContainsObjectRestOrSpread` since it isn't propagated by default in
1752+
* ObjectLiteralExpression and ArrayLiteralExpression since we do not know whether they belong to an
1753+
* AssignmentPattern at the time the nodes are parsed.
1754+
*
1755+
* @internal
1756+
*/
1757+
export function containsObjectRestOrSpread(node: AssignmentPattern): boolean {
1758+
if (node.transformFlags & TransformFlags.ContainsObjectRestOrSpread) return true;
1759+
if (node.transformFlags & TransformFlags.ContainsES2018) {
1760+
// check for nested spread assignments, otherwise '{ x: { a, ...b } = foo } = c'
1761+
// will not be correctly interpreted by the ES2018 transformer
1762+
for (const element of getElementsOfBindingOrAssignmentPattern(node)) {
1763+
const target = getTargetOfBindingOrAssignmentElement(element);
1764+
if (target && isAssignmentPattern(target)) {
1765+
if (target.transformFlags & TransformFlags.ContainsObjectRestOrSpread) {
1766+
return true;
1767+
}
1768+
if (target.transformFlags & TransformFlags.ContainsES2018) {
1769+
if (containsObjectRestOrSpread(target)) return true;
1770+
}
1771+
}
1772+
}
1773+
}
1774+
return false;
1775+
}

src/compiler/parser.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1401,6 +1401,8 @@ export function parseJSDocTypeExpressionForTests(content: string, start?: number
14011401
// parser instances can actually be expensive enough to impact us on projects with many source
14021402
// files.
14031403
namespace Parser {
1404+
// Why var? It avoids TDZ checks in the runtime which can be costly.
1405+
// See: https://github.com/microsoft/TypeScript/issues/52924
14041406
/* eslint-disable no-var */
14051407

14061408
// Share a single scanner across all calls to parse a source file. This helps speed things
@@ -6167,7 +6169,7 @@ namespace Parser {
61676169
}
61686170

61696171
function parseTypeAssertion(): TypeAssertion {
6170-
Debug.assert(scriptKind === ScriptKind.TS, "Type assertions should never be parsed outside of TS; they should either be comparisons or JSX.");
6172+
Debug.assert(languageVariant !== LanguageVariant.JSX, "Type assertions should never be parsed in JSX; they should be parsed as comparisons or JSX elements/fragments.");
61716173
const pos = getNodePos();
61726174
parseExpected(SyntaxKind.LessThanToken);
61736175
const type = parseType();

src/compiler/scanner.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -961,6 +961,8 @@ export function createScanner(languageVersion: ScriptTarget,
961961
start?: number,
962962
length?: number): Scanner {
963963

964+
// Why var? It avoids TDZ checks in the runtime which can be costly.
965+
// See: https://github.com/microsoft/TypeScript/issues/52924
964966
/* eslint-disable no-var */
965967
var text = textInitial!;
966968

0 commit comments

Comments
 (0)