diff --git a/src/compiler/scanner.ts b/src/compiler/scanner.ts index fbad8240bd3..09a3215b0f5 100644 --- a/src/compiler/scanner.ts +++ b/src/compiler/scanner.ts @@ -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; diff --git a/src/services/formatting/formattingScanner.ts b/src/services/formatting/formattingScanner.ts index 3e6c2a9c9ff..98f7adc43aa 100644 --- a/src/services/formatting/formattingScanner.ts +++ b/src/services/formatting/formattingScanner.ts @@ -21,6 +21,7 @@ namespace ts.formatting { RescanTemplateToken, RescanJsxIdentifier, RescanJsxText, + RescanJsxAttributeValue, } export function getFormattingScanner(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: diff --git a/tests/baselines/reference/api/tsserverlibrary.d.ts b/tests/baselines/reference/api/tsserverlibrary.d.ts index 00890b067f8..831fa827014 100644 --- a/tests/baselines/reference/api/tsserverlibrary.d.ts +++ b/tests/baselines/reference/api/tsserverlibrary.d.ts @@ -3291,6 +3291,7 @@ declare namespace ts { reScanTemplateToken(): SyntaxKind; scanJsxIdentifier(): SyntaxKind; scanJsxAttributeValue(): SyntaxKind; + reScanJsxAttributeValue(): SyntaxKind; reScanJsxToken(): JsxTokenSyntaxKind; reScanLessThanToken(): SyntaxKind; reScanQuestionToken(): SyntaxKind; diff --git a/tests/baselines/reference/api/typescript.d.ts b/tests/baselines/reference/api/typescript.d.ts index 89f8bb0543d..3f1c97df0fe 100644 --- a/tests/baselines/reference/api/typescript.d.ts +++ b/tests/baselines/reference/api/typescript.d.ts @@ -3291,6 +3291,7 @@ declare namespace ts { reScanTemplateToken(): SyntaxKind; scanJsxIdentifier(): SyntaxKind; scanJsxAttributeValue(): SyntaxKind; + reScanJsxAttributeValue(): SyntaxKind; reScanJsxToken(): JsxTokenSyntaxKind; reScanLessThanToken(): SyntaxKind; reScanQuestionToken(): SyntaxKind; diff --git a/tests/cases/fourslash/formatTsxMultilineAttributeString.ts b/tests/cases/fourslash/formatTsxMultilineAttributeString.ts new file mode 100644 index 00000000000..08f41624703 --- /dev/null +++ b/tests/cases/fourslash/formatTsxMultilineAttributeString.ts @@ -0,0 +1,17 @@ +/// + +// @Filename: foo.tsx +////( +//// +////); + +format.document(); +verify.currentFileContentIs(`( + +);`);