Skip to content

Commit 9825342

Browse files
Adding semantic classification.
1 parent a6497d8 commit 9825342

File tree

3 files changed

+63
-3
lines changed

3 files changed

+63
-3
lines changed

src/services/services.ts

Lines changed: 54 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -431,6 +431,7 @@ module ts {
431431
getCompilerOptionsDiagnostics(): Diagnostic[];
432432

433433
getSyntacticClassifications(fileName: string, span: TypeScript.TextSpan): ClassifiedSpan[];
434+
getSemanticClassifications(fileName: string, span: TypeScript.TextSpan): ClassifiedSpan[];
434435

435436
getCompletionsAtPosition(fileName: string, position: number, isMemberCompletion: boolean): CompletionInfo;
436437
getCompletionEntryDetails(fileName: string, position: number, entryName: string): CompletionEntryDetails;
@@ -3152,6 +3153,55 @@ module ts {
31523153
return new TypeScript.Services.NavigationBarItemGetter().getItems(syntaxTree.sourceUnit());
31533154
}
31543155

3156+
function getSemanticClassifications(fileName: string, span: TypeScript.TextSpan): ClassifiedSpan[] {
3157+
synchronizeHostData();
3158+
fileName = TypeScript.switchToForwardSlashes(fileName);
3159+
3160+
var sourceFile = getSourceFile(fileName);
3161+
3162+
var result: ClassifiedSpan[] = [];
3163+
processNode(sourceFile.getSourceFile());
3164+
3165+
return result;
3166+
3167+
function classifySymbol(symbol: Symbol) {
3168+
var flags = symbol.getFlags();
3169+
3170+
if (flags & SymbolFlags.Class) {
3171+
return ClassificationTypeNames.className;
3172+
}
3173+
else if (flags & SymbolFlags.Enum) {
3174+
return ClassificationTypeNames.enumName;
3175+
}
3176+
else if (flags & SymbolFlags.Interface) {
3177+
return ClassificationTypeNames.interfaceName;
3178+
}
3179+
else if (flags & SymbolFlags.Module) {
3180+
return ClassificationTypeNames.moduleName;
3181+
}
3182+
else if (flags & SymbolFlags.TypeParameter) {
3183+
return ClassificationTypeNames.typeParameterName;
3184+
}
3185+
}
3186+
3187+
function processNode(node: Node) {
3188+
if (span.intersectsWith(node.getStart(), node.getWidth())) {
3189+
if (node.kind === SyntaxKind.Identifier && node.getWidth()) {
3190+
var symbol = typeInfoResolver.getSymbolInfo(node);
3191+
if (symbol) {
3192+
var span = new TypeScript.TextSpan(node.getStart(), node.getWidth());
3193+
var type = classifySymbol(symbol);
3194+
if (type) {
3195+
result.push(new ClassifiedSpan(span, type));
3196+
}
3197+
}
3198+
}
3199+
3200+
forEachChild(node, processNode);
3201+
}
3202+
}
3203+
}
3204+
31553205
function getSyntacticClassifications(fileName: string, span: TypeScript.TextSpan): ClassifiedSpan[] {
31563206
// doesn't use compiler - no need to synchronize with host
31573207
fileName = TypeScript.switchToForwardSlashes(fileName);
@@ -3184,8 +3234,9 @@ module ts {
31843234
if (TypeScript.width(token) > 0) {
31853235
var span = new TypeScript.TextSpan(TypeScript.start(token), TypeScript.width(token));
31863236
var type = classifyTokenType(token);
3187-
3188-
result.push(new ClassifiedSpan(span, type));
3237+
if (type) {
3238+
result.push(new ClassifiedSpan(span, type));
3239+
}
31893240
}
31903241

31913242
if (token.hasTrailingComment()) {
@@ -3534,6 +3585,7 @@ module ts {
35343585
getSemanticDiagnostics: getSemanticDiagnostics,
35353586
getCompilerOptionsDiagnostics: getCompilerOptionsDiagnostics,
35363587
getSyntacticClassifications: getSyntacticClassifications,
3588+
getSemanticClassifications: getSemanticClassifications,
35373589
getCompletionsAtPosition: getCompletionsAtPosition,
35383590
getCompletionEntryDetails: getCompletionEntryDetails,
35393591
getTypeAtPosition: getTypeAtPosition,

src/services/shims.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -488,6 +488,15 @@ module ts {
488488
});
489489
}
490490

491+
public getSemanticClassifications(fileName: string, start: number, length: number): string {
492+
return this.forwardJSONCall(
493+
"getSemanticClassifications('" + fileName + "', " + start + ", " + length + ")",
494+
() => {
495+
var classifications = this.languageService.getSemanticClassifications(fileName, new TypeScript.TextSpan(start, length));
496+
return classifications;
497+
});
498+
}
499+
491500
public getSyntacticDiagnostics(fileName: string): string {
492501
return this.forwardJSONCall(
493502
"getSyntacticDiagnostics('" + fileName + "')",

src/services/text/textSpan.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
///<reference path='references.ts' />
22

33
module TypeScript {
4-
54
export interface ISpan {
65
start(): number;
76
end(): number;

0 commit comments

Comments
 (0)