@@ -431,6 +431,7 @@ module ts {
431
431
getCompilerOptionsDiagnostics ( ) : Diagnostic [ ] ;
432
432
433
433
getSyntacticClassifications ( fileName : string , span : TypeScript . TextSpan ) : ClassifiedSpan [ ] ;
434
+ getSemanticClassifications ( fileName : string , span : TypeScript . TextSpan ) : ClassifiedSpan [ ] ;
434
435
435
436
getCompletionsAtPosition ( fileName : string , position : number , isMemberCompletion : boolean ) : CompletionInfo ;
436
437
getCompletionEntryDetails ( fileName : string , position : number , entryName : string ) : CompletionEntryDetails ;
@@ -3152,6 +3153,55 @@ module ts {
3152
3153
return new TypeScript . Services . NavigationBarItemGetter ( ) . getItems ( syntaxTree . sourceUnit ( ) ) ;
3153
3154
}
3154
3155
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
+
3155
3205
function getSyntacticClassifications ( fileName : string , span : TypeScript . TextSpan ) : ClassifiedSpan [ ] {
3156
3206
// doesn't use compiler - no need to synchronize with host
3157
3207
fileName = TypeScript . switchToForwardSlashes ( fileName ) ;
@@ -3184,8 +3234,9 @@ module ts {
3184
3234
if ( TypeScript . width ( token ) > 0 ) {
3185
3235
var span = new TypeScript . TextSpan ( TypeScript . start ( token ) , TypeScript . width ( token ) ) ;
3186
3236
var type = classifyTokenType ( token ) ;
3187
-
3188
- result . push ( new ClassifiedSpan ( span , type ) ) ;
3237
+ if ( type ) {
3238
+ result . push ( new ClassifiedSpan ( span , type ) ) ;
3239
+ }
3189
3240
}
3190
3241
3191
3242
if ( token . hasTrailingComment ( ) ) {
@@ -3534,6 +3585,7 @@ module ts {
3534
3585
getSemanticDiagnostics : getSemanticDiagnostics ,
3535
3586
getCompilerOptionsDiagnostics : getCompilerOptionsDiagnostics ,
3536
3587
getSyntacticClassifications : getSyntacticClassifications ,
3588
+ getSemanticClassifications : getSemanticClassifications ,
3537
3589
getCompletionsAtPosition : getCompletionsAtPosition ,
3538
3590
getCompletionEntryDetails : getCompletionEntryDetails ,
3539
3591
getTypeAtPosition : getTypeAtPosition ,
0 commit comments