@@ -1256,7 +1256,10 @@ module ts {
1256
1256
var formattingRulesProvider : TypeScript . Services . Formatting . RulesProvider ;
1257
1257
var hostCache : HostCache ; // A cache of all the information about the files on the host side.
1258
1258
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
+ var fullTypeCheckChecker : TypeChecker ;
1260
1263
var useCaseSensitivefilenames = false ;
1261
1264
var sourceFilesByName : Map < SourceFile > = { } ;
1262
1265
var documentRegistry = documentRegistry ;
@@ -1403,15 +1406,17 @@ module ts {
1403
1406
1404
1407
// Now create a new compiler
1405
1408
program = createProgram ( hostfilenames , compilationSettings , createCompilerHost ( ) ) ;
1406
- typeChecker = program . getTypeChecker ( ) ;
1409
+ typeInfoResolver = program . getTypeChecker ( /*fullTypeCheckMode*/ false ) ;
1410
+ fullTypeCheckChecker = program . getTypeChecker ( /*fullTypeCheckMode*/ true ) ;
1407
1411
}
1408
1412
1409
1413
/// Clean up any semantic caches that are not needed.
1410
1414
/// The host can call this method if it wants to jettison unused memory.
1411
1415
/// We will just dump the typeChecker and recreate a new one. this should have the effect of destroying all the semantic caches.
1412
1416
function cleanupSemanticCache ( ) : void {
1413
1417
if ( program ) {
1414
- typeChecker = program . getTypeChecker ( ) ;
1418
+ typeInfoResolver = program . getTypeChecker ( /*fullTypeCheckMode*/ false ) ;
1419
+ fullTypeCheckChecker = program . getTypeChecker ( /*fullTypeCheckMode*/ true ) ;
1415
1420
}
1416
1421
}
1417
1422
@@ -1436,7 +1441,7 @@ module ts {
1436
1441
1437
1442
filename = TypeScript . switchToForwardSlashes ( filename )
1438
1443
1439
- return typeChecker . getDiagnostics ( getSourceFile ( filename ) . getSourceFile ( ) ) ;
1444
+ return fullTypeCheckChecker . getDiagnostics ( getSourceFile ( filename ) ) ;
1440
1445
}
1441
1446
1442
1447
function getCompilerOptionsDiagnostics ( ) {
@@ -1678,12 +1683,12 @@ module ts {
1678
1683
entries : [ ] ,
1679
1684
symbols : { } ,
1680
1685
location : mappedNode ,
1681
- typeChecker : typeChecker
1686
+ typeChecker : typeInfoResolver
1682
1687
} ;
1683
1688
1684
1689
// Right of dot member completion list
1685
1690
if ( isRightOfDot ) {
1686
- var type : Type = typeChecker . getTypeOfExpression ( mappedNode ) ;
1691
+ var type : Type = typeInfoResolver . getTypeOfExpression ( mappedNode ) ;
1687
1692
if ( ! type ) {
1688
1693
return undefined ;
1689
1694
}
@@ -1731,7 +1736,7 @@ module ts {
1731
1736
isMemberCompletion = false ;
1732
1737
/// TODO filter meaning based on the current context
1733
1738
var symbolMeanings = SymbolFlags . Type | SymbolFlags . Value | SymbolFlags . Namespace ;
1734
- var symbols = typeChecker . getSymbolsInScope ( mappedNode , symbolMeanings ) ;
1739
+ var symbols = typeInfoResolver . getSymbolsInScope ( mappedNode , symbolMeanings ) ;
1735
1740
1736
1741
getCompletionEntriesFromSymbols ( symbols , activeCompletionSession ) ;
1737
1742
}
@@ -1770,7 +1775,7 @@ module ts {
1770
1775
kind : completionEntry . kind ,
1771
1776
kindModifiers : completionEntry . kindModifiers ,
1772
1777
type : session . typeChecker . typeToString ( type , session . location ) ,
1773
- fullSymbolName : typeChecker . symbolToString ( symbol , session . location ) ,
1778
+ fullSymbolName : typeInfoResolver . symbolToString ( symbol , session . location ) ,
1774
1779
docComment : ""
1775
1780
} ;
1776
1781
}
@@ -1882,13 +1887,13 @@ module ts {
1882
1887
var node = getNodeAtPosition ( sourceFile . getSourceFile ( ) , position ) ;
1883
1888
if ( ! node ) return undefined ;
1884
1889
1885
- var symbol = typeChecker . getSymbolInfo ( node ) ;
1886
- var type = symbol && typeChecker . getTypeOfSymbol ( symbol ) ;
1890
+ var symbol = typeInfoResolver . getSymbolInfo ( node ) ;
1891
+ var type = symbol && typeInfoResolver . getTypeOfSymbol ( symbol ) ;
1887
1892
if ( type ) {
1888
1893
return {
1889
- memberName : new TypeScript . MemberNameString ( typeChecker . typeToString ( type ) ) ,
1894
+ memberName : new TypeScript . MemberNameString ( typeInfoResolver . typeToString ( type ) ) ,
1890
1895
docComment : "" ,
1891
- fullSymbolName : typeChecker . symbolToString ( symbol , getContainerNode ( node ) ) ,
1896
+ fullSymbolName : typeInfoResolver . symbolToString ( symbol , getContainerNode ( node ) ) ,
1892
1897
kind : getSymbolKind ( symbol ) ,
1893
1898
minChar : node . pos ,
1894
1899
limChar : node . end
@@ -2034,7 +2039,7 @@ module ts {
2034
2039
return undefined ;
2035
2040
}
2036
2041
2037
- var symbol = typeChecker . getSymbolInfo ( node ) ;
2042
+ var symbol = typeInfoResolver . getSymbolInfo ( node ) ;
2038
2043
2039
2044
// Could not find a symbol e.g. node is string or number keyword,
2040
2045
// or the symbol was an internal symbol and does not have a declaration e.g. undefined symbol
@@ -2045,10 +2050,10 @@ module ts {
2045
2050
var result : DefinitionInfo [ ] = [ ] ;
2046
2051
2047
2052
var declarations = symbol . getDeclarations ( ) ;
2048
- var symbolName = typeChecker . symbolToString ( symbol , node ) ;
2053
+ var symbolName = typeInfoResolver . symbolToString ( symbol , node ) ;
2049
2054
var symbolKind = getSymbolKind ( symbol ) ;
2050
2055
var containerSymbol = symbol . parent ;
2051
- var containerName = containerSymbol ? typeChecker . symbolToString ( containerSymbol , node ) : "" ;
2056
+ var containerName = containerSymbol ? typeInfoResolver . symbolToString ( containerSymbol , node ) : "" ;
2052
2057
var containerKind = containerSymbol ? getSymbolKind ( symbol ) : "" ;
2053
2058
2054
2059
if ( ! tryAddConstructSignature ( symbol , node , symbolKind , symbolName , containerName , result ) &&
0 commit comments