From 8ccdf2862ef92fcc56c9dbc2448c61a80e61eb68 Mon Sep 17 00:00:00 2001 From: Michael Smith Date: Fri, 18 Aug 2017 16:50:39 -0700 Subject: [PATCH] Add overflow_closures and overflow_match_arms opts overflow_closures = true: result.and_then(|maybe_value| match maybe_value { None => ..., Some(value) => ..., }) overflow_closures = false: result.and_then(|maybe_value| { match maybe_value { None => ..., Some(value) => ..., } }) overflow_match_arms = true: match lorem { None => if ipsum { println!("Hello World"); }, Some(dolor) => ..., } overflow_match_arms = false: match lorem { None => { if ipsum { println!("Hello World"); } } Some(dolor) => ..., } --- Configurations.md | 58 +++++++++++++++++++ src/config.rs | 2 + src/expr.rs | 17 +++++- .../configs-overflow_match_arms-false.rs | 11 ++++ .../configs-overflow_match_arms-true.rs | 13 +++++ .../configs-overflow_match_arms-false.rs | 13 +++++ .../configs-overflow_match_arms-true.rs | 11 ++++ 7 files changed, 123 insertions(+), 2 deletions(-) create mode 100644 tests/source/configs-overflow_match_arms-false.rs create mode 100644 tests/source/configs-overflow_match_arms-true.rs create mode 100644 tests/target/configs-overflow_match_arms-false.rs create mode 100644 tests/target/configs-overflow_match_arms-true.rs diff --git a/Configurations.md b/Configurations.md index a8d8c353c27..113d04b44ac 100644 --- a/Configurations.md +++ b/Configurations.md @@ -1206,6 +1206,64 @@ fn dolor() -> usize {} fn adipiscing() -> usize {} ``` +## `overflow_closures` + +Allow overflow on closures + +- **Default value**: `true` +- **Possible values**: `true`, `false` + +#### `true`: + +```rust +result.and_then(|maybe_value| match maybe_value { + None => ..., + Some(value) => ..., +}) +``` + +#### `false`: + +```rust +result.and_then(|maybe_value| { + match maybe_value { + None => ..., + Some(value) => ..., + } +}) +``` + +## `overflow_match_arms` + +Allow overflow on match arms + +- **Default value**: `true` +- **Possible values**: `true`, `false` + +#### `true`: + +```rust +match lorem { + None => if ipsum { + println!("Hello World"); + }, + Some(dolor) => ..., +} +``` + +#### `false`: + +```rust +match lorem { + None => { + if ipsum { + println!("Hello World"); + } + } + Some(dolor) => ..., +} +``` + ## `reorder_imported_names` Reorder lists of names in import statements alphabetically diff --git a/src/config.rs b/src/config.rs index 11d64dc073f..87b3981b310 100644 --- a/src/config.rs +++ b/src/config.rs @@ -609,6 +609,8 @@ create_config! { threshold."; remove_blank_lines_at_start_or_end_of_block: bool, true, "Remove blank lines at start or end of a block"; + overflow_match_arms: bool, true, "Allow overflow on match arms."; + overflow_closures: bool, true, "Allow overflow on closures."; } #[cfg(test)] diff --git a/src/expr.rs b/src/expr.rs index 0276b68ac9f..e72b6e43435 100644 --- a/src/expr.rs +++ b/src/expr.rs @@ -688,6 +688,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.overflow_closures() && rw.contains('\n') { + None + } else { + Some(rw) + } + }); rewrite.map(|rw| format!("{} {}", prefix, rw)) } @@ -1697,12 +1704,18 @@ fn rewrite_match_body( 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.overflow_match_arms() && expr.can_be_overflowed(context, 1), + &**expr, + ) } else { (false, &**body) } } - _ => (body.can_be_overflowed(context, 1), &**body), + _ => ( + context.config.overflow_match_arms() && body.can_be_overflowed(context, 1), + &**body, + ), }; let comma = arm_comma(&context.config, body); diff --git a/tests/source/configs-overflow_match_arms-false.rs b/tests/source/configs-overflow_match_arms-false.rs new file mode 100644 index 00000000000..545926da5a8 --- /dev/null +++ b/tests/source/configs-overflow_match_arms-false.rs @@ -0,0 +1,11 @@ +// rustfmt-overflow_match_arms: false +// Overflowing match arms + +fn main() { + match lorem { + Lorem::Ipsum => if ipsum { + println!("dolor"); + }, + Lorem::Dolor => println!("amet"), + } +} diff --git a/tests/source/configs-overflow_match_arms-true.rs b/tests/source/configs-overflow_match_arms-true.rs new file mode 100644 index 00000000000..6b2247f509d --- /dev/null +++ b/tests/source/configs-overflow_match_arms-true.rs @@ -0,0 +1,13 @@ +// rustfmt-overflow_match_arms: true +// Overflowing match arms + +fn main() { + match lorem { + Lorem::Ipsum => { + if ipsum { + println!("dolor"); + } + } + Lorem::Dolor => println!("amet"), + } +} diff --git a/tests/target/configs-overflow_match_arms-false.rs b/tests/target/configs-overflow_match_arms-false.rs new file mode 100644 index 00000000000..f15f9525ec8 --- /dev/null +++ b/tests/target/configs-overflow_match_arms-false.rs @@ -0,0 +1,13 @@ +// rustfmt-overflow_match_arms: false +// Overflowing match arms + +fn main() { + match lorem { + Lorem::Ipsum => { + if ipsum { + println!("dolor"); + } + } + Lorem::Dolor => println!("amet"), + } +} diff --git a/tests/target/configs-overflow_match_arms-true.rs b/tests/target/configs-overflow_match_arms-true.rs new file mode 100644 index 00000000000..275de10c0ab --- /dev/null +++ b/tests/target/configs-overflow_match_arms-true.rs @@ -0,0 +1,11 @@ +// rustfmt-overflow_match_arms: true +// Overflowing match arms + +fn main() { + match lorem { + Lorem::Ipsum => if ipsum { + println!("dolor"); + }, + Lorem::Dolor => println!("amet"), + } +}