Skip to content

Commit 7f90081

Browse files
committed
prevent unnecessary indent when formatting doc comment code snippets
Fixes 5623 When formatting code snippets in doc comments, we start by wrapping the content of the code block in an `fn main(){}` and add indentation. We do this because we're about to create an internal rustfmt `Session` that will try to parse the input snippet as a crate. In order for that operation to succeed the snippet can only contain top level items like function definitions. To illustrate the transformation, assume we're starting with the following doc comment: ```rust //! ```rust //! let x = "hello world!"; //! ``` ``` After the transformation rustfmt will actually try to format this: ```rust fn main() { let x = "hello world!"; } ``` It turns out that during the transformation described above, we sometimes add indentation to empty lines. This normally isn't an issue because rustfmt removes the redundant indentation while reformatting, but in the event a user adds an inner `#![rustfmt::skip]` attribute to their doc comment snippet the inner attribute will be applied to the `fn main(){}` and we'll leave the erroneous indentation in place. So this is what rustfmt will try to reformat: ```rust fn main() { #![rustfmt::skip] // ... the rest of the doc comment snippet } ``` To prevent this issue entirely we won't add indentation to any line that is empty or only contains whitespace.
1 parent ee2bed9 commit 7f90081

File tree

2 files changed

+15
-2
lines changed

2 files changed

+15
-2
lines changed

Diff for: src/lib.rs

+6-2
Original file line numberDiff line numberDiff line change
@@ -347,10 +347,14 @@ fn format_code_block(
347347
result.push_str(FN_MAIN_PREFIX);
348348
let mut need_indent = true;
349349
for (kind, line) in LineClasses::new(s) {
350-
if need_indent {
350+
let not_empty = !line.trim().is_empty();
351+
// Only add indentation if the current line isn't empty
352+
if need_indent && not_empty {
351353
result.push_str(&indent.to_string(config));
352354
}
353-
result.push_str(&line);
355+
if not_empty {
356+
result.push_str(&line);
357+
}
354358
result.push('\n');
355359
need_indent = indent_next_line(kind, &line, config);
356360
}

Diff for: tests/target/issue_5623.rs

+9
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
// rustfmt-format_code_in_doc_comments: true
2+
3+
/// ```
4+
/// #![rustfmt::skip]
5+
/// use core::primitive;
6+
///
7+
/// let y = 0;
8+
/// ```
9+
fn main() {}

0 commit comments

Comments
 (0)