From a3b59f88c1edd268cf5d810cfa627818c4a144f2 Mon Sep 17 00:00:00 2001 From: Daniel Rosenwasser Date: Thu, 25 Sep 2014 22:28:02 -0700 Subject: [PATCH] Fix issue where trivia is incorrectly identified as an identifier following a dot. Fixes #753 --- src/services/services.ts | 21 +++++++++++-------- .../cases/unittests/services/colorization.ts | 9 ++++++++ 2 files changed, 21 insertions(+), 9 deletions(-) diff --git a/src/services/services.ts b/src/services/services.ts index 7d11d9ab32d..3315a676d03 100644 --- a/src/services/services.ts +++ b/src/services/services.ts @@ -4550,17 +4550,16 @@ module ts { do { token = scanner.scan(); - if ((token === SyntaxKind.SlashToken || token === SyntaxKind.SlashEqualsToken) && !noRegexTable[lastNonTriviaToken]) { - if (scanner.reScanSlashToken() === SyntaxKind.RegularExpressionLiteral) { - token = SyntaxKind.RegularExpressionLiteral; + if (!isTrivia(token)) { + if ((token === SyntaxKind.SlashToken || token === SyntaxKind.SlashEqualsToken) && !noRegexTable[lastNonTriviaToken]) { + if (scanner.reScanSlashToken() === SyntaxKind.RegularExpressionLiteral) { + token = SyntaxKind.RegularExpressionLiteral; + } + } + else if (lastNonTriviaToken === SyntaxKind.DotToken) { + token = SyntaxKind.Identifier; } - } - else if (lastNonTriviaToken === SyntaxKind.DotToken) { - token = SyntaxKind.Identifier; - } - // Only recall the token if it was *not* trivia. - if (!(SyntaxKind.FirstTriviaToken <= token && token <= SyntaxKind.LastTriviaToken)) { lastNonTriviaToken = token; } @@ -4612,6 +4611,10 @@ module ts { result.entries.push({ length: length, classification: classification }); } } + + function isTrivia(token: SyntaxKind) { + return SyntaxKind.FirstTriviaToken <= token && token <= SyntaxKind.LastTriviaToken; + } } function isBinaryExpressionOperatorToken(token: SyntaxKind): boolean { diff --git a/tests/cases/unittests/services/colorization.ts b/tests/cases/unittests/services/colorization.ts index 0a5ce1f0310..09c39f165cb 100644 --- a/tests/cases/unittests/services/colorization.ts +++ b/tests/cases/unittests/services/colorization.ts @@ -189,6 +189,15 @@ describe('Colorization', function () { identifier("var")); }); + it("correctly classifies a keyword after a dot separated by comment trivia", function () { + test("a./*hello world*/ var", + ts.EndOfLineState.Start, + identifier("a"), + punctuation("."), + comment("/*hello world*/"), + identifier("var")); + }); + it("classifies a property access with whitespace around the dot", function () { test(" x .\tfoo ()", ts.EndOfLineState.Start,