@@ -2207,33 +2207,16 @@ module ts {
2207
2207
}
2208
2208
2209
2209
/// Classifier
2210
-
2211
2210
export function createClassifier ( host : Logger ) : Classifier {
2212
- var scanner : TypeScript . Scanner . IScanner ;
2213
- var lastDiagnosticKey : string = null ;
2214
- var noRegexTable : boolean [ ] ;
2215
- var reportDiagnostic = ( position : number , fullWidth : number , key : string , args : any [ ] ) => {
2216
- lastDiagnosticKey = key ;
2217
- } ;
2218
-
2219
- if ( ! noRegexTable ) {
2220
- noRegexTable = [ ] ;
2221
- noRegexTable [ TypeScript . SyntaxKind . IdentifierName ] = true ;
2222
- noRegexTable [ TypeScript . SyntaxKind . StringLiteral ] = true ;
2223
- noRegexTable [ TypeScript . SyntaxKind . NumericLiteral ] = true ;
2224
- noRegexTable [ TypeScript . SyntaxKind . RegularExpressionLiteral ] = true ;
2225
- noRegexTable [ TypeScript . SyntaxKind . ThisKeyword ] = true ;
2226
- noRegexTable [ TypeScript . SyntaxKind . PlusPlusToken ] = true ;
2227
- noRegexTable [ TypeScript . SyntaxKind . MinusMinusToken ] = true ;
2228
- noRegexTable [ TypeScript . SyntaxKind . CloseParenToken ] = true ;
2229
- noRegexTable [ TypeScript . SyntaxKind . CloseBracketToken ] = true ;
2230
- noRegexTable [ TypeScript . SyntaxKind . CloseBraceToken ] = true ;
2231
- noRegexTable [ TypeScript . SyntaxKind . TrueKeyword ] = true ;
2232
- noRegexTable [ TypeScript . SyntaxKind . FalseKeyword ] = true ;
2233
- }
2211
+ var scanner : Scanner ;
2212
+ var noRegexTable : boolean [ ] ;
2213
+ if ( ! noRegexTable ) { noRegexTable = [ ] ; noRegexTable [ SyntaxKind . Identifier ] = true ; noRegexTable [ SyntaxKind . StringLiteral ] = true ; noRegexTable [ SyntaxKind . NumericLiteral ] = true ; noRegexTable [ SyntaxKind . RegularExpressionLiteral ] = true ; noRegexTable [ SyntaxKind . ThisKeyword ] = true ; noRegexTable [ SyntaxKind . PlusPlusToken ] = true ; noRegexTable [ SyntaxKind . MinusMinusToken ] = true ; noRegexTable [ SyntaxKind . CloseParenToken ] = true ; noRegexTable [ SyntaxKind . CloseBracketToken ] = true ; noRegexTable [ SyntaxKind . CloseBraceToken ] = true ; noRegexTable [ SyntaxKind . TrueKeyword ] = true ; noRegexTable [ SyntaxKind . FalseKeyword ] = true ; }
2234
2214
2235
2215
function getClassificationsForLine ( text : string , lexState : EndOfLineState ) : ClassificationResult {
2236
2216
var offset = 0 ;
2217
+ var lastTokenOrCommentEnd = 0 ;
2218
+ var inMultiLineComment = false ;
2219
+
2237
2220
if ( lexState !== EndOfLineState . Start ) {
2238
2221
// If we're in a string literal, then prepend: "\
2239
2222
// (and a newline). That way when we lex we'll think we're still in a string literal.
@@ -2258,94 +2241,170 @@ module ts {
2258
2241
entries : [ ]
2259
2242
} ;
2260
2243
2261
- var simpleText = TypeScript . SimpleText . fromString ( text ) ;
2262
- scanner = TypeScript . Scanner . createScanner ( ScriptTarget . ES5 , simpleText , reportDiagnostic ) ;
2244
+ scanner = createScanner ( ScriptTarget . ES5 , text , onError , processComment ) ;
2263
2245
2264
- var lastTokenKind = TypeScript . SyntaxKind . None ;
2265
- var token : TypeScript . ISyntaxToken = null ;
2246
+ var lastToken = SyntaxKind . Unknown ;
2247
+ var token = SyntaxKind . Unknown ;
2266
2248
do {
2267
- lastDiagnosticKey = null ;
2249
+ inMultiLineComment = false ;
2250
+
2251
+ token = scanner . scan ( ) ;
2252
+
2253
+ if ( ( token === SyntaxKind . SlashToken || token === SyntaxKind . SlashEqualsToken ) && ! noRegexTable [ lastToken ] ) {
2254
+ if ( scanner . reScanSlashToken ( ) === SyntaxKind . RegularExpressionLiteral ) {
2255
+ token = SyntaxKind . RegularExpressionLiteral ;
2256
+ }
2257
+ }
2268
2258
2269
- token = scanner . scan ( ! noRegexTable [ lastTokenKind ] ) ;
2270
- lastTokenKind = token . kind ( ) ;
2259
+ lastToken = token ;
2271
2260
2272
- processToken ( text , simpleText , offset , token , result ) ;
2261
+ processToken ( ) ;
2273
2262
}
2274
- while ( token . kind ( ) !== TypeScript . SyntaxKind . EndOfFileToken ) ;
2263
+ while ( token !== SyntaxKind . EndOfFileToken ) ;
2275
2264
2276
- lastDiagnosticKey = null ;
2277
2265
return result ;
2278
- }
2279
2266
2280
- function processToken ( text : string , simpleText : TypeScript . ISimpleText , offset : number , token : TypeScript . ISyntaxToken , result : ClassificationResult ) : void {
2281
- processTriviaList ( text , offset , token . leadingTrivia ( simpleText ) , result ) ;
2282
- addResult ( text , offset , result , TypeScript . width ( token ) , token . kind ( ) ) ;
2283
- processTriviaList ( text , offset , token . trailingTrivia ( simpleText ) , result ) ;
2284
2267
2285
- if ( TypeScript . fullEnd ( token ) >= text . length ) {
2286
- // We're at the end.
2287
- if ( lastDiagnosticKey === TypeScript . DiagnosticCode . AsteriskSlash_expected ) {
2288
- result . finalLexState = EndOfLineState . InMultiLineCommentTrivia ;
2289
- return ;
2290
- }
2268
+ function onError ( message : DiagnosticMessage ) : void {
2269
+ inMultiLineComment = message . key === Diagnostics . Asterisk_Slash_expected . key ;
2270
+ }
2271
+
2272
+ function processComment ( start : number , end : number ) {
2273
+ // add Leading white spaces
2274
+ addLeadingWhiteSpace ( start , end ) ;
2275
+
2276
+ // add the comment
2277
+ addResult ( end - start , TokenClass . Comment ) ;
2278
+ }
2279
+
2280
+ function processToken ( ) : void {
2281
+ var start = scanner . getTokenPos ( ) ;
2282
+ var end = scanner . getTextPos ( ) ;
2283
+
2284
+ // add Leading white spaces
2285
+ addLeadingWhiteSpace ( start , end ) ;
2286
+
2287
+ // add the token
2288
+ addResult ( end - start , classFromKind ( token ) ) ;
2291
2289
2292
- if ( token . kind ( ) === TypeScript . SyntaxKind . StringLiteral ) {
2293
- var tokenText = token . text ( ) ;
2294
- if ( tokenText . length > 0 && tokenText . charCodeAt ( tokenText . length - 1 ) === TypeScript . CharacterCodes . backslash ) {
2295
- var quoteChar = tokenText . charCodeAt ( 0 ) ;
2296
- result . finalLexState = quoteChar === TypeScript . CharacterCodes . doubleQuote
2297
- ? EndOfLineState . InDoubleQuoteStringLiteral
2298
- : EndOfLineState . InSingleQuoteStringLiteral ;
2290
+ if ( end >= text . length ) {
2291
+ // We're at the end.
2292
+ if ( inMultiLineComment ) {
2293
+ result . finalLexState = EndOfLineState . InMultiLineCommentTrivia ;
2299
2294
return ;
2300
2295
}
2296
+
2297
+ if ( token === SyntaxKind . StringLiteral ) {
2298
+ var tokenText = scanner . getTokenText ( ) ;
2299
+ if ( tokenText . length > 0 && tokenText . charCodeAt ( tokenText . length - 1 ) === CharacterCodes . backslash ) {
2300
+ var quoteChar = tokenText . charCodeAt ( 0 ) ;
2301
+ result . finalLexState = quoteChar === CharacterCodes . doubleQuote
2302
+ ? EndOfLineState . InDoubleQuoteStringLiteral
2303
+ : EndOfLineState . InSingleQuoteStringLiteral ;
2304
+ return ;
2305
+ }
2306
+ }
2301
2307
}
2302
2308
}
2303
- }
2304
2309
2305
- function processTriviaList ( text : string , offset : number , triviaList : TypeScript . ISyntaxTriviaList , result : ClassificationResult ) : void {
2306
- for ( var i = 0 , n = triviaList . count ( ) ; i < n ; i ++ ) {
2307
- var trivia = triviaList . syntaxTriviaAt ( i ) ;
2308
- addResult ( text , offset , result , trivia . fullWidth ( ) , trivia . kind ( ) ) ;
2310
+ function addLeadingWhiteSpace ( start : number , end : number ) : void {
2311
+ if ( start > lastTokenOrCommentEnd ) {
2312
+ addResult ( start - lastTokenOrCommentEnd , TokenClass . Whitespace ) ;
2313
+ }
2314
+
2315
+ // Remeber the end of the last token
2316
+ lastTokenOrCommentEnd = end ;
2309
2317
}
2310
- }
2311
2318
2312
- function addResult ( text : string , offset : number , result : ClassificationResult , length : number , kind : TypeScript . SyntaxKind ) : void {
2313
- if ( length > 0 ) {
2314
- // If this is the first classification we're adding to the list, then remove any
2315
- // offset we have if we were continuing a construct from the previous line.
2316
- if ( result . entries . length === 0 ) {
2317
- length -= offset ;
2319
+ function addResult ( length : number , classification : TokenClass ) : void {
2320
+ if ( length > 0 ) {
2321
+ // If this is the first classification we're adding to the list, then remove any
2322
+ // offset we have if we were continuing a construct from the previous line.
2323
+ if ( result . entries . length === 0 ) {
2324
+ length -= offset ;
2325
+ }
2326
+
2327
+ result . entries . push ( { length : length , classification : classification } ) ;
2318
2328
}
2329
+ }
2330
+ }
2319
2331
2320
- result . entries . push ( { length : length , classification : classFromKind ( kind ) } ) ;
2332
+ function isBinaryExpressionOperatorToken ( tokenKind : SyntaxKind ) : boolean {
2333
+ switch ( tokenKind ) {
2334
+ case SyntaxKind . AsteriskToken :
2335
+ case SyntaxKind . SlashToken :
2336
+ case SyntaxKind . PercentToken :
2337
+ case SyntaxKind . PlusToken :
2338
+ case SyntaxKind . MinusToken :
2339
+ case SyntaxKind . LessThanLessThanToken :
2340
+ case SyntaxKind . GreaterThanGreaterThanToken :
2341
+ case SyntaxKind . GreaterThanGreaterThanGreaterThanToken :
2342
+ case SyntaxKind . LessThanToken :
2343
+ case SyntaxKind . GreaterThanToken :
2344
+ case SyntaxKind . LessThanEqualsToken :
2345
+ case SyntaxKind . GreaterThanEqualsToken :
2346
+ case SyntaxKind . InstanceOfKeyword :
2347
+ case SyntaxKind . InKeyword :
2348
+ case SyntaxKind . EqualsEqualsToken :
2349
+ case SyntaxKind . ExclamationEqualsToken :
2350
+ case SyntaxKind . EqualsEqualsEqualsToken :
2351
+ case SyntaxKind . ExclamationEqualsEqualsToken :
2352
+ case SyntaxKind . AmpersandToken :
2353
+ case SyntaxKind . CaretToken :
2354
+ case SyntaxKind . BarToken :
2355
+ case SyntaxKind . AmpersandAmpersandToken :
2356
+ case SyntaxKind . BarBarToken :
2357
+ case SyntaxKind . BarEqualsToken :
2358
+ case SyntaxKind . AmpersandEqualsToken :
2359
+ case SyntaxKind . CaretEqualsToken :
2360
+ case SyntaxKind . LessThanLessThanEqualsToken :
2361
+ case SyntaxKind . GreaterThanGreaterThanEqualsToken :
2362
+ case SyntaxKind . GreaterThanGreaterThanGreaterThanEqualsToken :
2363
+ case SyntaxKind . PlusEqualsToken :
2364
+ case SyntaxKind . MinusEqualsToken :
2365
+ case SyntaxKind . AsteriskEqualsToken :
2366
+ case SyntaxKind . SlashEqualsToken :
2367
+ case SyntaxKind . PercentEqualsToken :
2368
+ case SyntaxKind . EqualsToken :
2369
+ case SyntaxKind . CommaToken :
2370
+ return true ;
2371
+ default : return false ;
2372
+ }
2373
+ }
2374
+
2375
+ function isPrefixUnaryExpressionOperatorToken ( tokenKind : SyntaxKind ) : boolean {
2376
+ switch ( tokenKind ) {
2377
+ case SyntaxKind . PlusToken :
2378
+ case SyntaxKind . MinusToken :
2379
+ case SyntaxKind . TildeToken :
2380
+ case SyntaxKind . ExclamationToken :
2381
+ case SyntaxKind . PlusPlusToken :
2382
+ case SyntaxKind . MinusMinusToken :
2383
+ return true ;
2384
+ default :
2385
+ return false ;
2321
2386
}
2322
2387
}
2323
2388
2324
- function classFromKind ( kind : TypeScript . SyntaxKind ) {
2325
- if ( TypeScript . SyntaxFacts . isAnyKeyword ( kind ) ) {
2389
+ function classFromKind ( kind : SyntaxKind ) {
2390
+ if ( kind >= SyntaxKind . FirstKeyword && kind <= SyntaxKind . LastKeyword ) {
2326
2391
return TokenClass . Keyword ;
2327
2392
}
2328
- else if ( TypeScript . SyntaxFacts . isBinaryExpressionOperatorToken ( kind ) ||
2329
- TypeScript . SyntaxFacts . isPrefixUnaryExpressionOperatorToken ( kind ) ) {
2393
+ else if ( isBinaryExpressionOperatorToken ( kind ) || isPrefixUnaryExpressionOperatorToken ( kind ) ) {
2330
2394
return TokenClass . Operator ;
2331
2395
}
2332
- else if ( TypeScript . SyntaxFacts . isAnyPunctuation ( kind ) ) {
2396
+ else if ( kind >= SyntaxKind . FirstPunctuation && kind <= SyntaxKind . LastPunctuation ) {
2333
2397
return TokenClass . Punctuation ;
2334
2398
}
2335
2399
2336
2400
switch ( kind ) {
2337
- case TypeScript . SyntaxKind . WhitespaceTrivia :
2338
- return TokenClass . Whitespace ;
2339
- case TypeScript . SyntaxKind . MultiLineCommentTrivia :
2340
- case TypeScript . SyntaxKind . SingleLineCommentTrivia :
2341
- return TokenClass . Comment ;
2342
- case TypeScript . SyntaxKind . NumericLiteral :
2401
+ case SyntaxKind . NumericLiteral :
2343
2402
return TokenClass . NumberLiteral ;
2344
- case TypeScript . SyntaxKind . StringLiteral :
2403
+ case SyntaxKind . StringLiteral :
2345
2404
return TokenClass . StringLiteral ;
2346
- case TypeScript . SyntaxKind . RegularExpressionLiteral :
2405
+ case SyntaxKind . RegularExpressionLiteral :
2347
2406
return TokenClass . RegExpLiteral ;
2348
- case TypeScript . SyntaxKind . IdentifierName :
2407
+ case SyntaxKind . Identifier :
2349
2408
default :
2350
2409
return TokenClass . Identifier ;
2351
2410
}
0 commit comments