mirror of
https://github.com/microsoft/TypeScript.git
synced 2026-06-25 02:50:59 -05:00
Fix formatting scanner on multiline JSX attribute strings (#35705)
* Fix formatting scanner on multiline JSX attribute strings * Update API
This commit is contained in:
@@ -31,6 +31,7 @@ namespace ts {
|
||||
reScanTemplateToken(): SyntaxKind;
|
||||
scanJsxIdentifier(): SyntaxKind;
|
||||
scanJsxAttributeValue(): SyntaxKind;
|
||||
reScanJsxAttributeValue(): SyntaxKind;
|
||||
reScanJsxToken(): JsxTokenSyntaxKind;
|
||||
reScanLessThanToken(): SyntaxKind;
|
||||
reScanQuestionToken(): SyntaxKind;
|
||||
@@ -902,6 +903,7 @@ namespace ts {
|
||||
reScanTemplateToken,
|
||||
scanJsxIdentifier,
|
||||
scanJsxAttributeValue,
|
||||
reScanJsxAttributeValue,
|
||||
reScanJsxToken,
|
||||
reScanLessThanToken,
|
||||
reScanQuestionToken,
|
||||
@@ -2133,6 +2135,11 @@ namespace ts {
|
||||
}
|
||||
}
|
||||
|
||||
function reScanJsxAttributeValue(): SyntaxKind {
|
||||
pos = tokenPos = startPos;
|
||||
return scanJsxAttributeValue();
|
||||
}
|
||||
|
||||
function scanJsDocToken(): JSDocSyntaxKind {
|
||||
startPos = tokenPos = pos;
|
||||
tokenFlags = TokenFlags.None;
|
||||
|
||||
@@ -21,6 +21,7 @@ namespace ts.formatting {
|
||||
RescanTemplateToken,
|
||||
RescanJsxIdentifier,
|
||||
RescanJsxText,
|
||||
RescanJsxAttributeValue,
|
||||
}
|
||||
|
||||
export function getFormattingScanner<T>(text: string, languageVariant: LanguageVariant, startPos: number, endPos: number, cb: (scanner: FormattingScanner) => T): T {
|
||||
@@ -133,6 +134,10 @@ namespace ts.formatting {
|
||||
container.kind === SyntaxKind.TemplateTail;
|
||||
}
|
||||
|
||||
function shouldRescanJsxAttributeValue(node: Node): boolean {
|
||||
return node.parent && isJsxAttribute(node.parent) && node.parent.initializer === node;
|
||||
}
|
||||
|
||||
function startsWithSlashToken(t: SyntaxKind): boolean {
|
||||
return t === SyntaxKind.SlashToken || t === SyntaxKind.SlashEqualsToken;
|
||||
}
|
||||
@@ -147,6 +152,7 @@ namespace ts.formatting {
|
||||
shouldRescanTemplateToken(n) ? ScanAction.RescanTemplateToken :
|
||||
shouldRescanJsxIdentifier(n) ? ScanAction.RescanJsxIdentifier :
|
||||
shouldRescanJsxText(n) ? ScanAction.RescanJsxText :
|
||||
shouldRescanJsxAttributeValue(n) ? ScanAction.RescanJsxAttributeValue :
|
||||
ScanAction.Scan;
|
||||
|
||||
if (lastTokenInfo && expectedScanAction === lastScanAction) {
|
||||
@@ -239,6 +245,9 @@ namespace ts.formatting {
|
||||
case ScanAction.RescanJsxText:
|
||||
lastScanAction = ScanAction.RescanJsxText;
|
||||
return scanner.reScanJsxToken();
|
||||
case ScanAction.RescanJsxAttributeValue:
|
||||
lastScanAction = ScanAction.RescanJsxAttributeValue;
|
||||
return scanner.reScanJsxAttributeValue();
|
||||
case ScanAction.Scan:
|
||||
break;
|
||||
default:
|
||||
|
||||
@@ -3291,6 +3291,7 @@ declare namespace ts {
|
||||
reScanTemplateToken(): SyntaxKind;
|
||||
scanJsxIdentifier(): SyntaxKind;
|
||||
scanJsxAttributeValue(): SyntaxKind;
|
||||
reScanJsxAttributeValue(): SyntaxKind;
|
||||
reScanJsxToken(): JsxTokenSyntaxKind;
|
||||
reScanLessThanToken(): SyntaxKind;
|
||||
reScanQuestionToken(): SyntaxKind;
|
||||
|
||||
@@ -3291,6 +3291,7 @@ declare namespace ts {
|
||||
reScanTemplateToken(): SyntaxKind;
|
||||
scanJsxIdentifier(): SyntaxKind;
|
||||
scanJsxAttributeValue(): SyntaxKind;
|
||||
reScanJsxAttributeValue(): SyntaxKind;
|
||||
reScanJsxToken(): JsxTokenSyntaxKind;
|
||||
reScanLessThanToken(): SyntaxKind;
|
||||
reScanQuestionToken(): SyntaxKind;
|
||||
|
||||
17
tests/cases/fourslash/formatTsxMultilineAttributeString.ts
Normal file
17
tests/cases/fourslash/formatTsxMultilineAttributeString.ts
Normal file
@@ -0,0 +1,17 @@
|
||||
/// <reference path="fourslash.ts"/>
|
||||
|
||||
// @Filename: foo.tsx
|
||||
////(
|
||||
//// <input
|
||||
//// value="x
|
||||
//// x"
|
||||
//// />
|
||||
////);
|
||||
|
||||
format.document();
|
||||
verify.currentFileContentIs(`(
|
||||
<input
|
||||
value="x
|
||||
x"
|
||||
/>
|
||||
);`);
|
||||
Reference in New Issue
Block a user