From: Nick Cameron Date: Fri, 27 Oct 2017 09:48:13 +0000 (+0530) Subject: Merge pull request #2090 from topecongiro/issue-2087 X-Git-Url: https://git.lizzy.rs/?a=commitdiff_plain;h=90b3222adb2c6e9980225a142236fbe687d0817a;hp=fa7d8de29fba0d691b3ba543e90f272afe499e36;p=rust.git Merge pull request #2090 from topecongiro/issue-2087 Only read the trailing comma of outermost fn call --- diff --git a/Configurations.md b/Configurations.md index 16849d11880..bd67caef09f 100644 --- a/Configurations.md +++ b/Configurations.md @@ -1229,6 +1229,48 @@ struct Dolor } ``` +## `match_arm_forces_newline` + +Consistently put match arms (block based or not) in a newline. + +- **Default value**: `false` +- **Possible values**: `true`, `false` + +#### `false` (default): + +```rust +match x { + // a non-empty block + X0 => { + f(); + } + // an empty block + X1 => {} + // a non-block + X2 => println!("ok"), +} +``` + +#### `true`: + +```rust +match x { + // a non-empty block + X0 => { + f(); + } + // an empty block + X1 => + {} + // a non-block + X2 => { + println!("ok") + } +} +``` + +See also: [`wrap_match_arms`](#wrap_match_arms). + ## `match_block_trailing_comma` Put a trailing comma after a block based match arm (non-block arms are not affected) diff --git a/src/config.rs b/src/config.rs index 8aff7747dd2..8c200302c5b 100644 --- a/src/config.rs +++ b/src/config.rs @@ -597,6 +597,8 @@ pub fn get_toml_path(dir: &Path) -> Result, Error> { the same line with the pattern of arms"; match_block_trailing_comma: bool, false, "Put a trailing comma after a block based match arm (non-block arms are not affected)"; + match_arm_forces_newline: bool, false, + "Force match arm bodies to be in a new lines"; indent_match_arms: bool, true, "Indent match arms instead of keeping them at the same \ indentation level as the match keyword"; match_pattern_separator_break_point: SeparatorPlace, SeparatorPlace::Back, diff --git a/src/expr.rs b/src/expr.rs index 33dc3a40e21..9a020646927 100644 --- a/src/expr.rs +++ b/src/expr.rs @@ -899,9 +899,6 @@ fn rewrite_cond(context: &RewriteContext, expr: &ast::Expr, shape: Shape) -> Opt }; cond.rewrite(context, cond_shape) } - ast::ExprKind::Block(ref block) if block.stmts.len() == 1 => { - stmt_expr(&block.stmts[0]).and_then(|e| rewrite_cond(context, e, shape)) - } _ => to_control_flow(expr, ExprType::SubExpression).and_then(|control_flow| { let alt_block_sep = String::from("\n") + &shape.indent.block_only().to_string(context.config); @@ -1695,15 +1692,20 @@ fn rewrite_match_body( is_last: bool, ) -> Option { let (extend, body) = flatten_arm_body(context, body); - - let comma = arm_comma(context.config, body, is_last); - let alt_block_sep = String::from("\n") + &shape.indent.block_only().to_string(context.config); - let alt_block_sep = alt_block_sep.as_str(); let (is_block, is_empty_block) = if let ast::ExprKind::Block(ref block) = body.node { (true, is_empty_block(block, context.codemap)) } else { (false, false) }; + let extend = if context.config.match_arm_forces_newline() { + is_block + } else { + extend + }; + + let comma = arm_comma(context.config, body, is_last); + let alt_block_sep = String::from("\n") + &shape.indent.block_only().to_string(context.config); + let alt_block_sep = alt_block_sep.as_str(); let combine_orig_body = |body_str: &str| { let block_sep = match context.config.control_brace_style() { @@ -1716,7 +1718,11 @@ fn rewrite_match_body( let forbid_same_line = has_guard && pats_str.contains('\n') && !is_empty_block; let next_line_indent = if is_block { - shape.indent + if is_empty_block { + shape.indent.block_indent(context.config) + } else { + shape.indent + } } else { shape.indent.block_indent(context.config) }; @@ -1772,7 +1778,7 @@ fn rewrite_match_body( match rewrite { Some(ref body_str) - if !forbid_same_line + if !forbid_same_line && !context.config.match_arm_forces_newline() && (is_block || (!body_str.contains('\n') && body_str.len() <= body_shape.width)) => { @@ -2219,7 +2225,7 @@ fn rewrite_last_closure( ) -> Option { if let ast::ExprKind::Closure(capture, ref fn_decl, ref body, _) = expr.node { let body = match body.node { - ast::ExprKind::Block(ref block) if block.stmts.len() == 1 => { + ast::ExprKind::Block(ref block) if is_simple_block(block, context.codemap) => { stmt_expr(&block.stmts[0]).unwrap_or(body) } _ => body, diff --git a/tests/source/closure.rs b/tests/source/closure.rs index 39059f40807..5bf17783842 100644 --- a/tests/source/closure.rs +++ b/tests/source/closure.rs @@ -41,7 +41,16 @@ fn main() { let closure_with_return_type = |aaaaaaaaaaaaaaaaaaaaaaarg1, aaaaaaaaaaaaaaaaaaaaaaarg2| -> Strong { "sup".to_owned() }; |arg1, arg2, _, _, arg3, arg4| { let temp = arg4 + arg3; - arg2 * arg1 - temp } + arg2 * arg1 - temp }; + + let block_body_with_comment = args.iter() + .map(|a| { + // Emitting only dep-info is possible only for final crate type, as + // as others may emit required metadata for dependent crate types + if a.starts_with("--emit") && is_final_crate_type && !self.workspace_mode { + "--emit=dep-info" + } else { a } + }); } fn issue311() { diff --git a/tests/source/configs-match_arm_forces_newline-true.rs b/tests/source/configs-match_arm_forces_newline-true.rs new file mode 100644 index 00000000000..e9c8d575f1d --- /dev/null +++ b/tests/source/configs-match_arm_forces_newline-true.rs @@ -0,0 +1,20 @@ +// rustfmt-match_arm_forces_newline: true +// rustfmt-wrap_match_arms: false + +// match_arm_forces_newline puts all match arms bodies in a newline and indents +// them. + +fn main() { + match x() { + // a short non-empty block + X0 => { f(); } + // a long non-empty block + X1 => { some.really.long.expression.fooooooooooooooooooooooooooooooooooooooooo().baaaaarrrrrrrrrrrrrrrrrrrrrrrrrr(); } + // an empty block + X2 => {} + // a short non-block + X3 => println!("ok"), + // a long non-block + X4 => foo.bar.baz.test.x.y.z.a.s.d.fasdfasdf.asfads.fasd.fasdfasdf.dfasfdsaf(), + } +} diff --git a/tests/target/closure.rs b/tests/target/closure.rs index 9d59bfb64cb..2005d85bf17 100644 --- a/tests/target/closure.rs +++ b/tests/target/closure.rs @@ -60,7 +60,17 @@ fn main() { |arg1, arg2, _, _, arg3, arg4| { let temp = arg4 + arg3; arg2 * arg1 - temp - } + }; + + let block_body_with_comment = args.iter().map(|a| { + // Emitting only dep-info is possible only for final crate type, as + // as others may emit required metadata for dependent crate types + if a.starts_with("--emit") && is_final_crate_type && !self.workspace_mode { + "--emit=dep-info" + } else { + a + } + }); } fn issue311() { diff --git a/tests/target/configs-match_arm_forces_newline-true.rs b/tests/target/configs-match_arm_forces_newline-true.rs new file mode 100644 index 00000000000..5629a56d664 --- /dev/null +++ b/tests/target/configs-match_arm_forces_newline-true.rs @@ -0,0 +1,44 @@ +// rustfmt-match_arm_forces_newline: true +// rustfmt-wrap_match_arms: false + +// match_arm_forces_newline puts all match arms bodies in a newline and indents +// them. + +fn main() { + match x() { + // a short non-empty block + X0 => { + f(); + } + // a long non-empty block + X1 => { + some.really + .long + .expression + .fooooooooooooooooooooooooooooooooooooooooo() + .baaaaarrrrrrrrrrrrrrrrrrrrrrrrrr(); + } + // an empty block + X2 => + {} + // a short non-block + X3 => + println!("ok"), + // a long non-block + X4 => + foo.bar + .baz + .test + .x + .y + .z + .a + .s + .d + .fasdfasdf + .asfads + .fasd + .fasdfasdf + .dfasfdsaf(), + } +}