Skip to content

Commit 4ad6541

Browse files
authored
Store and check deferred nodes by containing file (#27378)
1 parent c080324 commit 4ad6541

File tree

11 files changed

+23
-19
lines changed

11 files changed

+23
-19
lines changed

src/compiler/checker.ts

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -523,7 +523,6 @@ namespace ts {
523523
let deferredGlobalImportMetaType: ObjectType;
524524
let deferredGlobalExtractSymbol: Symbol;
525525

526-
let deferredNodes: Map<Node> | undefined;
527526
const allPotentiallyUnusedIdentifiers = createMap<PotentiallyUnusedIdentifier[]>(); // key is file name
528527

529528
let flowLoopStart = 0;
@@ -21223,6 +21222,7 @@ namespace ts {
2122321222

2122421223
function checkFunctionExpressionOrObjectLiteralMethod(node: FunctionExpression | MethodDeclaration, checkMode?: CheckMode): Type {
2122521224
Debug.assert(node.kind !== SyntaxKind.MethodDeclaration || isObjectLiteralMethod(node));
21225+
checkNodeDeferred(node);
2122621226

2122721227
// The identityMapper object is used to indicate that function expressions are wildcards
2122821228
if (checkMode === CheckMode.SkipContextSensitive && isContextSensitive(node)) {
@@ -21280,7 +21280,6 @@ namespace ts {
2128021280
}
2128121281
}
2128221282
checkSignatureDeclaration(node);
21283-
checkNodeDeferred(node);
2128421283
}
2128521284
}
2128621285

@@ -27353,14 +27352,21 @@ namespace ts {
2735327352
// determining the type of foo would cause foo to be given type any because of the recursive reference.
2735427353
// Delaying the type check of the body ensures foo has been assigned a type.
2735527354
function checkNodeDeferred(node: Node) {
27356-
if (deferredNodes) {
27355+
const enclosingFile = getSourceFileOfNode(node);
27356+
const links = getNodeLinks(enclosingFile);
27357+
if (!(links.flags & NodeCheckFlags.TypeChecked)) {
27358+
links.deferredNodes = links.deferredNodes || createMap();
2735727359
const id = "" + getNodeId(node);
27358-
deferredNodes.set(id, node);
27360+
links.deferredNodes.set(id, node);
2735927361
}
2736027362
}
2736127363

27362-
function checkDeferredNodes() {
27363-
deferredNodes!.forEach(node => {
27364+
function checkDeferredNodes(context: SourceFile) {
27365+
const links = getNodeLinks(context);
27366+
if (!links.deferredNodes) {
27367+
return;
27368+
}
27369+
links.deferredNodes.forEach(node => {
2736427370
switch (node.kind) {
2736527371
case SyntaxKind.FunctionExpression:
2736627372
case SyntaxKind.ArrowFunction:
@@ -27421,10 +27427,9 @@ namespace ts {
2742127427
clear(potentialThisCollisions);
2742227428
clear(potentialNewTargetCollisions);
2742327429

27424-
deferredNodes = createMap<Node>();
2742527430
forEach(node.statements, checkSourceElement);
2742627431

27427-
checkDeferredNodes();
27432+
checkDeferredNodes(node);
2742827433

2742927434
if (isExternalOrCommonJsModule(node)) {
2743027435
registerForUnusedIdentifiersCheck(node);
@@ -27438,8 +27443,6 @@ namespace ts {
2743827443
});
2743927444
}
2744027445

27441-
deferredNodes = undefined;
27442-
2744327446
if (isExternalOrCommonJsModule(node)) {
2744427447
checkExternalModuleExports(node);
2744527448
}

src/compiler/types.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3702,6 +3702,7 @@ namespace ts {
37023702
switchTypes?: Type[]; // Cached array of switch case expression types
37033703
jsxNamespace?: Symbol | false; // Resolved jsx namespace symbol for this node
37043704
contextFreeType?: Type; // Cached context-free type used by the first pass of inference; used when a function's return is partially contextually sensitive
3705+
deferredNodes?: Map<Node>; // Set of nodes whose checking has been deferred
37053706
capturedBlockScopeBindings?: Symbol[]; // Block-scoped bindings captured beneath this part of an IterationStatement
37063707
}
37073708

tests/cases/user/prettier/prettier

Submodule prettier updated 1789 files

tests/cases/user/webpack/webpack

Submodule webpack updated 1431 files

0 commit comments

Comments
 (0)