From 411c73c12fa014c568c2ff0b0141042e500910d7 Mon Sep 17 00:00:00 2001 From: Michael Smith Date: Fri, 18 Aug 2017 16:50:39 -0700 Subject: [PATCH] Add multiline_{closure,match_arm}_forces_block multiline_closure_forces_block = false (default): result.and_then(|maybe_value| match maybe_value { None => ..., Some(value) => ..., }) multiline_closure_forces_block = true: result.and_then(|maybe_value| { match maybe_value { None => ..., Some(value) => ..., } }) multiline_match_arm_forces_block = false (default): match lorem { None => if ipsum { println!("Hello World"); }, Some(dolor) => ..., } multiline_match_arm_forces_block = true: match lorem { None => { if ipsum { println!("Hello World"); } } Some(dolor) => ..., } --- Configurations.md | 58 +++++++++++++++++++ src/config.rs | 4 ++ src/expr.rs | 19 +++++- ...gs-multiline_closure_forces_block-false.rs | 11 ++++ ...igs-multiline_closure_forces_block-true.rs | 9 +++ ...-multiline_match_arm_forces_block-false.rs | 13 +++++ ...s-multiline_match_arm_forces_block-true.rs | 11 ++++ ...gs-multiline_closure_forces_block-false.rs | 9 +++ ...igs-multiline_closure_forces_block-true.rs | 11 ++++ ...-multiline_match_arm_forces_block-false.rs | 11 ++++ ...s-multiline_match_arm_forces_block-true.rs | 13 +++++ 11 files changed, 167 insertions(+), 2 deletions(-) create mode 100644 tests/source/configs-multiline_closure_forces_block-false.rs create mode 100644 tests/source/configs-multiline_closure_forces_block-true.rs create mode 100644 tests/source/configs-multiline_match_arm_forces_block-false.rs create mode 100644 tests/source/configs-multiline_match_arm_forces_block-true.rs create mode 100644 tests/target/configs-multiline_closure_forces_block-false.rs create mode 100644 tests/target/configs-multiline_closure_forces_block-true.rs create mode 100644 tests/target/configs-multiline_match_arm_forces_block-false.rs create mode 100644 tests/target/configs-multiline_match_arm_forces_block-true.rs diff --git a/Configurations.md b/Configurations.md index 27c1c47280c..13a704240c3 100644 --- a/Configurations.md +++ b/Configurations.md @@ -1265,6 +1265,64 @@ Maximum width of each line See also [`error_on_line_overflow`](#error_on_line_overflow). +## `multiline_closure_forces_block` + +Force multiline closure bodies to be wrapped in a block + +- **Default value**: `false` +- **Possible values**: `false`, `true` + +#### `false`: + +```rust +result.and_then(|maybe_value| match maybe_value { + None => ..., + Some(value) => ..., +}) +``` + +#### `true`: + +```rust +result.and_then(|maybe_value| { + match maybe_value { + None => ..., + Some(value) => ..., + } +}) +``` + +## `multiline_match_arm_forces_block` + +Force multiline match arm bodies to be wrapped in a block + +- **Default value**: `false` +- **Possible values**: `false`, `true` + +#### `false`: + +```rust +match lorem { + None => if ipsum { + println!("Hello World"); + }, + Some(dolor) => ..., +} +``` + +#### `true`: + +```rust +match lorem { + None => { + if ipsum { + println!("Hello World"); + } + } + Some(dolor) => ..., +} +``` + ## `newline_style` Unix or Windows line endings diff --git a/src/config.rs b/src/config.rs index 02fd111fd9a..9659f19377d 100644 --- a/src/config.rs +++ b/src/config.rs @@ -615,6 +615,10 @@ pub fn get_toml_path(dir: &Path) -> Result, Error> { "Try to put attributes on the same line as fields."; attributes_on_same_line_as_variant: bool, true, "Try to put attributes on the same line as variants in enum declarations."; + multiline_closure_forces_block: bool, false, + "Force multiline closure bodies to be wrapped in a block"; + multiline_match_arm_forces_block: bool, false, + "Force multiline match arm bodies to be wrapped in a block"; } #[cfg(test)] diff --git a/src/expr.rs b/src/expr.rs index 5e8c66663c4..a42ab973e0d 100644 --- a/src/expr.rs +++ b/src/expr.rs @@ -690,6 +690,13 @@ fn rewrite_closure_expr( if classify::expr_requires_semi_to_be_stmt(left_most_sub_expr(expr)) { rewrite = and_one_line(rewrite); } + rewrite = rewrite.and_then(|rw| { + if context.config.multiline_closure_forces_block() && rw.contains('\n') { + None + } else { + Some(rw) + } + }); rewrite.map(|rw| format!("{} {}", prefix, rw)) } @@ -1690,12 +1697,20 @@ fn flatten_arm_body<'a>(context: &'a RewriteContext, body: &'a ast::Expr) -> (bo if !is_unsafe_block(block) && is_simple_block(block, context.codemap) => { if let ast::StmtKind::Expr(ref expr) = block.stmts[0].node { - (expr.can_be_overflowed(context, 1), &**expr) + ( + !context.config.multiline_match_arm_forces_block() && + expr.can_be_overflowed(context, 1), + &**expr, + ) } else { (false, &*body) } } - _ => (body.can_be_overflowed(context, 1), &*body), + _ => ( + !context.config.multiline_match_arm_forces_block() && + body.can_be_overflowed(context, 1), + &*body, + ), } } diff --git a/tests/source/configs-multiline_closure_forces_block-false.rs b/tests/source/configs-multiline_closure_forces_block-false.rs new file mode 100644 index 00000000000..e885dff5ee6 --- /dev/null +++ b/tests/source/configs-multiline_closure_forces_block-false.rs @@ -0,0 +1,11 @@ +// rustfmt-multiline_closure_forces_block: false +// Option forces multiline closure bodies to be wrapped in a block + +fn main() { + result.and_then(|maybe_value| { + match maybe_value { + None => Err("oops"), + Some(value) => Ok(1), + } + }); +} diff --git a/tests/source/configs-multiline_closure_forces_block-true.rs b/tests/source/configs-multiline_closure_forces_block-true.rs new file mode 100644 index 00000000000..f267466ac66 --- /dev/null +++ b/tests/source/configs-multiline_closure_forces_block-true.rs @@ -0,0 +1,9 @@ +// rustfmt-multiline_closure_forces_block: true +// Option forces multiline closure bodies to be wrapped in a block + +fn main() { + result.and_then(|maybe_value| match maybe_value { + None => Err("oops"), + Some(value) => Ok(1), + }); +} diff --git a/tests/source/configs-multiline_match_arm_forces_block-false.rs b/tests/source/configs-multiline_match_arm_forces_block-false.rs new file mode 100644 index 00000000000..4cbec0c7c1c --- /dev/null +++ b/tests/source/configs-multiline_match_arm_forces_block-false.rs @@ -0,0 +1,13 @@ +// rustfmt-multiline_match_arm_forces_block: false +// Option forces multiline match arm bodies to be wrapped in a block + +fn main() { + match lorem { + Lorem::Ipsum => { + if ipsum { + println!("dolor"); + } + } + Lorem::Dolor => println!("amet"), + } +} diff --git a/tests/source/configs-multiline_match_arm_forces_block-true.rs b/tests/source/configs-multiline_match_arm_forces_block-true.rs new file mode 100644 index 00000000000..602076a4e74 --- /dev/null +++ b/tests/source/configs-multiline_match_arm_forces_block-true.rs @@ -0,0 +1,11 @@ +// rustfmt-multiline_match_arm_forces_block: true +// Option forces multiline match arm bodies to be wrapped in a block + +fn main() { + match lorem { + Lorem::Ipsum => if ipsum { + println!("dolor"); + }, + Lorem::Dolor => println!("amet"), + } +} diff --git a/tests/target/configs-multiline_closure_forces_block-false.rs b/tests/target/configs-multiline_closure_forces_block-false.rs new file mode 100644 index 00000000000..7fb3d597da1 --- /dev/null +++ b/tests/target/configs-multiline_closure_forces_block-false.rs @@ -0,0 +1,9 @@ +// rustfmt-multiline_closure_forces_block: false +// Option forces multiline closure bodies to be wrapped in a block + +fn main() { + result.and_then(|maybe_value| match maybe_value { + None => Err("oops"), + Some(value) => Ok(1), + }); +} diff --git a/tests/target/configs-multiline_closure_forces_block-true.rs b/tests/target/configs-multiline_closure_forces_block-true.rs new file mode 100644 index 00000000000..01e2de43527 --- /dev/null +++ b/tests/target/configs-multiline_closure_forces_block-true.rs @@ -0,0 +1,11 @@ +// rustfmt-multiline_closure_forces_block: true +// Option forces multiline closure bodies to be wrapped in a block + +fn main() { + result.and_then(|maybe_value| { + match maybe_value { + None => Err("oops"), + Some(value) => Ok(1), + } + }); +} diff --git a/tests/target/configs-multiline_match_arm_forces_block-false.rs b/tests/target/configs-multiline_match_arm_forces_block-false.rs new file mode 100644 index 00000000000..3c4c1470b0f --- /dev/null +++ b/tests/target/configs-multiline_match_arm_forces_block-false.rs @@ -0,0 +1,11 @@ +// rustfmt-multiline_match_arm_forces_block: false +// Option forces multiline match arm bodies to be wrapped in a block + +fn main() { + match lorem { + Lorem::Ipsum => if ipsum { + println!("dolor"); + }, + Lorem::Dolor => println!("amet"), + } +} diff --git a/tests/target/configs-multiline_match_arm_forces_block-true.rs b/tests/target/configs-multiline_match_arm_forces_block-true.rs new file mode 100644 index 00000000000..c36d59c315c --- /dev/null +++ b/tests/target/configs-multiline_match_arm_forces_block-true.rs @@ -0,0 +1,13 @@ +// rustfmt-multiline_match_arm_forces_block: true +// Option forces multiline match arm bodies to be wrapped in a block + +fn main() { + match lorem { + Lorem::Ipsum => { + if ipsum { + println!("dolor"); + } + } + Lorem::Dolor => println!("amet"), + } +} -- 2.44.0