@@ -1256,7 +1256,11 @@ 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
+ // creation is deferred - use getFullTypeCheckChecker to get instance
1263
+ var fullTypeCheckChecker_doNotAccessDirectly : TypeChecker ;
1260
1264
var useCaseSensitivefilenames = false ;
1261
1265
var sourceFilesByName : Map < SourceFile > = { } ;
1262
1266
var documentRegistry = documentRegistry ;
@@ -1272,6 +1276,10 @@ module ts {
1272
1276
return lookUp ( sourceFilesByName , filename ) ;
1273
1277
}
1274
1278
1279
+ function getFullTypeCheckChecker ( ) {
1280
+ return fullTypeCheckChecker_doNotAccessDirectly || ( fullTypeCheckChecker_doNotAccessDirectly = program . getTypeChecker ( /*fullTypeCheck*/ true ) ) ;
1281
+ }
1282
+
1275
1283
function createCompilerHost ( ) : CompilerHost {
1276
1284
return {
1277
1285
getSourceFile : ( filename , languageVersion ) => {
@@ -1403,15 +1411,17 @@ module ts {
1403
1411
1404
1412
// Now create a new compiler
1405
1413
program = createProgram ( hostfilenames , compilationSettings , createCompilerHost ( ) ) ;
1406
- typeChecker = program . getTypeChecker ( ) ;
1414
+ typeInfoResolver = program . getTypeChecker ( /*fullTypeCheckMode*/ false ) ;
1415
+ fullTypeCheckChecker_doNotAccessDirectly = undefined ;
1407
1416
}
1408
1417
1409
1418
/// Clean up any semantic caches that are not needed.
1410
1419
/// The host can call this method if it wants to jettison unused memory.
1411
1420
/// We will just dump the typeChecker and recreate a new one. this should have the effect of destroying all the semantic caches.
1412
1421
function cleanupSemanticCache ( ) : void {
1413
1422
if ( program ) {
1414
- typeChecker = program . getTypeChecker ( ) ;
1423
+ typeInfoResolver = program . getTypeChecker ( /*fullTypeCheckMode*/ false ) ;
1424
+ fullTypeCheckChecker_doNotAccessDirectly = undefined ;
1415
1425
}
1416
1426
}
1417
1427
@@ -1436,7 +1446,7 @@ module ts {
1436
1446
1437
1447
filename = TypeScript . switchToForwardSlashes ( filename )
1438
1448
1439
- return typeChecker . getDiagnostics ( getSourceFile ( filename ) . getSourceFile ( ) ) ;
1449
+ return getFullTypeCheckChecker ( ) . getDiagnostics ( getSourceFile ( filename ) ) ;
1440
1450
}
1441
1451
1442
1452
function getCompilerOptionsDiagnostics ( ) {
@@ -1678,12 +1688,12 @@ module ts {
1678
1688
entries : [ ] ,
1679
1689
symbols : { } ,
1680
1690
location : mappedNode ,
1681
- typeChecker : typeChecker
1691
+ typeChecker : typeInfoResolver
1682
1692
} ;
1683
1693
1684
1694
// Right of dot member completion list
1685
1695
if ( isRightOfDot ) {
1686
- var type : Type = typeChecker . getTypeOfExpression ( mappedNode ) ;
1696
+ var type : Type = typeInfoResolver . getTypeOfExpression ( mappedNode ) ;
1687
1697
if ( ! type ) {
1688
1698
return undefined ;
1689
1699
}
@@ -1731,7 +1741,7 @@ module ts {
1731
1741
isMemberCompletion = false ;
1732
1742
/// TODO filter meaning based on the current context
1733
1743
var symbolMeanings = SymbolFlags . Type | SymbolFlags . Value | SymbolFlags . Namespace ;
1734
- var symbols = typeChecker . getSymbolsInScope ( mappedNode , symbolMeanings ) ;
1744
+ var symbols = typeInfoResolver . getSymbolsInScope ( mappedNode , symbolMeanings ) ;
1735
1745
1736
1746
getCompletionEntriesFromSymbols ( symbols , activeCompletionSession ) ;
1737
1747
}
@@ -1770,7 +1780,7 @@ module ts {
1770
1780
kind : completionEntry . kind ,
1771
1781
kindModifiers : completionEntry . kindModifiers ,
1772
1782
type : session . typeChecker . typeToString ( type , session . location ) ,
1773
- fullSymbolName : typeChecker . symbolToString ( symbol , session . location ) ,
1783
+ fullSymbolName : typeInfoResolver . symbolToString ( symbol , session . location ) ,
1774
1784
docComment : ""
1775
1785
} ;
1776
1786
}
@@ -1882,13 +1892,13 @@ module ts {
1882
1892
var node = getNodeAtPosition ( sourceFile . getSourceFile ( ) , position ) ;
1883
1893
if ( ! node ) return undefined ;
1884
1894
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 ) ;
1887
1897
if ( type ) {
1888
1898
return {
1889
- memberName : new TypeScript . MemberNameString ( typeChecker . typeToString ( type ) ) ,
1899
+ memberName : new TypeScript . MemberNameString ( typeInfoResolver . typeToString ( type ) ) ,
1890
1900
docComment : "" ,
1891
- fullSymbolName : typeChecker . symbolToString ( symbol , getContainerNode ( node ) ) ,
1901
+ fullSymbolName : typeInfoResolver . symbolToString ( symbol , getContainerNode ( node ) ) ,
1892
1902
kind : getSymbolKind ( symbol ) ,
1893
1903
minChar : node . pos ,
1894
1904
limChar : node . end
@@ -2034,7 +2044,7 @@ module ts {
2034
2044
return undefined ;
2035
2045
}
2036
2046
2037
- var symbol = typeChecker . getSymbolInfo ( node ) ;
2047
+ var symbol = typeInfoResolver . getSymbolInfo ( node ) ;
2038
2048
2039
2049
// Could not find a symbol e.g. node is string or number keyword,
2040
2050
// or the symbol was an internal symbol and does not have a declaration e.g. undefined symbol
@@ -2045,10 +2055,10 @@ module ts {
2045
2055
var result : DefinitionInfo [ ] = [ ] ;
2046
2056
2047
2057
var declarations = symbol . getDeclarations ( ) ;
2048
- var symbolName = typeChecker . symbolToString ( symbol , node ) ;
2058
+ var symbolName = typeInfoResolver . symbolToString ( symbol , node ) ;
2049
2059
var symbolKind = getSymbolKind ( symbol ) ;
2050
2060
var containerSymbol = symbol . parent ;
2051
- var containerName = containerSymbol ? typeChecker . symbolToString ( containerSymbol , node ) : "" ;
2061
+ var containerName = containerSymbol ? typeInfoResolver . symbolToString ( containerSymbol , node ) : "" ;
2052
2062
var containerKind = containerSymbol ? getSymbolKind ( symbol ) : "" ;
2053
2063
2054
2064
if ( ! tryAddConstructSignature ( symbol , node , symbolKind , symbolName , containerName , result ) &&
0 commit comments