Skip to content

Commit 9560895

Browse files
Don't bother trying to semantically classify names that could never be typenames.
1 parent 29fcd4a commit 9560895

File tree

4 files changed

+35
-5
lines changed

4 files changed

+35
-5
lines changed

src/compiler/binder.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,10 +90,12 @@ module ts {
9090
let lastContainer: Node;
9191
let symbolCount = 0;
9292
let Symbol = objectAllocator.getSymbolConstructor();
93+
let typeNames: Map<string> = {};
9394

9495
if (!file.locals) {
9596
bind(file);
9697
file.symbolCount = symbolCount;
98+
file.typeNames = typeNames;
9799
}
98100

99101
return;
@@ -194,6 +196,11 @@ module ts {
194196
symbol = hasProperty(symbolTable, name)
195197
? symbolTable[name]
196198
: (symbolTable[name] = createSymbol(SymbolFlags.None, name));
199+
200+
if (name && (includes & (SymbolFlags.Class | SymbolFlags.Enum | SymbolFlags.TypeAlias | SymbolFlags.Interface | SymbolFlags.TypeParameter | SymbolFlags.Module))) {
201+
typeNames[name] = name;
202+
}
203+
197204
if (symbol.flags & excludes) {
198205
if (node.name) {
199206
node.name.parent = node;

src/compiler/program.ts

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -148,6 +148,7 @@ module ts {
148148
let commonSourceDirectory: string;
149149
let diagnosticsProducingTypeChecker: TypeChecker;
150150
let noDiagnosticsTypeChecker: TypeChecker;
151+
let typeNames: Map<string>;
151152

152153
let start = new Date().getTime();
153154

@@ -172,6 +173,7 @@ module ts {
172173
getDeclarationDiagnostics,
173174
getCompilerOptionsDiagnostics,
174175
getTypeChecker,
176+
getTypeNames,
175177
getDiagnosticsProducingTypeChecker,
176178
getCommonSourceDirectory: () => commonSourceDirectory,
177179
emit,
@@ -183,6 +185,20 @@ module ts {
183185
};
184186
return program;
185187

188+
function getTypeNames() {
189+
if (!typeNames) {
190+
// Initialize a checker so that all our files are bound.
191+
getTypeChecker();
192+
typeNames = {};
193+
194+
for (let sourceFile of files) {
195+
copyMap(sourceFile.typeNames, typeNames);
196+
}
197+
}
198+
199+
return typeNames;
200+
}
201+
186202
function getEmitHost(writeFileCallback?: WriteFileCallback): EmitHost {
187203
return {
188204
getCanonicalFileName: fileName => host.getCanonicalFileName(fileName),

src/compiler/types.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -422,6 +422,7 @@ module ts {
422422
/* @internal */ locals?: SymbolTable; // Locals associated with node (initialized by binding)
423423
/* @internal */ nextContainer?: Node; // Next container in declaration order (initialized by binding)
424424
/* @internal */ localSymbol?: Symbol; // Local symbol declared by node (initialized by binding only for exported nodes)
425+
/* @internal */ typeNames?: Map<string>;
425426
}
426427

427428
export interface NodeArray<T> extends Array<T>, TextRange {
@@ -1223,6 +1224,8 @@ module ts {
12231224
// language service).
12241225
/* @internal */ getDiagnosticsProducingTypeChecker(): TypeChecker;
12251226

1227+
/* @internal */ getTypeNames(): Map<string>;
1228+
12261229
/* @internal */ getNodeCount(): number;
12271230
/* @internal */ getIdentifierCount(): number;
12281231
/* @internal */ getSymbolCount(): number;

src/services/services.ts

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5992,6 +5992,7 @@ module ts {
59925992
let typeChecker = program.getTypeChecker();
59935993

59945994
let result: number[] = [];
5995+
let typeNames = program.getTypeNames();
59955996
processNode(sourceFile);
59965997

59975998
return { spans: result, endOfLineState: EndOfLineState.None };
@@ -6048,11 +6049,14 @@ module ts {
60486049
// Only walk into nodes that intersect the requested span.
60496050
if (node && textSpanIntersectsWith(span, node.getFullStart(), node.getFullWidth())) {
60506051
if (node.kind === SyntaxKind.Identifier && !nodeIsMissing(node)) {
6051-
let symbol = typeChecker.getSymbolAtLocation(node);
6052-
if (symbol) {
6053-
let type = classifySymbol(symbol, getMeaningFromLocation(node));
6054-
if (type) {
6055-
pushClassification(node.getStart(), node.getWidth(), type);
6052+
let identifier = <Identifier>node;
6053+
if (typeNames[identifier.text]) {
6054+
let symbol = typeChecker.getSymbolAtLocation(node);
6055+
if (symbol) {
6056+
let type = classifySymbol(symbol, getMeaningFromLocation(node));
6057+
if (type) {
6058+
pushClassification(node.getStart(), node.getWidth(), type);
6059+
}
60566060
}
60576061
}
60586062
}

0 commit comments

Comments
 (0)