rust-lang / rustfmt

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

Formatting of associated types with GATs very verbose #6387

Open nicoburns opened 1 week ago

nicoburns commented 1 week ago

This relates to https://github.com/rust-lang/rustfmt/pull/5887

This change is making a number of associated type implementations in my codebase that were previously a single line (and fit within the 100 character limit) now take up 4 lines. And I am concerned that the new formatting will make it harder for me to justify including associated types in my code due to the verbosity it imposes both on my own codebase and on implementors of traits I create.

As an example:

    type GridItemStyle<'a> = &'a Style where Self: 'a;

is now

    type GridItemStyle<'a>
        = &'a Style
    where
        Self: 'a;

This seems incredibly unfortunate as I find that associated types are generally implementation details that one wants to keep "out of the way" rather than emphasising in the code. In fact, I often don't want to have an associated type at all, it's just required to keep the API flexible. In particular:

Proposal

I concede that where clauses are typically formatted onto separate lines in Rust, but I think that where Self: 'a could be special cased to some degree. So I would propose:

The entirely single line form is used if the full line fits within the width limit:

    type GridItemStyle<'a> = &'a Style where Self: 'a;

Else the following form is used if the definition minus the where clause fits within the width limit:

    type GridItemStyle<'a> = &'a Style
    where
        Self: 'a;

And finally the existing form is used as a last resort if the width limit is exceeded by just the type part of the definition:

    type GridItemStyle<'a>
        = &'a Style
    where
        Self: 'a;
ytmimi commented 1 week ago

To change the default style rules you'd need to reach out to the style-team. The current behavior is an implementation of the rules outlined in the Rust Style Guilde.