From 669e6d662c62c3e0b69def3f4485aaa9ddd87b05 Mon Sep 17 00:00:00 2001 From: ahfoysal Date: Tue, 7 Jul 2026 14:38:15 +0600 Subject: [PATCH] fix(formatting): realign scanner for mis-spanned child tokens Handle recovery cases where a token ends after the current child while formatting invalid syntax, to avoid entering invalid scanner state. Fixes #63598. --- src/services/formatting/formatting.ts | 14 +++++++------- .../cases/fourslash/formattingTokenEndChildEnd.ts | 7 +++++++ 2 files changed, 14 insertions(+), 7 deletions(-) create mode 100644 tests/cases/fourslash/formattingTokenEndChildEnd.ts diff --git a/src/services/formatting/formatting.ts b/src/services/formatting/formatting.ts index e641b0f2b0434..6570e4174654f 100644 --- a/src/services/formatting/formatting.ts +++ b/src/services/formatting/formatting.ts @@ -857,13 +857,13 @@ function formatSpanWorker( if (tokenInfo.token.end > originalRange.end) { return inheritedIndentation; } - if (tokenInfo.token.end > childStartPos) { - if (tokenInfo.token.pos > childStartPos) { - formattingScanner.skipToStartOf(child); - } - // stop when formatting scanner advances past the beginning of the child - break; - } + if (tokenInfo.token.end > childStartPos) { + if (tokenInfo.token.pos > childStartPos || tokenInfo.token.end > child.end) { + formattingScanner.skipToStartOf(child); + } + // stop when formatting scanner advances past the beginning of the child + break; + } consumeTokenAndAdvanceScanner(tokenInfo, node, parentDynamicIndentation, node); } diff --git a/tests/cases/fourslash/formattingTokenEndChildEnd.ts b/tests/cases/fourslash/formattingTokenEndChildEnd.ts new file mode 100644 index 0000000000000..30b52c42956c8 --- /dev/null +++ b/tests/cases/fourslash/formattingTokenEndChildEnd.ts @@ -0,0 +1,7 @@ +/// + +/////*start*/type X = { prop: = `${abc}`xyz }; +format.document(); + +goTo.marker("start"); +verify.currentLineContentIs("type X = { prop: = `${abc}`xyz };");