@@ -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