From a44f0e8ca421a7d48f49e4f31e7a0a27cab88c44 Mon Sep 17 00:00:00 2001 From: Matthew Hughes Date: Fri, 25 Jul 2025 19:32:31 +0100 Subject: [PATCH] Fix incorrect whitespace modifications to non-rust code blocks * Fix whitespace was being prepended to leading blank line * Fix trailing blank line was being stripped Fixes: #6609 Fixes: #6015 --- src/comment.rs | 29 ++++++++++++++----- .../complete_code_block_leading_blank_line.rs | 7 +++++ ...complete_code_block_leadling_blank_line.rs | 6 ++++ ...complete_code_block_trailing_blank_line.rs | 10 +++++++ ...complete_code_block_trailing_blank_line.rs | 9 ++++++ .../complete_code_block_leading_blank_line.rs | 7 +++++ ...complete_code_block_leadling_blank_line.rs | 6 ++++ ...complete_code_block_trailing_blank_line.rs | 10 +++++++ ...complete_code_block_trailing_blank_line.rs | 9 ++++++ 9 files changed, 85 insertions(+), 8 deletions(-) create mode 100644 tests/source/issue-6015/complete_code_block_leading_blank_line.rs create mode 100644 tests/source/issue-6015/incomplete_code_block_leadling_blank_line.rs create mode 100644 tests/source/issue-6609/complete_code_block_trailing_blank_line.rs create mode 100644 tests/source/issue-6609/incomplete_code_block_trailing_blank_line.rs create mode 100644 tests/target/issue-6015/complete_code_block_leading_blank_line.rs create mode 100644 tests/target/issue-6015/incomplete_code_block_leadling_blank_line.rs create mode 100644 tests/target/issue-6609/complete_code_block_trailing_blank_line.rs create mode 100644 tests/target/issue-6609/incomplete_code_block_trailing_blank_line.rs diff --git a/src/comment.rs b/src/comment.rs index 709031dda44..41f80964cc6 100644 --- a/src/comment.rs +++ b/src/comment.rs @@ -664,11 +664,9 @@ impl<'a> CommentRewrite<'a> { if !self.code_block_buffer.is_empty() { // There is a code block that is not properly enclosed by backticks. // We will leave them untouched. - self.result.push_str(&self.comment_line_separator); - self.result.push_str(&Self::join_block( - &trim_custom_comment_prefix(&self.code_block_buffer), - &self.comment_line_separator, - )); + self.result.push_str( + &self.finish_code_block(&trim_custom_comment_prefix(&self.code_block_buffer)), + ); } if let Some(ref ib) = self.item_block { @@ -707,6 +705,23 @@ impl<'a> CommentRewrite<'a> { self.result } + fn finish_code_block(&self, code_block: &str) -> String { + let result = match code_block.lines().next().unwrap() { + "" => self.comment_line_separator.trim_end().to_string(), + _ => self.comment_line_separator.clone(), + }; + + result + + &Self::join_block( + // preserve trailing newline: + // block is non-empty, so it must end with "\n", + // and join_block calls: str.lines().collect().join("\n"), + // which will strip a trailing newline + &format!("{code_block}\n"), + &self.comment_line_separator, + ) + } + fn handle_line( &mut self, orig: &'a str, @@ -775,9 +790,7 @@ impl<'a> CommentRewrite<'a> { _ => trim_custom_comment_prefix(&self.code_block_buffer), }; if !code_block.is_empty() { - self.result.push_str(&self.comment_line_separator); - self.result - .push_str(&Self::join_block(&code_block, &self.comment_line_separator)); + self.result.push_str(&self.finish_code_block(&code_block)); } self.code_block_buffer.clear(); self.result.push_str(&self.comment_line_separator); diff --git a/tests/source/issue-6015/complete_code_block_leading_blank_line.rs b/tests/source/issue-6015/complete_code_block_leading_blank_line.rs new file mode 100644 index 00000000000..8068ed1731f --- /dev/null +++ b/tests/source/issue-6015/complete_code_block_leading_blank_line.rs @@ -0,0 +1,7 @@ +// rustfmt-format_code_in_doc_comments: true + +/// ```text +/// +/// This is a non-rust code block +/// ``` +struct S; diff --git a/tests/source/issue-6015/incomplete_code_block_leadling_blank_line.rs b/tests/source/issue-6015/incomplete_code_block_leadling_blank_line.rs new file mode 100644 index 00000000000..80ba6fa4f31 --- /dev/null +++ b/tests/source/issue-6015/incomplete_code_block_leadling_blank_line.rs @@ -0,0 +1,6 @@ +// rustfmt-format_code_in_doc_comments: true + +/// ```text +/// +/// This is a non-rust code block +struct S; diff --git a/tests/source/issue-6609/complete_code_block_trailing_blank_line.rs b/tests/source/issue-6609/complete_code_block_trailing_blank_line.rs new file mode 100644 index 00000000000..53eefa965d4 --- /dev/null +++ b/tests/source/issue-6609/complete_code_block_trailing_blank_line.rs @@ -0,0 +1,10 @@ +// rustfmt-format_code_in_doc_comments: true + +/// Some comment. +/// +/// ```text +/// This is a non-rust code block +/// +/// +/// ``` +struct S; diff --git a/tests/source/issue-6609/incomplete_code_block_trailing_blank_line.rs b/tests/source/issue-6609/incomplete_code_block_trailing_blank_line.rs new file mode 100644 index 00000000000..589856153ee --- /dev/null +++ b/tests/source/issue-6609/incomplete_code_block_trailing_blank_line.rs @@ -0,0 +1,9 @@ +// rustfmt-format_code_in_doc_comments: true + +/// Some comment. +/// +/// ```text +/// This is a non-rust code block +/// +/// +struct S; diff --git a/tests/target/issue-6015/complete_code_block_leading_blank_line.rs b/tests/target/issue-6015/complete_code_block_leading_blank_line.rs new file mode 100644 index 00000000000..8068ed1731f --- /dev/null +++ b/tests/target/issue-6015/complete_code_block_leading_blank_line.rs @@ -0,0 +1,7 @@ +// rustfmt-format_code_in_doc_comments: true + +/// ```text +/// +/// This is a non-rust code block +/// ``` +struct S; diff --git a/tests/target/issue-6015/incomplete_code_block_leadling_blank_line.rs b/tests/target/issue-6015/incomplete_code_block_leadling_blank_line.rs new file mode 100644 index 00000000000..80ba6fa4f31 --- /dev/null +++ b/tests/target/issue-6015/incomplete_code_block_leadling_blank_line.rs @@ -0,0 +1,6 @@ +// rustfmt-format_code_in_doc_comments: true + +/// ```text +/// +/// This is a non-rust code block +struct S; diff --git a/tests/target/issue-6609/complete_code_block_trailing_blank_line.rs b/tests/target/issue-6609/complete_code_block_trailing_blank_line.rs new file mode 100644 index 00000000000..53eefa965d4 --- /dev/null +++ b/tests/target/issue-6609/complete_code_block_trailing_blank_line.rs @@ -0,0 +1,10 @@ +// rustfmt-format_code_in_doc_comments: true + +/// Some comment. +/// +/// ```text +/// This is a non-rust code block +/// +/// +/// ``` +struct S; diff --git a/tests/target/issue-6609/incomplete_code_block_trailing_blank_line.rs b/tests/target/issue-6609/incomplete_code_block_trailing_blank_line.rs new file mode 100644 index 00000000000..589856153ee --- /dev/null +++ b/tests/target/issue-6609/incomplete_code_block_trailing_blank_line.rs @@ -0,0 +1,9 @@ +// rustfmt-format_code_in_doc_comments: true + +/// Some comment. +/// +/// ```text +/// This is a non-rust code block +/// +/// +struct S;