diff --git a/Configurations.md b/Configurations.md index e066553dc63..f13cd564098 100644 --- a/Configurations.md +++ b/Configurations.md @@ -2381,12 +2381,74 @@ 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 an equals (`=`) sign. e.g. `let x = if y == 1 { 0 } else { 1 };` +* Conditional expression in function calls. e.g. `f(if x== 0 { 10 } else { 0 })` +* Single expression closures. e.g. `let x = |y| if y == 0 { 0 } else { 10 };` + +In the following scenarios the if-else expression will be formatted over multiple lines. +* Empty if-else blocks. +* An outer if-else expression when if-else expression are nested. +* If-else blocks that contain statements (e.g. `let x = a;`), comments, or attributes (e.g. `let _ = if true { #[must_use] 1 } else { 2 };`). + +When `version=One` is set (the default) an if-else expression at the end of a block is treated as a statement and is not formatted on a single line. When using `version=Two` the if-else expression may be formatted on a single line if it meets the criteria described above. + - **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 { + 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 { + 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` diff --git a/tests/source/issue-5496/70.rs b/tests/source/issue-5496/70.rs new file mode 100644 index 00000000000..0c08c9ac797 --- /dev/null +++ b/tests/source/issue-5496/70.rs @@ -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 } +} diff --git a/tests/source/issue-5496/70_version_two.rs b/tests/source/issue-5496/70_version_two.rs new file mode 100644 index 00000000000..2fc3b6adca0 --- /dev/null +++ b/tests/source/issue-5496/70_version_two.rs @@ -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 + } +} diff --git a/tests/source/issue-5496/default.rs b/tests/source/issue-5496/default.rs new file mode 100644 index 00000000000..50ff93fe62a --- /dev/null +++ b/tests/source/issue-5496/default.rs @@ -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 } +} diff --git a/tests/source/issue-5496/nested_if_one.rs b/tests/source/issue-5496/nested_if_one.rs new file mode 100644 index 00000000000..b805bc5699a --- /dev/null +++ b/tests/source/issue-5496/nested_if_one.rs @@ -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 +} diff --git a/tests/source/issue-5496/nested_if_two.rs b/tests/source/issue-5496/nested_if_two.rs new file mode 100644 index 00000000000..8fe822c067b --- /dev/null +++ b/tests/source/issue-5496/nested_if_two.rs @@ -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 +} diff --git a/tests/source/issue-5496/simple_one.rs b/tests/source/issue-5496/simple_one.rs new file mode 100644 index 00000000000..ef32c310038 --- /dev/null +++ b/tests/source/issue-5496/simple_one.rs @@ -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 +} diff --git a/tests/source/issue-5496/simple_two.rs b/tests/source/issue-5496/simple_two.rs new file mode 100644 index 00000000000..4d05b72ddc4 --- /dev/null +++ b/tests/source/issue-5496/simple_two.rs @@ -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 +} diff --git a/tests/target/issue-5496/70.rs b/tests/target/issue-5496/70.rs new file mode 100644 index 00000000000..59822847dea --- /dev/null +++ b/tests/target/issue-5496/70.rs @@ -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 + } +} diff --git a/tests/target/issue-5496/70_version_two.rs b/tests/target/issue-5496/70_version_two.rs new file mode 100644 index 00000000000..7833a6cce2f --- /dev/null +++ b/tests/target/issue-5496/70_version_two.rs @@ -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 } +} diff --git a/tests/target/issue-5496/default.rs b/tests/target/issue-5496/default.rs new file mode 100644 index 00000000000..300364b0265 --- /dev/null +++ b/tests/target/issue-5496/default.rs @@ -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 + } +} diff --git a/tests/target/issue-5496/nested_if_one.rs b/tests/target/issue-5496/nested_if_one.rs new file mode 100644 index 00000000000..a471ca5da3d --- /dev/null +++ b/tests/target/issue-5496/nested_if_one.rs @@ -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 +} diff --git a/tests/target/issue-5496/nested_if_two.rs b/tests/target/issue-5496/nested_if_two.rs new file mode 100644 index 00000000000..8fe822c067b --- /dev/null +++ b/tests/target/issue-5496/nested_if_two.rs @@ -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 +} diff --git a/tests/target/issue-5496/simple_one.rs b/tests/target/issue-5496/simple_one.rs new file mode 100644 index 00000000000..ea26c7fc93f --- /dev/null +++ b/tests/target/issue-5496/simple_one.rs @@ -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 +} diff --git a/tests/target/issue-5496/simple_two.rs b/tests/target/issue-5496/simple_two.rs new file mode 100644 index 00000000000..69264e6200d --- /dev/null +++ b/tests/target/issue-5496/simple_two.rs @@ -0,0 +1,76 @@ +// 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 +}