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:
Bryce Van Dyk 2015-11-30 21:51:20 +13:00
parent 36d65e4538
commit 2a430a8947
4 changed files with 36 additions and 5 deletions

View file

@ -308,4 +308,6 @@ create_config! {
hard_tabs: bool, false, "Use tab characters for indentation, spaces for alignment"; hard_tabs: bool, false, "Use tab characters for indentation, spaces for alignment";
wrap_comments: bool, false, "Break comments to fit on the line"; wrap_comments: bool, false, "Break comments to fit on the line";
wrap_match_arms: bool, true, "Wrap multiline match arms in blocks"; 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)";
} }

View file

@ -823,7 +823,7 @@ fn rewrite_match(context: &RewriteContext,
// We couldn't format the arm, just reproduce the source. // We couldn't format the arm, just reproduce the source.
let snippet = context.snippet(mk_sp(arm_start_pos(arm), arm_end_pos(arm))); let snippet = context.snippet(mk_sp(arm_start_pos(arm), arm_end_pos(arm)));
result.push_str(&snippet); result.push_str(&snippet);
result.push_str(arm_comma(&arm.body)); result.push_str(arm_comma(context, &arm.body));
} }
} }
// BytePos(1) = closing match brace. // BytePos(1) = closing match brace.
@ -854,8 +854,10 @@ fn arm_end_pos(arm: &ast::Arm) -> BytePos {
arm.body.span.hi arm.body.span.hi
} }
fn arm_comma(body: &ast::Expr) -> &'static str { fn arm_comma(context: &RewriteContext, body: &ast::Expr) -> &'static str {
if let ast::ExprBlock(ref block) = body.node { if context.config.match_block_trailing_comma {
","
} else if let ast::ExprBlock(ref block) = body.node {
if let ast::DefaultBlock = block.rules { if let ast::DefaultBlock = block.rules {
"" ""
} else { } else {
@ -950,7 +952,7 @@ impl Rewrite for ast::Arm {
ref x => x, 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. // Let's try and get the arm body on the same line as the condition.
// 4 = ` => `.len() // 4 = ` => `.len()
@ -961,7 +963,8 @@ impl Rewrite for ast::Arm {
match rewrite { match rewrite {
Some(ref body_str) if !body_str.contains('\n') || !context.config.wrap_match_arms || 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!("{}{} => {}{}", return Some(format!("{}{} => {}{}",
attr_str.trim_left(), attr_str.trim_left(),
pats_str, pats_str,

View 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",
}
}

View 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",
}
}