rustfmt icon indicating copy to clipboard operation
rustfmt copied to clipboard

prevent unnecessary indent when formatting doc comment code snippets

Open ytmimi opened this issue 2 years ago • 2 comments
trafficstars

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
//! let x =       "hello world!";
//! ```

After the transformation rustfmt will actually try to format this:

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:

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.

r? @calebcartwright

ytmimi avatar Dec 22 '22 16:12 ytmimi

This is intriguing, and I suspect, may potentially address a bevy of other issues (at least partially). I'd like to see the idempotence check with this branch as well because it is the type of change that has a potentially large blast radius. I'd also be curious to see if/how this impacts other reported bugs/issues.

calebcartwright avatar Apr 22 '23 21:04 calebcartwright

Just getting back around to this now as I'm going through the backlog. I kicked off the Diff-Check.

Edit: The job ran without any errors ✅

ytmimi avatar Jan 29 '24 00:01 ytmimi