Skip to content

Improve docs for single_line_if_else_max_width & add tests #5509

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

Open
wants to merge 8 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
50 changes: 50 additions & 0 deletions Configurations.md
Original file line number Diff line number Diff line change
Expand Up @@ -2381,12 +2381,62 @@ Don't reformat out of line modules

Maximum line length for single line if-else expressions. A value of `0` (zero) results in if-else expressions always being broken into multiple lines. Note this occurs when `use_small_heuristics` is set to `Off`.

Common if-else expressions that may be formatted on a single line are expressions on the right hand side of the equals (`=`) sign in a let statement, expressions inside a function call, and expressions inside a closure. If one of the if-else blocks contain a statement, a comment, an attribute, or is empty, the if-else expression will be broken into multiple lines. For backwards compatability reasons, an if-else expression at the end of a block is treated as a statement when using `version = "One"` and may not be formatted on a single line. When using `version = "Two"` an if-else expression at the end of a block may be formatted on a single line if it is a simple if-else expression as described earlier. As an example, the last if-else expression in the last snippet of this section would be formatted on a single line with `version = "Two"`.

- **Default value**: `50`
- **Possible values**: any positive integer that is less than or equal to the value specified for [`max_width`](#max_width)
- **Stable**: Yes

By default this option is set as a percentage of [`max_width`](#max_width) provided by [`use_small_heuristics`](#use_small_heuristics), but a value set directly for `single_line_if_else_max_width` will take precedence.

#### `50` (default):

```rust
fn foo() -> usize {
let some_long_name = true;
let some_other_long_name = false;
fun(if some_long_name && some_other_long_name {
0
} else {
10
});
closure(|super_long_closure_variable| {
if super_long_closure_variable == 0 {
0
} else {
10
}
});
let bar = if some_long_name && some_other_long_name {
baz()
} else {
buzz()
};
if some_long_name && some_other_long_name {
1
} else {
2
}
}
```

#### `70`:

```rust
fn foo() -> usize {
let some_long_name = true;
let some_other_long_name = false;
fun(if some_long_name && some_other_long_name { 0 } else { 10 });
closure(|super_long_closure_variable| if super_long_closure_variable == 0 { 0 } else { 10 });
let bar = if some_long_name && some_other_long_name { baz() } else { buzz() };
if some_long_name && some_other_long_name {
1
} else {
2
}
}
```

See also [`max_width`](#max_width) and [`use_small_heuristics`](#use_small_heuristics)

## `space_after_colon`
Expand Down
8 changes: 8 additions & 0 deletions tests/source/issue-5496/70.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
// rustfmt-version: One
// rustfmt-single_line_if_else_max_width: 70
fn foo() -> usize {
let some_long_name = true;
let some_other_long_name = false;
let bar = if some_long_name && some_other_long_name { baz() } else { buzz() };
if some_long_name && some_other_long_name { 1 } else { 2 }
}
12 changes: 12 additions & 0 deletions tests/source/issue-5496/70_version_two.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
// rustfmt-version: Two
// rustfmt-single_line_if_else_max_width: 70
fn foo() -> usize {
let some_long_name = true;
let some_other_long_name = false;
let bar = if some_long_name && some_other_long_name { baz() } else { buzz() };
if some_long_name && some_other_long_name {
1
} else {
2
}
}
6 changes: 6 additions & 0 deletions tests/source/issue-5496/default.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
fn foo() -> usize {
let some_long_name = true;
let some_other_long_name = false;
let bar = if some_long_name && some_other_long_name { baz() } else { buzz() };
if some_long_name && some_other_long_name { 1 } else { 2 }
}
10 changes: 10 additions & 0 deletions tests/source/issue-5496/nested_if_one.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
// rustfmt-version: One
// rustfmt-single_line_if_else_max_width: 75
fn foo() -> usize {
// nested
let _ = if true { if false { 1 } else { 2 } } else { 3 };
let _ = if true { 3 } else { if false { 1 } else { 2 } };
let _ = if true { if false { 1 } else { 2 } } else { if false { 3 } else { 4 } };

1
}
22 changes: 22 additions & 0 deletions tests/source/issue-5496/nested_if_two.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
// rustfmt-version: Two
// rustfmt-single_line_if_else_max_width: 75
fn foo() -> usize {
// nested
let _ = if true {
if false { 1 } else { 2 }
} else {
3
};
let _ = if true {
3
} else {
if false { 1 } else { 2 }
};
let _ = if true {
if false { 1 } else { 2 }
} else {
if false { 3 } else { 4 }
};

1
}
24 changes: 24 additions & 0 deletions tests/source/issue-5496/simple_one.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
// rustfmt-version: One
fn foo() -> usize {
// empty
let _ = if true { 1 } else { };
let _ = if true { } else { 2 };
let _ = if true { } else { };

// attribute
let _ = if true { #[must_use] 1 } else { 2 };
let _ = if true { 1 } else { #[must_use] 2 };
let _ = if true { #[must_use] 1 } else { #[must_use] 2 };

// comment
let _ = if true { 1 /*1*/ } else { 2 };
let _ = if true { 1 } else { 2 /*2*/};
let _ = if true { 1 /*1*/} else { 2 /*2*/};

// a statement
let _ = if true { let a = 1; a } else { 2 };
let _ = if true { 1 } else { let b = 2; b };
let _ = if true { let a = 1; a } else { let b = 2; b };

1
}
24 changes: 24 additions & 0 deletions tests/source/issue-5496/simple_two.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
// rustfmt-version: Two
fn foo() -> usize {
// empty
let _ = if true { 1 } else { };
let _ = if true { } else { 2 };
let _ = if true { } else { };

// attribute
let _ = if true { #[must_use] 1 } else { 2 };
let _ = if true { 1 } else { #[must_use] 2 };
let _ = if true { #[must_use] 1 } else { #[must_use] 2 };

// comment
let _ = if true { 1 /*1*/ } else { 2 };
let _ = if true { 1 } else { 2 /*2*/};
let _ = if true { 1 /*1*/} else { 2 /*2*/};

// a statement
let _ = if true { let a = 1; a } else { 2 };
let _ = if true { 1 } else { let b = 2; b };
let _ = if true { let a = 1; a } else { let b = 2; b };

1
}
12 changes: 12 additions & 0 deletions tests/target/issue-5496/70.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
// rustfmt-version: One
// rustfmt-single_line_if_else_max_width: 70
fn foo() -> usize {
let some_long_name = true;
let some_other_long_name = false;
let bar = if some_long_name && some_other_long_name { baz() } else { buzz() };
if some_long_name && some_other_long_name {
1
} else {
2
}
}
8 changes: 8 additions & 0 deletions tests/target/issue-5496/70_version_two.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
// rustfmt-version: Two
// rustfmt-single_line_if_else_max_width: 70
fn foo() -> usize {
let some_long_name = true;
let some_other_long_name = false;
let bar = if some_long_name && some_other_long_name { baz() } else { buzz() };
if some_long_name && some_other_long_name { 1 } else { 2 }
}
14 changes: 14 additions & 0 deletions tests/target/issue-5496/default.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
fn foo() -> usize {
let some_long_name = true;
let some_other_long_name = false;
let bar = if some_long_name && some_other_long_name {
baz()
} else {
buzz()
};
if some_long_name && some_other_long_name {
1
} else {
2
}
}
38 changes: 38 additions & 0 deletions tests/target/issue-5496/nested_if_one.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
// rustfmt-version: One
// rustfmt-single_line_if_else_max_width: 75
fn foo() -> usize {
// nested
let _ = if true {
if false {
1
} else {
2
}
} else {
3
};
let _ = if true {
3
} else {
if false {
1
} else {
2
}
};
let _ = if true {
if false {
1
} else {
2
}
} else {
if false {
3
} else {
4
}
};

1
}
22 changes: 22 additions & 0 deletions tests/target/issue-5496/nested_if_two.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
// rustfmt-version: Two
// rustfmt-single_line_if_else_max_width: 75
fn foo() -> usize {
// nested
let _ = if true {
if false { 1 } else { 2 }
} else {
3
};
let _ = if true {
3
} else {
if false { 1 } else { 2 }
};
let _ = if true {
if false { 1 } else { 2 }
} else {
if false { 3 } else { 4 }
};

1
}
76 changes: 76 additions & 0 deletions tests/target/issue-5496/simple_one.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
// rustfmt-version: One
fn foo() -> usize {
// empty
let _ = if true {
1
} else {
};
let _ = if true {
} else {
2
};
let _ = if true {
} else {
};

// attribute
let _ = if true {
#[must_use]
1
} else {
2
};
let _ = if true {
1
} else {
#[must_use]
2
};
let _ = if true {
#[must_use]
1
} else {
#[must_use]
2
};

// comment
let _ = if true {
1 /*1*/
} else {
2
};
let _ = if true {
1
} else {
2 /*2*/
};
let _ = if true {
1 /*1*/
} else {
2 /*2*/
};

// a statement
let _ = if true {
let a = 1;
a
} else {
2
};
let _ = if true {
1
} else {
let b = 2;
b
};
let _ = if true {
let a = 1;
a
} else {
let b = 2;
b
};

1
}
Loading