Skip to content

Commit 53c8b95

Browse files
authored
Fix formatting scanner on multiline JSX attribute strings (#35705)
* Fix formatting scanner on multiline JSX attribute strings * Update API
1 parent 16aae96 commit 53c8b95

File tree

5 files changed

+35
-0
lines changed

5 files changed

+35
-0
lines changed

src/compiler/scanner.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ namespace ts {
3131
reScanTemplateToken(): SyntaxKind;
3232
scanJsxIdentifier(): SyntaxKind;
3333
scanJsxAttributeValue(): SyntaxKind;
34+
reScanJsxAttributeValue(): SyntaxKind;
3435
reScanJsxToken(): JsxTokenSyntaxKind;
3536
reScanLessThanToken(): SyntaxKind;
3637
reScanQuestionToken(): SyntaxKind;
@@ -902,6 +903,7 @@ namespace ts {
902903
reScanTemplateToken,
903904
scanJsxIdentifier,
904905
scanJsxAttributeValue,
906+
reScanJsxAttributeValue,
905907
reScanJsxToken,
906908
reScanLessThanToken,
907909
reScanQuestionToken,
@@ -2133,6 +2135,11 @@ namespace ts {
21332135
}
21342136
}
21352137

2138+
function reScanJsxAttributeValue(): SyntaxKind {
2139+
pos = tokenPos = startPos;
2140+
return scanJsxAttributeValue();
2141+
}
2142+
21362143
function scanJsDocToken(): JSDocSyntaxKind {
21372144
startPos = tokenPos = pos;
21382145
tokenFlags = TokenFlags.None;

src/services/formatting/formattingScanner.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ namespace ts.formatting {
2121
RescanTemplateToken,
2222
RescanJsxIdentifier,
2323
RescanJsxText,
24+
RescanJsxAttributeValue,
2425
}
2526

2627
export function getFormattingScanner<T>(text: string, languageVariant: LanguageVariant, startPos: number, endPos: number, cb: (scanner: FormattingScanner) => T): T {
@@ -133,6 +134,10 @@ namespace ts.formatting {
133134
container.kind === SyntaxKind.TemplateTail;
134135
}
135136

137+
function shouldRescanJsxAttributeValue(node: Node): boolean {
138+
return node.parent && isJsxAttribute(node.parent) && node.parent.initializer === node;
139+
}
140+
136141
function startsWithSlashToken(t: SyntaxKind): boolean {
137142
return t === SyntaxKind.SlashToken || t === SyntaxKind.SlashEqualsToken;
138143
}
@@ -147,6 +152,7 @@ namespace ts.formatting {
147152
shouldRescanTemplateToken(n) ? ScanAction.RescanTemplateToken :
148153
shouldRescanJsxIdentifier(n) ? ScanAction.RescanJsxIdentifier :
149154
shouldRescanJsxText(n) ? ScanAction.RescanJsxText :
155+
shouldRescanJsxAttributeValue(n) ? ScanAction.RescanJsxAttributeValue :
150156
ScanAction.Scan;
151157

152158
if (lastTokenInfo && expectedScanAction === lastScanAction) {
@@ -239,6 +245,9 @@ namespace ts.formatting {
239245
case ScanAction.RescanJsxText:
240246
lastScanAction = ScanAction.RescanJsxText;
241247
return scanner.reScanJsxToken();
248+
case ScanAction.RescanJsxAttributeValue:
249+
lastScanAction = ScanAction.RescanJsxAttributeValue;
250+
return scanner.reScanJsxAttributeValue();
242251
case ScanAction.Scan:
243252
break;
244253
default:

tests/baselines/reference/api/tsserverlibrary.d.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3291,6 +3291,7 @@ declare namespace ts {
32913291
reScanTemplateToken(): SyntaxKind;
32923292
scanJsxIdentifier(): SyntaxKind;
32933293
scanJsxAttributeValue(): SyntaxKind;
3294+
reScanJsxAttributeValue(): SyntaxKind;
32943295
reScanJsxToken(): JsxTokenSyntaxKind;
32953296
reScanLessThanToken(): SyntaxKind;
32963297
reScanQuestionToken(): SyntaxKind;

tests/baselines/reference/api/typescript.d.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3291,6 +3291,7 @@ declare namespace ts {
32913291
reScanTemplateToken(): SyntaxKind;
32923292
scanJsxIdentifier(): SyntaxKind;
32933293
scanJsxAttributeValue(): SyntaxKind;
3294+
reScanJsxAttributeValue(): SyntaxKind;
32943295
reScanJsxToken(): JsxTokenSyntaxKind;
32953296
reScanLessThanToken(): SyntaxKind;
32963297
reScanQuestionToken(): SyntaxKind;
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
/// <reference path="fourslash.ts"/>
2+
3+
// @Filename: foo.tsx
4+
////(
5+
//// <input
6+
//// value="x
7+
//// x"
8+
//// />
9+
////);
10+
11+
format.document();
12+
verify.currentFileContentIs(`(
13+
<input
14+
value="x
15+
x"
16+
/>
17+
);`);

0 commit comments

Comments
 (0)