Skip to content

Commit 72fc5db

Browse files
committed
added fullTypeCheckFlag to TypeChecker
1 parent 2a106bf commit 72fc5db

File tree

8 files changed

+224
-173
lines changed

8 files changed

+224
-173
lines changed

src/compiler/checker.ts

Lines changed: 198 additions & 152 deletions
Large diffs are not rendered by default.

src/compiler/parser.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3582,7 +3582,7 @@ module ts {
35823582
getCompilerHost: () => host,
35833583
getDiagnostics: getDiagnostics,
35843584
getGlobalDiagnostics: getGlobalDiagnostics,
3585-
getTypeChecker: () => createTypeChecker(program),
3585+
getTypeChecker: fullTypeCheckMode => createTypeChecker(program, fullTypeCheckMode),
35863586
getCommonSourceDirectory: () => commonSourceDirectory,
35873587
};
35883588
return program;

src/compiler/tsc.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -326,7 +326,7 @@ module ts {
326326
var reportStart = bindStart;
327327
}
328328
else {
329-
var checker = program.getTypeChecker();
329+
var checker = program.getTypeChecker(/*fullTypeCheckMode*/ true);
330330
var checkStart = new Date().getTime();
331331
var semanticErrors = checker.getDiagnostics();
332332
var emitStart = new Date().getTime();

src/compiler/types.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -537,7 +537,7 @@ module ts {
537537
getCompilerHost(): CompilerHost;
538538
getDiagnostics(sourceFile?: SourceFile): Diagnostic[];
539539
getGlobalDiagnostics(): Diagnostic[];
540-
getTypeChecker(): TypeChecker;
540+
getTypeChecker(fullTypeCheckMode: boolean): TypeChecker;
541541
getCommonSourceDirectory(): string;
542542
}
543543

src/harness/fourslash.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1904,7 +1904,7 @@ module FourSlash {
19041904

19051905
var host = Harness.Compiler.createCompilerHost(files, (fn, contents) => result = contents);
19061906
var program = ts.createProgram([fourslashFilename, fileName], { out: "fourslashTestOutput.js" }, host);
1907-
var checker = ts.createTypeChecker(program);
1907+
var checker = ts.createTypeChecker(program, /*fullTypeCheckMode*/ true);
19081908
checker.checkProgram();
19091909

19101910
var errs = checker.getDiagnostics(files[fileName]);

src/harness/harness.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -736,7 +736,7 @@ module Harness {
736736

737737
var hadParseErrors = program.getDiagnostics().length > 0;
738738

739-
var checker = program.getTypeChecker();
739+
var checker = program.getTypeChecker(/*fullTypeCheckMode*/ true);
740740
checker.checkProgram();
741741

742742
// only emit if there weren't parse errors

src/harness/projectsRunner.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -229,7 +229,7 @@ class ProjectRunner extends RunnerBase {
229229
var program = ts.createProgram(testCase.inputFiles, createCompilerOptions(), createCompilerHost());
230230
var errors = program.getDiagnostics();
231231
if (!errors.length) {
232-
var checker = program.getTypeChecker();
232+
var checker = program.getTypeChecker(/*fullTypeCheckMode*/ true);
233233
errors = checker.getDiagnostics();
234234
var emitResult = checker.emitFiles();
235235
errors = ts.concatenate(errors, emitResult.errors);

src/services/services.ts

Lines changed: 20 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1256,7 +1256,10 @@ 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+
var fullTypeCheckChecker: TypeChecker;
12601263
var useCaseSensitivefilenames = false;
12611264
var sourceFilesByName: Map<SourceFile> = {};
12621265
var documentRegistry = documentRegistry;
@@ -1403,15 +1406,17 @@ module ts {
14031406

14041407
// Now create a new compiler
14051408
program = createProgram(hostfilenames, compilationSettings, createCompilerHost());
1406-
typeChecker = program.getTypeChecker();
1409+
typeInfoResolver = program.getTypeChecker(/*fullTypeCheckMode*/ false);
1410+
fullTypeCheckChecker = program.getTypeChecker(/*fullTypeCheckMode*/ true);
14071411
}
14081412

14091413
/// Clean up any semantic caches that are not needed.
14101414
/// The host can call this method if it wants to jettison unused memory.
14111415
/// We will just dump the typeChecker and recreate a new one. this should have the effect of destroying all the semantic caches.
14121416
function cleanupSemanticCache(): void {
14131417
if (program) {
1414-
typeChecker = program.getTypeChecker();
1418+
typeInfoResolver = program.getTypeChecker(/*fullTypeCheckMode*/ false);
1419+
fullTypeCheckChecker = program.getTypeChecker(/*fullTypeCheckMode*/ true);
14151420
}
14161421
}
14171422

@@ -1436,7 +1441,7 @@ module ts {
14361441

14371442
filename = TypeScript.switchToForwardSlashes(filename)
14381443

1439-
return typeChecker.getDiagnostics(getSourceFile(filename).getSourceFile());
1444+
return fullTypeCheckChecker.getDiagnostics(getSourceFile(filename));
14401445
}
14411446

14421447
function getCompilerOptionsDiagnostics() {
@@ -1678,12 +1683,12 @@ module ts {
16781683
entries: [],
16791684
symbols: {},
16801685
location: mappedNode,
1681-
typeChecker: typeChecker
1686+
typeChecker: typeInfoResolver
16821687
};
16831688

16841689
// Right of dot member completion list
16851690
if (isRightOfDot) {
1686-
var type: Type = typeChecker.getTypeOfExpression(mappedNode);
1691+
var type: Type = typeInfoResolver.getTypeOfExpression(mappedNode);
16871692
if (!type) {
16881693
return undefined;
16891694
}
@@ -1731,7 +1736,7 @@ module ts {
17311736
isMemberCompletion = false;
17321737
/// TODO filter meaning based on the current context
17331738
var symbolMeanings = SymbolFlags.Type | SymbolFlags.Value | SymbolFlags.Namespace;
1734-
var symbols = typeChecker.getSymbolsInScope(mappedNode, symbolMeanings);
1739+
var symbols = typeInfoResolver.getSymbolsInScope(mappedNode, symbolMeanings);
17351740

17361741
getCompletionEntriesFromSymbols(symbols, activeCompletionSession);
17371742
}
@@ -1770,7 +1775,7 @@ module ts {
17701775
kind: completionEntry.kind,
17711776
kindModifiers: completionEntry.kindModifiers,
17721777
type: session.typeChecker.typeToString(type, session.location),
1773-
fullSymbolName: typeChecker.symbolToString(symbol, session.location),
1778+
fullSymbolName: typeInfoResolver.symbolToString(symbol, session.location),
17741779
docComment: ""
17751780
};
17761781
}
@@ -1882,13 +1887,13 @@ module ts {
18821887
var node = getNodeAtPosition(sourceFile.getSourceFile(), position);
18831888
if (!node) return undefined;
18841889

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);
18871892
if (type) {
18881893
return {
1889-
memberName: new TypeScript.MemberNameString(typeChecker.typeToString(type)),
1894+
memberName: new TypeScript.MemberNameString(typeInfoResolver.typeToString(type)),
18901895
docComment: "",
1891-
fullSymbolName: typeChecker.symbolToString(symbol, getContainerNode(node)),
1896+
fullSymbolName: typeInfoResolver.symbolToString(symbol, getContainerNode(node)),
18921897
kind: getSymbolKind(symbol),
18931898
minChar: node.pos,
18941899
limChar: node.end
@@ -2034,7 +2039,7 @@ module ts {
20342039
return undefined;
20352040
}
20362041

2037-
var symbol = typeChecker.getSymbolInfo(node);
2042+
var symbol = typeInfoResolver.getSymbolInfo(node);
20382043

20392044
// Could not find a symbol e.g. node is string or number keyword,
20402045
// or the symbol was an internal symbol and does not have a declaration e.g. undefined symbol
@@ -2045,10 +2050,10 @@ module ts {
20452050
var result: DefinitionInfo[] = [];
20462051

20472052
var declarations = symbol.getDeclarations();
2048-
var symbolName = typeChecker.symbolToString(symbol, node);
2053+
var symbolName = typeInfoResolver.symbolToString(symbol, node);
20492054
var symbolKind = getSymbolKind(symbol);
20502055
var containerSymbol = symbol.parent;
2051-
var containerName = containerSymbol ? typeChecker.symbolToString(containerSymbol, node) : "";
2056+
var containerName = containerSymbol ? typeInfoResolver.symbolToString(containerSymbol, node) : "";
20522057
var containerKind = containerSymbol ? getSymbolKind(symbol) : "";
20532058

20542059
if (!tryAddConstructSignature(symbol, node, symbolKind, symbolName, containerName, result) &&

0 commit comments

Comments
 (0)