Skip to content

Commit ec37677

Browse files
committed
Merge branch 'main' into inference-alternatives-and-linked-inferences
2 parents 02c091b + 1a76569 commit ec37677

File tree

635 files changed

+7406
-2126
lines changed

Some content is hidden

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

635 files changed

+7406
-2126
lines changed

package-lock.json

Lines changed: 282 additions & 282 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: 35 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -501,49 +501,55 @@ export function bindSourceFile(file: SourceFile, options: CompilerOptions) {
501501
}
502502

503503
function createBinder(): (file: SourceFile, options: CompilerOptions) => void {
504-
let file: SourceFile;
505-
let options: CompilerOptions;
506-
let languageVersion: ScriptTarget;
507-
let parent: Node;
508-
let container: IsContainer | EntityNameExpression;
509-
let thisParentContainer: IsContainer | EntityNameExpression; // Container one level up
510-
let blockScopeContainer: IsBlockScopedContainer;
511-
let lastContainer: HasLocals;
512-
let delayedTypeAliases: (JSDocTypedefTag | JSDocCallbackTag | JSDocEnumTag)[];
513-
let seenThisKeyword: boolean;
504+
// Why var? It avoids TDZ checks in the runtime which can be costly.
505+
// See: https://github.com/microsoft/TypeScript/issues/52924
506+
/* eslint-disable no-var */
507+
var file: SourceFile;
508+
var options: CompilerOptions;
509+
var languageVersion: ScriptTarget;
510+
var parent: Node;
511+
var container: IsContainer | EntityNameExpression;
512+
var thisParentContainer: IsContainer | EntityNameExpression; // Container one level up
513+
var blockScopeContainer: IsBlockScopedContainer;
514+
var lastContainer: HasLocals;
515+
var delayedTypeAliases: (JSDocTypedefTag | JSDocCallbackTag | JSDocEnumTag)[];
516+
var seenThisKeyword: boolean;
514517

515518
// state used by control flow analysis
516-
let currentFlow: FlowNode;
517-
let currentBreakTarget: FlowLabel | undefined;
518-
let currentContinueTarget: FlowLabel | undefined;
519-
let currentReturnTarget: FlowLabel | undefined;
520-
let currentTrueTarget: FlowLabel | undefined;
521-
let currentFalseTarget: FlowLabel | undefined;
522-
let currentExceptionTarget: FlowLabel | undefined;
523-
let preSwitchCaseFlow: FlowNode | undefined;
524-
let activeLabelList: ActiveLabel | undefined;
525-
let hasExplicitReturn: boolean;
519+
var currentFlow: FlowNode;
520+
var currentBreakTarget: FlowLabel | undefined;
521+
var currentContinueTarget: FlowLabel | undefined;
522+
var currentReturnTarget: FlowLabel | undefined;
523+
var currentTrueTarget: FlowLabel | undefined;
524+
var currentFalseTarget: FlowLabel | undefined;
525+
var currentExceptionTarget: FlowLabel | undefined;
526+
var preSwitchCaseFlow: FlowNode | undefined;
527+
var activeLabelList: ActiveLabel | undefined;
528+
var hasExplicitReturn: boolean;
526529

527530
// state used for emit helpers
528-
let emitFlags: NodeFlags;
531+
var emitFlags: NodeFlags;
529532

530533
// If this file is an external module, then it is automatically in strict-mode according to
531534
// ES6. If it is not an external module, then we'll determine if it is in strict mode or
532535
// not depending on if we see "use strict" in certain places or if we hit a class/namespace
533536
// or if compiler options contain alwaysStrict.
534-
let inStrictMode: boolean;
537+
var inStrictMode: boolean;
535538

536539
// If we are binding an assignment pattern, we will bind certain expressions differently.
537-
let inAssignmentPattern = false;
540+
var inAssignmentPattern = false;
538541

539-
let symbolCount = 0;
542+
var symbolCount = 0;
540543

541-
let Symbol: new (flags: SymbolFlags, name: __String) => Symbol;
542-
let classifiableNames: Set<__String>;
544+
var Symbol: new (flags: SymbolFlags, name: __String) => Symbol;
545+
var classifiableNames: Set<__String>;
543546

544-
const unreachableFlow: FlowNode = { flags: FlowFlags.Unreachable };
545-
const reportedUnreachableFlow: FlowNode = { flags: FlowFlags.Unreachable };
546-
const bindBinaryExpressionFlow = createBindBinaryExpressionFlow();
547+
var unreachableFlow: FlowNode = { flags: FlowFlags.Unreachable };
548+
var reportedUnreachableFlow: FlowNode = { flags: FlowFlags.Unreachable };
549+
var bindBinaryExpressionFlow = createBindBinaryExpressionFlow();
550+
/* eslint-enable no-var */
551+
552+
return bindSourceFile;
547553

548554
/**
549555
* Inside the binder, we may create a diagnostic for an as-yet unbound node (with potentially no parent pointers, implying no accessible source file)
@@ -600,8 +606,6 @@ function createBinder(): (file: SourceFile, options: CompilerOptions) => void {
600606
emitFlags = NodeFlags.None;
601607
}
602608

603-
return bindSourceFile;
604-
605609
function bindInStrictMode(file: SourceFile, opts: CompilerOptions): boolean {
606610
if (getStrictOptionValue(opts, "alwaysStrict") && !file.isDeclarationFile) {
607611
// bind in strict mode source files with alwaysStrict option

src/compiler/checker.ts

Lines changed: 458 additions & 322 deletions
Large diffs are not rendered by default.

src/compiler/diagnosticMessages.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4289,7 +4289,7 @@
42894289
"category": "Error",
42904290
"code": 5100
42914291
},
4292-
"Flag '{0}' is deprecated and will stop functioning in TypeScript {1}. Specify 'ignoreDeprecations: \"{2}\"' to silence this error.": {
4292+
"Flag '{0}' is deprecated and will stop functioning in TypeScript {1}. Specify compilerOption '\"ignoreDeprecations\": \"{2}\"' to silence this error.": {
42934293
"category": "Error",
42944294
"code": 5101
42954295
},

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

0 commit comments

Comments
 (0)