From 82c3cab25fd0b59bdf5137573517fdcd9a66b838 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20Fl=C3=BCgge?= Date: Wed, 22 Apr 2026 02:16:20 +0200 Subject: [PATCH] fix(autofmt): preserve indentation of commented-out RSX blocks (#5464) * test: add failing idempotency tests for commented-out RSX blocks Two variants of the regression introduced in v0.7.4 (#5257): - commented_rsx_block: first line keeps indent, rest gets dedented - commented_rsx_block_nested: entire block gets dedented See #5463 * fix(autofmt): preserve indentation of commented-out RSX blocks Trailing comments before `}` in write_rsx_block were indented at parent level instead of child level. Truncate the tab from tabbed_line() and bump indent to child level before apply_line_comments, same approach as write_trailing_body_comments. Fixes #5463 --- packages/autofmt/src/writer.rs | 6 ++++++ packages/autofmt/tests/samples.rs | 5 +++++ .../autofmt/tests/samples/commented_rsx_block.rsx | 9 +++++++++ .../tests/samples/commented_rsx_block_between.rsx | 9 +++++++++ .../tests/samples/commented_rsx_block_deep.rsx | 12 ++++++++++++ .../tests/samples/commented_rsx_block_nested.rsx | 13 +++++++++++++ .../tests/samples/commented_rsx_block_only.rsx | 6 ++++++ 7 files changed, 60 insertions(+) create mode 100644 packages/autofmt/tests/samples/commented_rsx_block.rsx create mode 100644 packages/autofmt/tests/samples/commented_rsx_block_between.rsx create mode 100644 packages/autofmt/tests/samples/commented_rsx_block_deep.rsx create mode 100644 packages/autofmt/tests/samples/commented_rsx_block_nested.rsx create mode 100644 packages/autofmt/tests/samples/commented_rsx_block_only.rsx diff --git a/packages/autofmt/src/writer.rs b/packages/autofmt/src/writer.rs index d9dfbd3ec..462a4ba83 100644 --- a/packages/autofmt/src/writer.rs +++ b/packages/autofmt/src/writer.rs @@ -426,7 +426,13 @@ impl<'a> Writer<'a> { { let comments = self.accumulate_full_line_comments(brace.span.span().end()); if !comments.is_empty() { + // Undo the tab from tabbed_line(). It positioned for the closing + // brace, but trailing comments need child-level indentation + let tab_width = self.out.indent.indent_str().len() * self.out.indent_level; + self.out.buf.truncate(self.out.buf.len() - tab_width); + self.out.indent_level += 1; self.apply_line_comments(comments)?; + self.out.indent_level -= 1; self.out.tab()?; } } diff --git a/packages/autofmt/tests/samples.rs b/packages/autofmt/tests/samples.rs index 7a8257f73..d38cfef93 100644 --- a/packages/autofmt/tests/samples.rs +++ b/packages/autofmt/tests/samples.rs @@ -69,6 +69,11 @@ twoway![ blank_lines, blank_lines_preserved, forloop_tuple, + commented_rsx_block, + commented_rsx_block_nested, + commented_rsx_block_only, + commented_rsx_block_between, + commented_rsx_block_deep, ]; fn assert_idempotent(src: &str) { diff --git a/packages/autofmt/tests/samples/commented_rsx_block.rsx b/packages/autofmt/tests/samples/commented_rsx_block.rsx new file mode 100644 index 000000000..5de4d232d --- /dev/null +++ b/packages/autofmt/tests/samples/commented_rsx_block.rsx @@ -0,0 +1,9 @@ +rsx! { + div { + h2 { "Title" } + // div { class: "wrapper", + // p { "A" } + // p { "B" } + // } + } +} diff --git a/packages/autofmt/tests/samples/commented_rsx_block_between.rsx b/packages/autofmt/tests/samples/commented_rsx_block_between.rsx new file mode 100644 index 000000000..a547417f5 --- /dev/null +++ b/packages/autofmt/tests/samples/commented_rsx_block_between.rsx @@ -0,0 +1,9 @@ +rsx! { + div { + h1 { "Before" } + // div { class: "commented", + // p { "A" } + // } + h2 { "After" } + } +} diff --git a/packages/autofmt/tests/samples/commented_rsx_block_deep.rsx b/packages/autofmt/tests/samples/commented_rsx_block_deep.rsx new file mode 100644 index 000000000..3affb9327 --- /dev/null +++ b/packages/autofmt/tests/samples/commented_rsx_block_deep.rsx @@ -0,0 +1,12 @@ +rsx! { + div { + div { + div { + h2 { "Title" } + // div { class: "deep", + // p { "A" } + // } + } + } + } +} diff --git a/packages/autofmt/tests/samples/commented_rsx_block_nested.rsx b/packages/autofmt/tests/samples/commented_rsx_block_nested.rsx new file mode 100644 index 000000000..1da97f33e --- /dev/null +++ b/packages/autofmt/tests/samples/commented_rsx_block_nested.rsx @@ -0,0 +1,13 @@ +rsx! { + Component { + field: rsx! { + div { + h2 { "Title" } + // div { class: "wrapper", + // // nested comment + // p { "A" } + // } + } + }, + } +} diff --git a/packages/autofmt/tests/samples/commented_rsx_block_only.rsx b/packages/autofmt/tests/samples/commented_rsx_block_only.rsx new file mode 100644 index 000000000..bbbc099f5 --- /dev/null +++ b/packages/autofmt/tests/samples/commented_rsx_block_only.rsx @@ -0,0 +1,6 @@ +rsx! { + div { + // p { "A" } + // p { "B" } + } +}