rust-lang / rustfmt

Format Rust code
https://rust-lang.github.io/rustfmt/
Apache License 2.0
5.95k stars 874 forks source link

OR pattern in `match` arm makes `rustfmt` forget comment alignment #6060

Open tnull opened 7 months ago

tnull commented 7 months ago

When reformatting the following example:

let error_code = match err {
    msgs::DecodeError::UnknownVersion => 0x4000 | 1, // unknown realm byte
    msgs::DecodeError::UnknownRequiredFeature|
    msgs::DecodeError::InvalidValue|
    msgs::DecodeError::ShortRead => 0x4000 | 22, // invalid_onion_payload
    _ => 0x2000 | 2, // Should never happen
};

we receive this result:

let error_code = match err {
    msgs::DecodeError::UnknownVersion => 0x4000 | 1, // unknown realm byte
    msgs::DecodeError::UnknownRequiredFeature
    | msgs::DecodeError::InvalidValue
    | msgs::DecodeError::ShortRead => 0x4000 | 22, // invalid_onion_payload
    _ => 0x2000 | 2,                                 // Should never happen
};

Note that the comment at the end of the second match arm is unaligned with the others. For the third match arm rustfmt even introduces many whitespaces to ensure it's aligned with the in the first match arm. However, it seems that rustfmt entirely forgets about this alignment in the second match arm, presumably due to it being an OR pattern

This seems to happen independently from any particular config option or rustfmt version, but currently I'm using

> rustfmt --version
rustfmt 1.7.0-stable (82e1608d 2023-12-21)
ytmimi commented 7 months ago

Thanks for the report. Yeah, there's something about the OR pattern that's throwing off the alignment. Without the OR pattern things align as you'd expect.

Input:

fn main() {
    let error_code = match err {
        msgs::DecodeError::UnknownVersion => 0x4000 | 1, // unknown realm byte
        msgs::DecodeError::ShortRead => 0x4000 | 22, // invalid_onion_payload
    _ => 0x2000 | 2, // Should never happen
    };
}

Output:

fn main() {
    let error_code = match err {
        msgs::DecodeError::UnknownVersion => 0x4000 | 1, // unknown realm byte
        msgs::DecodeError::ShortRead => 0x4000 | 22,     // invalid_onion_payload
        _ => 0x2000 | 2,                                 // Should never happen
    };
}