Merge pull request #2041 from osa1/match_arm_newline

[not ready] Implement match_arm_forces_newline option (#2039)
This commit is contained in:
Nick Cameron 2017-10-27 15:17:03 +05:30 committed by GitHub
commit 6cfeb1fa78
5 changed files with 123 additions and 6 deletions

View file

@ -1229,6 +1229,48 @@ struct Dolor<T>
}
```
## `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)

View file

@ -597,6 +597,8 @@ create_config! {
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,

View file

@ -1695,15 +1695,20 @@ fn rewrite_match_body(
is_last: bool,
) -> Option<String> {
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 +1721,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 +1781,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)) =>
{

View file

@ -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(),
}
}

View file

@ -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(),
}
}