Skip to content

Commit 9083f6c

Browse files
committed
Revise binder logic to correctly find 'infer T' containers
1 parent a75449c commit 9083f6c

File tree

1 file changed

+16
-17
lines changed

1 file changed

+16
-17
lines changed

src/compiler/binder.ts

Lines changed: 16 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,6 @@ namespace ts {
101101
HasLocals = 1 << 5,
102102
IsInterface = 1 << 6,
103103
IsObjectLiteralOrClassExpressionMethod = 1 << 7,
104-
IsInferenceContainer = 1 << 8,
105104
}
106105

107106
const binder = createBinder();
@@ -121,7 +120,6 @@ namespace ts {
121120
let container: Node;
122121
let containerContainer: Node; // Container one level up
123122
let blockScopeContainer: Node;
124-
let inferenceContainer: Node;
125123
let lastContainer: Node;
126124
let seenThisKeyword: boolean;
127125

@@ -190,7 +188,6 @@ namespace ts {
190188
container = undefined;
191189
containerContainer = undefined;
192190
blockScopeContainer = undefined;
193-
inferenceContainer = undefined;
194191
lastContainer = undefined;
195192
seenThisKeyword = false;
196193
currentFlow = undefined;
@@ -569,13 +566,6 @@ namespace ts {
569566
bindChildren(node);
570567
node.flags = seenThisKeyword ? node.flags | NodeFlags.ContainsThis : node.flags & ~NodeFlags.ContainsThis;
571568
}
572-
else if (containerFlags & ContainerFlags.IsInferenceContainer) {
573-
const saveInferenceContainer = inferenceContainer;
574-
inferenceContainer = node;
575-
node.locals = undefined;
576-
bindChildren(node);
577-
inferenceContainer = saveInferenceContainer;
578-
}
579569
else {
580570
bindChildren(node);
581571
}
@@ -1434,9 +1424,6 @@ namespace ts {
14341424
case SyntaxKind.MappedType:
14351425
return ContainerFlags.IsContainer | ContainerFlags.HasLocals;
14361426

1437-
case SyntaxKind.ConditionalType:
1438-
return ContainerFlags.IsInferenceContainer;
1439-
14401427
case SyntaxKind.SourceFile:
14411428
return ContainerFlags.IsContainer | ContainerFlags.IsControlFlowContainer | ContainerFlags.HasLocals;
14421429

@@ -2638,13 +2625,25 @@ namespace ts {
26382625
: declareSymbolAndAddToSymbolTable(node, symbolFlags, symbolExcludes);
26392626
}
26402627

2628+
function getInferTypeContainer(node: Node): ConditionalTypeNode {
2629+
while (node) {
2630+
const parent = node.parent;
2631+
if (parent && parent.kind === SyntaxKind.ConditionalType && (<ConditionalTypeNode>parent).extendsType === node) {
2632+
return <ConditionalTypeNode>parent;
2633+
}
2634+
node = parent;
2635+
}
2636+
return undefined;
2637+
}
2638+
26412639
function bindTypeParameter(node: TypeParameterDeclaration) {
26422640
if (node.parent.kind === SyntaxKind.InferType) {
2643-
if (inferenceContainer) {
2644-
if (!inferenceContainer.locals) {
2645-
inferenceContainer.locals = createSymbolTable();
2641+
const container = getInferTypeContainer(node.parent);
2642+
if (container) {
2643+
if (!container.locals) {
2644+
container.locals = createSymbolTable();
26462645
}
2647-
declareSymbol(inferenceContainer.locals, /*parent*/ undefined, node, SymbolFlags.TypeParameter, SymbolFlags.TypeParameterExcludes);
2646+
declareSymbol(container.locals, /*parent*/ undefined, node, SymbolFlags.TypeParameter, SymbolFlags.TypeParameterExcludes);
26482647
}
26492648
else {
26502649
bindAnonymousDeclaration(node, SymbolFlags.TypeParameter, getDeclarationName(node));

0 commit comments

Comments
 (0)