Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Supertrait bounds sometimes exceed max_width after formatting #5321

Open
zmill opened this issue Apr 24, 2022 · 2 comments · May be fixed by #5327
Open

Supertrait bounds sometimes exceed max_width after formatting #5321

zmill opened this issue Apr 24, 2022 · 2 comments · May be fixed by #5327
Labels

Comments

@zmill
Copy link

zmill commented Apr 24, 2022

Given the following src/lib.rs:

trait AllTheOthers1:
    Trait3 + Trait4 + Trait5 + Trait6 + Trait7 + Trait8 + Trait9 + Trait10 + Trait11 + Trait12 + Trait14
{
}

trait AllTheOthers2:
    Trait4 + Trait5 + Trait6 + Trait7 + Trait8 + Trait9 + Trait10 + Trait11 + Trait12 + Trait13 + Trait15
{
}

mod Module {
    trait AllTheOthers3:
        Trait5 + Trait6 + Trait7 + Trait8 + Trait9 + Trait10 + Trait11 + Trait12 + Trait13 + Trait14
    {
    }

    trait AllTheOthers4:
        Trait6 + Trait7 + Trait8 + Trait9 + Trait10 + Trait11 + Trait12 + Trait13 + Trait14 + Trait15
    {
    }
}

rustfmt produces:

trait AllTheOthers1:
    Trait3 + Trait4 + Trait5 + Trait6 + Trait7 + Trait8 + Trait9 + Trait10 + Trait11 + Trait12 + Trait14
{
}

trait AllTheOthers2:
    Trait4
    + Trait5
    + Trait6
    + Trait7
    + Trait8
    + Trait9
    + Trait10
    + Trait11
    + Trait12
    + Trait13
    + Trait15
{
}

mod Module {
    trait AllTheOthers3:
        Trait5 + Trait6 + Trait7 + Trait8 + Trait9 + Trait10 + Trait11 + Trait12 + Trait13 + Trait14
    {
    }

    trait AllTheOthers4:
        Trait6
        + Trait7
        + Trait8
        + Trait9
        + Trait10
        + Trait11
        + Trait12
        + Trait13
        + Trait14
        + Trait15
    {
    }
}

The line lengths for the supertrait bounds before formatting were

  • AllTheOthers1: 104
  • AllTheOthers2: 105
  • AllTheOthers3: 100
  • AllTheOthers4: 101

As expected, rustfmt reformatted the AllTheOthers2 and AllTheOthers4 supertraits, but it left the AllTheOthers1 supertraits as-is at 104 characters.

This seems related to indentation: if I change tab_spaces to 3 instead of 4, the reformatting outside the module occurs when the supertraits line reaches 104 characters instead of 105. (Inside the module, things still work as expected and even a 101-character line gets reformatted).

$ rustfmt -V
rustfmt 1.4.38-stable (7737e0b5 2022-04-04)

My rustfmt config should just be the default:

$ rustfmt --print-config current .
max_width = 100
hard_tabs = false
tab_spaces = 4
newline_style = "Auto"
indent_style = "Block"
use_small_heuristics = "Default"
fn_call_width = 60
attr_fn_like_width = 70
struct_lit_width = 18
struct_variant_width = 35
array_width = 60
chain_width = 60
single_line_if_else_max_width = 50
wrap_comments = false
format_code_in_doc_comments = false
comment_width = 80
normalize_comments = false
normalize_doc_attributes = false
license_template_path = ""
format_strings = false
format_macro_matchers = false
format_macro_bodies = true
hex_literal_case = "Preserve"
empty_item_single_line = true
struct_lit_single_line = true
fn_single_line = false
where_single_line = false
imports_indent = "Block"
imports_layout = "Mixed"
imports_granularity = "Preserve"
group_imports = "Preserve"
reorder_imports = true
reorder_modules = true
reorder_impl_items = false
type_punctuation_density = "Wide"
space_before_colon = false
space_after_colon = true
spaces_around_ranges = false
binop_separator = "Front"
remove_nested_parens = true
combine_control_expr = true
overflow_delimited_expr = false
struct_field_align_threshold = 0
enum_discrim_align_threshold = 0
match_arm_blocks = true
match_arm_leading_pipes = "Never"
force_multiline_blocks = false
fn_args_layout = "Tall"
brace_style = "SameLineWhere"
control_brace_style = "AlwaysSameLine"
trailing_semicolon = true
trailing_comma = "Vertical"
match_block_trailing_comma = false
blank_lines_upper_bound = 1
blank_lines_lower_bound = 0
edition = "2015"
version = "One"
inline_attribute_width = 0
format_generated_files = true
merge_derives = true
use_try_shorthand = false
use_field_init_shorthand = false
force_explicit_abi = true
condense_wildcard_suffixes = false
color = "Auto"
required_version = "1.4.38"
unstable_features = false
disable_all_formatting = false
skip_children = false
hide_parse_errors = false
error_on_line_overflow = false
error_on_unformatted = false
report_todo = "Never"
report_fixme = "Never"
ignore = []
emit_mode = "Files"
make_backup = false
@calebcartwright
Copy link
Member

Thanks for the report!

@peterthejohnston
Copy link

I think I'm running into the same issue as this.

See this playground for a demonstration. It looks like supertrait bounds are getting formatted to fit under a certain maximum line length that is slightly longer than the actual maximum (100 chars). In the example above, it will keep the super long trait bounds on a single line until they are over >104 chars exactly, and break them up into multiple lines at that point.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

Successfully merging a pull request may close this issue.

4 participants