Skip to content

Commit 85a29d2

Browse files
committed
Merge pull request microsoft#4932 from Microsoft/formatMalformedTsx
use formatting scanner with languageVariant=JSX for .tsx files
2 parents 83991c0 + 5078152 commit 85a29d2

File tree

2 files changed

+27
-2
lines changed

2 files changed

+27
-2
lines changed

src/services/formatting/formattingScanner.ts

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,14 @@
33

44
/* @internal */
55
namespace ts.formatting {
6-
let scanner = createScanner(ScriptTarget.Latest, /*skipTrivia*/ false);
7-
6+
const standardScanner = createScanner(ScriptTarget.Latest, /*skipTrivia*/ false, LanguageVariant.Standard);
7+
const jsxScanner = createScanner(ScriptTarget.Latest, /*skipTrivia*/ false, LanguageVariant.JSX);
8+
9+
/**
10+
* Scanner that is currently used for formatting
11+
*/
12+
let scanner: Scanner;
13+
814
export interface FormattingScanner {
915
advance(): void;
1016
isOnToken(): boolean;
@@ -22,6 +28,8 @@ namespace ts.formatting {
2228
}
2329

2430
export function getFormattingScanner(sourceFile: SourceFile, startPos: number, endPos: number): FormattingScanner {
31+
Debug.assert(scanner === undefined);
32+
scanner = sourceFile.languageVariant === LanguageVariant.JSX ? jsxScanner : standardScanner;
2533

2634
scanner.setText(sourceFile.text);
2735
scanner.setTextPos(startPos);
@@ -40,12 +48,17 @@ namespace ts.formatting {
4048
isOnToken: isOnToken,
4149
lastTrailingTriviaWasNewLine: () => wasNewLine,
4250
close: () => {
51+
Debug.assert(scanner !== undefined);
52+
4353
lastTokenInfo = undefined;
4454
scanner.setText(undefined);
55+
scanner = undefined;
4556
}
4657
}
4758

4859
function advance(): void {
60+
Debug.assert(scanner !== undefined);
61+
4962
lastTokenInfo = undefined;
5063
let isStarted = scanner.getStartPos() !== startPos;
5164

@@ -138,6 +151,8 @@ namespace ts.formatting {
138151
}
139152

140153
function readTokenInfo(n: Node): TokenInfo {
154+
Debug.assert(scanner !== undefined);
155+
141156
if (!isOnToken()) {
142157
// scanner is not on the token (either advance was not called yet or scanner is already past the end position)
143158
return {
@@ -245,6 +260,8 @@ namespace ts.formatting {
245260
}
246261

247262
function isOnToken(): boolean {
263+
Debug.assert(scanner !== undefined);
264+
248265
let current = (lastTokenInfo && lastTokenInfo.token.kind) || scanner.getToken();
249266
let startPos = (lastTokenInfo && lastTokenInfo.token.pos) || scanner.getStartPos();
250267
return startPos < endPos && current !== SyntaxKind.EndOfFileToken && !isTrivia(current);
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
/// <reference path="fourslash.ts"/>
2+
3+
//@Filename: file.tsx
4+
////interface I<T1, T2> {
5+
//// next: I</* */
6+
////}
7+
8+
format.document();

0 commit comments

Comments
 (0)