diff --git a/src/services/formatting/formattingScanner.ts b/src/services/formatting/formattingScanner.ts
index 6f6167d6ba943..58e2f30448248 100644
--- a/src/services/formatting/formattingScanner.ts
+++ b/src/services/formatting/formattingScanner.ts
@@ -3,8 +3,14 @@
/* @internal */
namespace ts.formatting {
- let scanner = createScanner(ScriptTarget.Latest, /*skipTrivia*/ false);
-
+ const standardScanner = createScanner(ScriptTarget.Latest, /*skipTrivia*/ false, LanguageVariant.Standard);
+ const jsxScanner = createScanner(ScriptTarget.Latest, /*skipTrivia*/ false, LanguageVariant.JSX);
+
+ /**
+ * Scanner that is currently used for formatting
+ */
+ let scanner: Scanner;
+
export interface FormattingScanner {
advance(): void;
isOnToken(): boolean;
@@ -22,6 +28,8 @@ namespace ts.formatting {
}
export function getFormattingScanner(sourceFile: SourceFile, startPos: number, endPos: number): FormattingScanner {
+ Debug.assert(scanner === undefined);
+ scanner = sourceFile.languageVariant === LanguageVariant.JSX ? jsxScanner : standardScanner;
scanner.setText(sourceFile.text);
scanner.setTextPos(startPos);
@@ -40,12 +48,17 @@ namespace ts.formatting {
isOnToken: isOnToken,
lastTrailingTriviaWasNewLine: () => wasNewLine,
close: () => {
+ Debug.assert(scanner !== undefined);
+
lastTokenInfo = undefined;
scanner.setText(undefined);
+ scanner = undefined;
}
}
function advance(): void {
+ Debug.assert(scanner !== undefined);
+
lastTokenInfo = undefined;
let isStarted = scanner.getStartPos() !== startPos;
@@ -138,6 +151,8 @@ namespace ts.formatting {
}
function readTokenInfo(n: Node): TokenInfo {
+ Debug.assert(scanner !== undefined);
+
if (!isOnToken()) {
// scanner is not on the token (either advance was not called yet or scanner is already past the end position)
return {
@@ -245,6 +260,8 @@ namespace ts.formatting {
}
function isOnToken(): boolean {
+ Debug.assert(scanner !== undefined);
+
let current = (lastTokenInfo && lastTokenInfo.token.kind) || scanner.getToken();
let startPos = (lastTokenInfo && lastTokenInfo.token.pos) || scanner.getStartPos();
return startPos < endPos && current !== SyntaxKind.EndOfFileToken && !isTrivia(current);
diff --git a/tests/cases/fourslash/formatInTsxFiles.ts b/tests/cases/fourslash/formatInTsxFiles.ts
new file mode 100644
index 0000000000000..2585520305c31
--- /dev/null
+++ b/tests/cases/fourslash/formatInTsxFiles.ts
@@ -0,0 +1,8 @@
+///
+
+//@Filename: file.tsx
+////interface I {
+//// next: I* */
+////}
+
+format.document();
\ No newline at end of file