@@ -101,6 +101,7 @@ namespace ts {
101101 HasLocals = 1 << 5 ,
102102 IsInterface = 1 << 6 ,
103103 IsObjectLiteralOrClassExpressionMethod = 1 << 7 ,
104+ IsInferenceContainer = 1 << 8 ,
104105 }
105106
106107 const binder = createBinder ( ) ;
@@ -119,6 +120,7 @@ namespace ts {
119120 let parent : Node ;
120121 let container : Node ;
121122 let blockScopeContainer : Node ;
123+ let inferenceContainer : Node ;
122124 let lastContainer : Node ;
123125 let seenThisKeyword : boolean ;
124126
@@ -186,6 +188,7 @@ namespace ts {
186188 parent = undefined ;
187189 container = undefined ;
188190 blockScopeContainer = undefined ;
191+ inferenceContainer = undefined ;
189192 lastContainer = undefined ;
190193 seenThisKeyword = false ;
191194 currentFlow = undefined ;
@@ -561,6 +564,13 @@ namespace ts {
561564 bindChildren ( node ) ;
562565 node . flags = seenThisKeyword ? node . flags | NodeFlags . ContainsThis : node . flags & ~ NodeFlags . ContainsThis ;
563566 }
567+ else if ( containerFlags & ContainerFlags . IsInferenceContainer ) {
568+ const saveInferenceContainer = inferenceContainer ;
569+ inferenceContainer = node ;
570+ node . locals = undefined ;
571+ bindChildren ( node ) ;
572+ inferenceContainer = saveInferenceContainer ;
573+ }
564574 else {
565575 bindChildren ( node ) ;
566576 }
@@ -1417,6 +1427,9 @@ namespace ts {
14171427 case SyntaxKind . MappedType :
14181428 return ContainerFlags . IsContainer | ContainerFlags . HasLocals ;
14191429
1430+ case SyntaxKind . ConditionalType :
1431+ return ContainerFlags . IsInferenceContainer ;
1432+
14201433 case SyntaxKind . SourceFile :
14211434 return ContainerFlags . IsContainer | ContainerFlags . IsControlFlowContainer | ContainerFlags . HasLocals ;
14221435
@@ -2059,7 +2072,7 @@ namespace ts {
20592072 case SyntaxKind . TypePredicate :
20602073 return checkTypePredicate ( node as TypePredicateNode ) ;
20612074 case SyntaxKind . TypeParameter :
2062- return declareSymbolAndAddToSymbolTable ( < Declaration > node , SymbolFlags . TypeParameter , SymbolFlags . TypeParameterExcludes ) ;
2075+ return bindTypeParameter ( node as TypeParameterDeclaration ) ;
20632076 case SyntaxKind . Parameter :
20642077 return bindParameter ( < ParameterDeclaration > node ) ;
20652078 case SyntaxKind . VariableDeclaration :
@@ -2576,6 +2589,23 @@ namespace ts {
25762589 : declareSymbolAndAddToSymbolTable ( node , symbolFlags , symbolExcludes ) ;
25772590 }
25782591
2592+ function bindTypeParameter ( node : TypeParameterDeclaration ) {
2593+ if ( node . parent . kind === SyntaxKind . InferType ) {
2594+ if ( inferenceContainer ) {
2595+ if ( ! inferenceContainer . locals ) {
2596+ inferenceContainer . locals = createSymbolTable ( ) ;
2597+ }
2598+ declareSymbol ( inferenceContainer . locals , /*parent*/ undefined , node , SymbolFlags . TypeParameter , SymbolFlags . TypeParameterExcludes ) ;
2599+ }
2600+ else {
2601+ bindAnonymousDeclaration ( node , SymbolFlags . TypeParameter , getDeclarationName ( node ) ) ;
2602+ }
2603+ }
2604+ else {
2605+ declareSymbolAndAddToSymbolTable ( node , SymbolFlags . TypeParameter , SymbolFlags . TypeParameterExcludes ) ;
2606+ }
2607+ }
2608+
25792609 // reachability checks
25802610
25812611 function shouldReportErrorOnModuleDeclaration ( node : ModuleDeclaration ) : boolean {
@@ -3441,6 +3471,7 @@ namespace ts {
34413471 case SyntaxKind . UnionType :
34423472 case SyntaxKind . IntersectionType :
34433473 case SyntaxKind . ConditionalType :
3474+ case SyntaxKind . InferType :
34443475 case SyntaxKind . ParenthesizedType :
34453476 case SyntaxKind . InterfaceDeclaration :
34463477 case SyntaxKind . TypeAliasDeclaration :
0 commit comments