Skip to content

Commit a52cdaf

Browse files
committed
Merge pull request #450 from Microsoft/fullTypeCheckFlag
added fullTypeCheckFlag to TypeChecker
2 parents 55db9dc + a271b94 commit a52cdaf

File tree

8 files changed

+238
-175
lines changed

8 files changed

+238
-175
lines changed

src/compiler/checker.ts

Lines changed: 207 additions & 154 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
@@ -129,7 +129,7 @@ class ProjectRunner extends RunnerBase {
129129
var errors = program.getDiagnostics();
130130
var sourceMapData: ts.SourceMapData[] = null;
131131
if (!errors.length) {
132-
var checker = program.getTypeChecker();
132+
var checker = program.getTypeChecker(/*fullTypeCheck*/ true);
133133
errors = checker.getDiagnostics();
134134
var emitResult = checker.emitFiles();
135135
errors = ts.concatenate(errors, emitResult.errors);

src/services/services.ts

Lines changed: 25 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)