Merge pull request #2041 from osa1/match_arm_newline
[not ready] Implement match_arm_forces_newline option (#2039)
This commit is contained in:
commit
6cfeb1fa78
|
@ -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)
|
||||
|
|
|
@ -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,
|
||||
|
|
21
src/expr.rs
21
src/expr.rs
|
@ -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)) =>
|
||||
{
|
||||
|
|
20
tests/source/configs-match_arm_forces_newline-true.rs
Normal file
20
tests/source/configs-match_arm_forces_newline-true.rs
Normal 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(),
|
||||
}
|
||||
}
|
44
tests/target/configs-match_arm_forces_newline-true.rs
Normal file
44
tests/target/configs-match_arm_forces_newline-true.rs
Normal 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(),
|
||||
}
|
||||
}
|
Loading…
Reference in a new issue