diff --git a/src/services/formatting/formattingScanner.ts b/src/services/formatting/formattingScanner.ts index 220ac21bd8b..bc79b91a551 100644 --- a/src/services/formatting/formattingScanner.ts +++ b/src/services/formatting/formattingScanner.ts @@ -146,7 +146,7 @@ module ts.formatting { if (lastTokenInfo && expectedScanAction === lastScanAction) { // readTokenInfo was called before with the same expected scan action. // No need to re-scan text, return existing 'lastTokenInfo' - return lastTokenInfo; + return fixTokenKind(lastTokenInfo, n); } if (scanner.getStartPos() !== savedPos) { @@ -207,11 +207,13 @@ module ts.formatting { } } - return lastTokenInfo = { + lastTokenInfo = { leadingTrivia: leadingTrivia, trailingTrivia: trailingTrivia, token: token } + + return fixTokenKind(lastTokenInfo, n); } function isOnToken(): boolean { @@ -219,5 +221,16 @@ module ts.formatting { var startPos = (lastTokenInfo && lastTokenInfo.token.pos) || scanner.getStartPos(); return startPos < endPos && current !== SyntaxKind.EndOfFileToken && !isTrivia(current); } + + // when containing node in the tree is token + // but its kind differs from the kind that was returned by the scanner, + // then kind needs to be fixed. This might happen in cases + // when parser interprets token differently, i.e keyword treated as identifier + function fixTokenKind(tokenInfo: TokenInfo, container: Node): TokenInfo { + if (isToken(container) && tokenInfo.token.kind !== container.kind) { + tokenInfo.token.kind = container.kind; + } + return tokenInfo; + } } } \ No newline at end of file diff --git a/tests/cases/fourslash/formattingKeywordAsIdentifier.ts b/tests/cases/fourslash/formattingKeywordAsIdentifier.ts new file mode 100644 index 00000000000..aa1a636f624 --- /dev/null +++ b/tests/cases/fourslash/formattingKeywordAsIdentifier.ts @@ -0,0 +1,7 @@ +/// + +////declare var module/*1*/ + +goTo.marker("1"); +edit.insert(";"); +verify.currentLineContentIs("declare var module;"); \ No newline at end of file