@@ -1256,7 +1256,11 @@ module ts {
12561256 var formattingRulesProvider : TypeScript . Services . Formatting . RulesProvider ;
12571257 var hostCache : HostCache ; // A cache of all the information about the files on the host side.
12581258 var program : Program ;
1259- var typeChecker : TypeChecker ;
1259+ // this checker is used to answer all LS questions except errors
1260+ var typeInfoResolver : TypeChecker ;
1261+ // the sole purpose of this checkes is to reutrn semantic diagnostics
1262+ // creation is deferred - use getFullTypeCheckChecker to get instance
1263+ var fullTypeCheckChecker_doNotAccessDirectly : TypeChecker ;
12601264 var useCaseSensitivefilenames = false ;
12611265 var sourceFilesByName : Map < SourceFile > = { } ;
12621266 var documentRegistry = documentRegistry ;
@@ -1272,6 +1276,10 @@ module ts {
12721276 return lookUp ( sourceFilesByName , filename ) ;
12731277 }
12741278
1279+ function getFullTypeCheckChecker ( ) {
1280+ return fullTypeCheckChecker_doNotAccessDirectly || ( fullTypeCheckChecker_doNotAccessDirectly = program . getTypeChecker ( /*fullTypeCheck*/ true ) ) ;
1281+ }
1282+
12751283 function createCompilerHost ( ) : CompilerHost {
12761284 return {
12771285 getSourceFile : ( filename , languageVersion ) => {
@@ -1403,15 +1411,17 @@ module ts {
14031411
14041412 // Now create a new compiler
14051413 program = createProgram ( hostfilenames , compilationSettings , createCompilerHost ( ) ) ;
1406- typeChecker = program . getTypeChecker ( ) ;
1414+ typeInfoResolver = program . getTypeChecker ( /*fullTypeCheckMode*/ false ) ;
1415+ fullTypeCheckChecker_doNotAccessDirectly = undefined ;
14071416 }
14081417
14091418 /// Clean up any semantic caches that are not needed.
14101419 /// The host can call this method if it wants to jettison unused memory.
14111420 /// We will just dump the typeChecker and recreate a new one. this should have the effect of destroying all the semantic caches.
14121421 function cleanupSemanticCache ( ) : void {
14131422 if ( program ) {
1414- typeChecker = program . getTypeChecker ( ) ;
1423+ typeInfoResolver = program . getTypeChecker ( /*fullTypeCheckMode*/ false ) ;
1424+ fullTypeCheckChecker_doNotAccessDirectly = undefined ;
14151425 }
14161426 }
14171427
@@ -1436,7 +1446,7 @@ module ts {
14361446
14371447 filename = TypeScript . switchToForwardSlashes ( filename )
14381448
1439- return typeChecker . getDiagnostics ( getSourceFile ( filename ) . getSourceFile ( ) ) ;
1449+ return getFullTypeCheckChecker ( ) . getDiagnostics ( getSourceFile ( filename ) ) ;
14401450 }
14411451
14421452 function getCompilerOptionsDiagnostics ( ) {
@@ -1678,12 +1688,12 @@ module ts {
16781688 entries : [ ] ,
16791689 symbols : { } ,
16801690 location : mappedNode ,
1681- typeChecker : typeChecker
1691+ typeChecker : typeInfoResolver
16821692 } ;
16831693
16841694 // Right of dot member completion list
16851695 if ( isRightOfDot ) {
1686- var type : Type = typeChecker . getTypeOfExpression ( mappedNode ) ;
1696+ var type : Type = typeInfoResolver . getTypeOfExpression ( mappedNode ) ;
16871697 if ( ! type ) {
16881698 return undefined ;
16891699 }
@@ -1731,7 +1741,7 @@ module ts {
17311741 isMemberCompletion = false ;
17321742 /// TODO filter meaning based on the current context
17331743 var symbolMeanings = SymbolFlags . Type | SymbolFlags . Value | SymbolFlags . Namespace ;
1734- var symbols = typeChecker . getSymbolsInScope ( mappedNode , symbolMeanings ) ;
1744+ var symbols = typeInfoResolver . getSymbolsInScope ( mappedNode , symbolMeanings ) ;
17351745
17361746 getCompletionEntriesFromSymbols ( symbols , activeCompletionSession ) ;
17371747 }
@@ -1770,7 +1780,7 @@ module ts {
17701780 kind : completionEntry . kind ,
17711781 kindModifiers : completionEntry . kindModifiers ,
17721782 type : session . typeChecker . typeToString ( type , session . location ) ,
1773- fullSymbolName : typeChecker . symbolToString ( symbol , session . location ) ,
1783+ fullSymbolName : typeInfoResolver . symbolToString ( symbol , session . location ) ,
17741784 docComment : ""
17751785 } ;
17761786 }
@@ -1882,13 +1892,13 @@ module ts {
18821892 var node = getNodeAtPosition ( sourceFile . getSourceFile ( ) , position ) ;
18831893 if ( ! node ) return undefined ;
18841894
1885- var symbol = typeChecker . getSymbolInfo ( node ) ;
1886- var type = symbol && typeChecker . getTypeOfSymbol ( symbol ) ;
1895+ var symbol = typeInfoResolver . getSymbolInfo ( node ) ;
1896+ var type = symbol && typeInfoResolver . getTypeOfSymbol ( symbol ) ;
18871897 if ( type ) {
18881898 return {
1889- memberName : new TypeScript . MemberNameString ( typeChecker . typeToString ( type ) ) ,
1899+ memberName : new TypeScript . MemberNameString ( typeInfoResolver . typeToString ( type ) ) ,
18901900 docComment : "" ,
1891- fullSymbolName : typeChecker . symbolToString ( symbol , getContainerNode ( node ) ) ,
1901+ fullSymbolName : typeInfoResolver . symbolToString ( symbol , getContainerNode ( node ) ) ,
18921902 kind : getSymbolKind ( symbol ) ,
18931903 minChar : node . pos ,
18941904 limChar : node . end
@@ -2034,7 +2044,7 @@ module ts {
20342044 return undefined ;
20352045 }
20362046
2037- var symbol = typeChecker . getSymbolInfo ( node ) ;
2047+ var symbol = typeInfoResolver . getSymbolInfo ( node ) ;
20382048
20392049 // Could not find a symbol e.g. node is string or number keyword,
20402050 // or the symbol was an internal symbol and does not have a declaration e.g. undefined symbol
@@ -2045,10 +2055,10 @@ module ts {
20452055 var result : DefinitionInfo [ ] = [ ] ;
20462056
20472057 var declarations = symbol . getDeclarations ( ) ;
2048- var symbolName = typeChecker . symbolToString ( symbol , node ) ;
2058+ var symbolName = typeInfoResolver . symbolToString ( symbol , node ) ;
20492059 var symbolKind = getSymbolKind ( symbol ) ;
20502060 var containerSymbol = symbol . parent ;
2051- var containerName = containerSymbol ? typeChecker . symbolToString ( containerSymbol , node ) : "" ;
2061+ var containerName = containerSymbol ? typeInfoResolver . symbolToString ( containerSymbol , node ) : "" ;
20522062 var containerKind = containerSymbol ? getSymbolKind ( symbol ) : "" ;
20532063
20542064 if ( ! tryAddConstructSignature ( symbol , node , symbolKind , symbolName , containerName , result ) &&
0 commit comments