Trailing commas for match block arms
Attempt to implement an option for trailing commas for block based match arms (issue 173). Put in place test files to verify this behaviour.
This commit is contained in:
parent
36d65e4538
commit
2a430a8947
@ -308,4 +308,6 @@ create_config! {
|
||||
hard_tabs: bool, false, "Use tab characters for indentation, spaces for alignment";
|
||||
wrap_comments: bool, false, "Break comments to fit on the line";
|
||||
wrap_match_arms: bool, true, "Wrap multiline match arms in blocks";
|
||||
match_block_trailing_comma: bool, false,
|
||||
"Put a trailing comma after a block based match arm (non-block arms are not affected)";
|
||||
}
|
||||
|
13
src/expr.rs
13
src/expr.rs
@ -823,7 +823,7 @@ fn rewrite_match(context: &RewriteContext,
|
||||
// We couldn't format the arm, just reproduce the source.
|
||||
let snippet = context.snippet(mk_sp(arm_start_pos(arm), arm_end_pos(arm)));
|
||||
result.push_str(&snippet);
|
||||
result.push_str(arm_comma(&arm.body));
|
||||
result.push_str(arm_comma(context, &arm.body));
|
||||
}
|
||||
}
|
||||
// BytePos(1) = closing match brace.
|
||||
@ -854,8 +854,10 @@ fn arm_end_pos(arm: &ast::Arm) -> BytePos {
|
||||
arm.body.span.hi
|
||||
}
|
||||
|
||||
fn arm_comma(body: &ast::Expr) -> &'static str {
|
||||
if let ast::ExprBlock(ref block) = body.node {
|
||||
fn arm_comma(context: &RewriteContext, body: &ast::Expr) -> &'static str {
|
||||
if context.config.match_block_trailing_comma {
|
||||
","
|
||||
} else if let ast::ExprBlock(ref block) = body.node {
|
||||
if let ast::DefaultBlock = block.rules {
|
||||
""
|
||||
} else {
|
||||
@ -950,7 +952,7 @@ impl Rewrite for ast::Arm {
|
||||
ref x => x,
|
||||
};
|
||||
|
||||
let comma = arm_comma(body);
|
||||
let comma = arm_comma(context, body);
|
||||
|
||||
// Let's try and get the arm body on the same line as the condition.
|
||||
// 4 = ` => `.len()
|
||||
@ -961,7 +963,8 @@ impl Rewrite for ast::Arm {
|
||||
|
||||
match rewrite {
|
||||
Some(ref body_str) if !body_str.contains('\n') || !context.config.wrap_match_arms ||
|
||||
comma.is_empty() => {
|
||||
comma.is_empty() ||
|
||||
context.config.match_block_trailing_comma => {
|
||||
return Some(format!("{}{} => {}{}",
|
||||
attr_str.trim_left(),
|
||||
pats_str,
|
||||
|
13
tests/source/match-block-trailing-comma.rs
Normal file
13
tests/source/match-block-trailing-comma.rs
Normal file
@ -0,0 +1,13 @@
|
||||
// rustfmt-match_block_trailing_comma: true
|
||||
// Match expressions, no unwrapping of block arms or wrapping of multiline
|
||||
// expressions.
|
||||
|
||||
fn foo() {
|
||||
match x {
|
||||
a => {
|
||||
"line1";
|
||||
"line2"
|
||||
}
|
||||
b => "bar",
|
||||
}
|
||||
}
|
13
tests/target/match-block-trailing-comma.rs
Normal file
13
tests/target/match-block-trailing-comma.rs
Normal file
@ -0,0 +1,13 @@
|
||||
// rustfmt-match_block_trailing_comma: true
|
||||
// Match expressions, no unwrapping of block arms or wrapping of multiline
|
||||
// expressions.
|
||||
|
||||
fn foo() {
|
||||
match x {
|
||||
a => {
|
||||
"line1";
|
||||
"line2"
|
||||
},
|
||||
b => "bar",
|
||||
}
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user