@@ -659,6 +659,8 @@ module ts {
659
659
InMultiLineCommentTrivia ,
660
660
InSingleQuoteStringLiteral ,
661
661
InDoubleQuoteStringLiteral ,
662
+ EndingWithKeyword ,
663
+ EndingWithDotToken ,
662
664
}
663
665
664
666
export enum TokenClass {
@@ -2217,25 +2219,33 @@ module ts {
2217
2219
function getClassificationsForLine ( text : string , lexState : EndOfLineState ) : ClassificationResult {
2218
2220
var offset = 0 ;
2219
2221
var lastTokenOrCommentEnd = 0 ;
2220
- var inMultiLineComment = false ;
2221
-
2222
- if ( lexState !== EndOfLineState . Start ) {
2223
- // If we're in a string literal, then prepend: "\
2224
- // (and a newline). That way when we lex we'll think we're still in a string literal.
2225
- //
2226
- // If we're in a multiline comment, then prepend: /*
2227
- // (and a newline). That way when we lex we'll think we're still in a multiline comment.
2228
- if ( lexState === EndOfLineState . InDoubleQuoteStringLiteral ) {
2222
+ var lastToken = SyntaxKind . Unknown ;
2223
+ var inUnterminatedMultiLineComment = false ;
2224
+
2225
+ // If we're in a string literal, then prepend: "\
2226
+ // (and a newline). That way when we lex we'll think we're still in a string literal.
2227
+ //
2228
+ // If we're in a multiline comment, then prepend: /*
2229
+ // (and a newline). That way when we lex we'll think we're still in a multiline comment.
2230
+ switch ( lexState ) {
2231
+ case EndOfLineState . InDoubleQuoteStringLiteral :
2229
2232
text = '"\\\n' + text ;
2230
- }
2231
- else if ( lexState === EndOfLineState . InSingleQuoteStringLiteral ) {
2233
+ offset = 3 ;
2234
+ break ;
2235
+ case EndOfLineState . InSingleQuoteStringLiteral :
2232
2236
text = "'\\\n" + text ;
2233
- }
2234
- else if ( lexState === EndOfLineState . InMultiLineCommentTrivia ) {
2237
+ offset = 3 ;
2238
+ break ;
2239
+ case EndOfLineState . InMultiLineCommentTrivia :
2235
2240
text = "/*\n" + text ;
2236
- }
2237
-
2238
- offset = 3 ;
2241
+ offset = 3 ;
2242
+ break ;
2243
+ case EndOfLineState . EndingWithDotToken :
2244
+ lastToken = SyntaxKind . DotToken ;
2245
+ break ;
2246
+ case EndOfLineState . EndingWithKeyword :
2247
+ lastToken = SyntaxKind . FirstKeyword ;
2248
+ break ;
2239
2249
}
2240
2250
2241
2251
var result : ClassificationResult = {
@@ -2245,18 +2255,18 @@ module ts {
2245
2255
2246
2256
scanner = createScanner ( ScriptTarget . ES5 , text , onError , processComment ) ;
2247
2257
2248
- var lastToken = SyntaxKind . Unknown ;
2249
2258
var token = SyntaxKind . Unknown ;
2250
2259
do {
2251
- inMultiLineComment = false ;
2252
-
2253
2260
token = scanner . scan ( ) ;
2254
2261
2255
2262
if ( ( token === SyntaxKind . SlashToken || token === SyntaxKind . SlashEqualsToken ) && ! noRegexTable [ lastToken ] ) {
2256
2263
if ( scanner . reScanSlashToken ( ) === SyntaxKind . RegularExpressionLiteral ) {
2257
2264
token = SyntaxKind . RegularExpressionLiteral ;
2258
2265
}
2259
2266
}
2267
+ else if ( isKeyword ( token ) && ( isKeyword ( lastToken ) || lastToken === SyntaxKind . DotToken ) ) {
2268
+ token = SyntaxKind . Identifier ;
2269
+ }
2260
2270
2261
2271
lastToken = token ;
2262
2272
@@ -2268,7 +2278,7 @@ module ts {
2268
2278
2269
2279
2270
2280
function onError ( message : DiagnosticMessage ) : void {
2271
- inMultiLineComment = message . key === Diagnostics . Asterisk_Slash_expected . key ;
2281
+ inUnterminatedMultiLineComment = message . key === Diagnostics . Asterisk_Slash_expected . key ;
2272
2282
}
2273
2283
2274
2284
function processComment ( start : number , end : number ) {
@@ -2291,21 +2301,24 @@ module ts {
2291
2301
2292
2302
if ( end >= text . length ) {
2293
2303
// We're at the end.
2294
- if ( inMultiLineComment ) {
2304
+ if ( inUnterminatedMultiLineComment ) {
2295
2305
result . finalLexState = EndOfLineState . InMultiLineCommentTrivia ;
2296
- return ;
2297
2306
}
2298
-
2299
- if ( token === SyntaxKind . StringLiteral ) {
2307
+ else if ( token === SyntaxKind . StringLiteral ) {
2300
2308
var tokenText = scanner . getTokenText ( ) ;
2301
2309
if ( tokenText . length > 0 && tokenText . charCodeAt ( tokenText . length - 1 ) === CharacterCodes . backslash ) {
2302
2310
var quoteChar = tokenText . charCodeAt ( 0 ) ;
2303
2311
result . finalLexState = quoteChar === CharacterCodes . doubleQuote
2304
2312
? EndOfLineState . InDoubleQuoteStringLiteral
2305
2313
: EndOfLineState . InSingleQuoteStringLiteral ;
2306
- return ;
2307
2314
}
2308
2315
}
2316
+ else if ( token === SyntaxKind . DotToken ) {
2317
+ result . finalLexState = EndOfLineState . EndingWithDotToken ;
2318
+ }
2319
+ else if ( isKeyword ( token ) ) {
2320
+ result . finalLexState = EndOfLineState . EndingWithKeyword ;
2321
+ }
2309
2322
}
2310
2323
}
2311
2324
@@ -2331,8 +2344,8 @@ module ts {
2331
2344
}
2332
2345
}
2333
2346
2334
- function isBinaryExpressionOperatorToken ( tokenKind : SyntaxKind ) : boolean {
2335
- switch ( tokenKind ) {
2347
+ function isBinaryExpressionOperatorToken ( token : SyntaxKind ) : boolean {
2348
+ switch ( token ) {
2336
2349
case SyntaxKind . AsteriskToken :
2337
2350
case SyntaxKind . SlashToken :
2338
2351
case SyntaxKind . PercentToken :
@@ -2374,8 +2387,8 @@ module ts {
2374
2387
}
2375
2388
}
2376
2389
2377
- function isPrefixUnaryExpressionOperatorToken ( tokenKind : SyntaxKind ) : boolean {
2378
- switch ( tokenKind ) {
2390
+ function isPrefixUnaryExpressionOperatorToken ( token : SyntaxKind ) : boolean {
2391
+ switch ( token ) {
2379
2392
case SyntaxKind . PlusToken :
2380
2393
case SyntaxKind . MinusToken :
2381
2394
case SyntaxKind . TildeToken :
@@ -2388,18 +2401,22 @@ module ts {
2388
2401
}
2389
2402
}
2390
2403
2391
- function classFromKind ( kind : SyntaxKind ) {
2392
- if ( kind >= SyntaxKind . FirstKeyword && kind <= SyntaxKind . LastKeyword ) {
2404
+ function isKeyword ( token : SyntaxKind ) : boolean {
2405
+ return token >= SyntaxKind . FirstKeyword && token <= SyntaxKind . LastKeyword ;
2406
+ }
2407
+
2408
+ function classFromKind ( token : SyntaxKind ) {
2409
+ if ( isKeyword ( token ) ) {
2393
2410
return TokenClass . Keyword ;
2394
2411
}
2395
- else if ( isBinaryExpressionOperatorToken ( kind ) || isPrefixUnaryExpressionOperatorToken ( kind ) ) {
2412
+ else if ( isBinaryExpressionOperatorToken ( token ) || isPrefixUnaryExpressionOperatorToken ( token ) ) {
2396
2413
return TokenClass . Operator ;
2397
2414
}
2398
- else if ( kind >= SyntaxKind . FirstPunctuation && kind <= SyntaxKind . LastPunctuation ) {
2415
+ else if ( token >= SyntaxKind . FirstPunctuation && token <= SyntaxKind . LastPunctuation ) {
2399
2416
return TokenClass . Punctuation ;
2400
2417
}
2401
2418
2402
- switch ( kind ) {
2419
+ switch ( token ) {
2403
2420
case SyntaxKind . NumericLiteral :
2404
2421
return TokenClass . NumberLiteral ;
2405
2422
case SyntaxKind . StringLiteral :
0 commit comments