Merge pull request #1657 from topecongiro/issue-1656

Put match arm's guard on new line if it exceeds max width
This commit is contained in:
Nick Cameron 2017-06-13 11:58:16 +12:00 committed by GitHub
commit 5531a93b57
3 changed files with 34 additions and 30 deletions

View File

@ -1321,20 +1321,13 @@ impl Rewrite for ast::Arm {
ref body,
} = self;
// FIXME this is all a bit grotty, would be nice to abstract out the
// treatment of attributes.
let attr_str = if !attrs.is_empty() {
// We only use this visitor for the attributes, should we use it for
// more?
let mut attr_visitor = FmtVisitor::from_codemap(context.parse_session, context.config);
attr_visitor.block_indent = shape.indent.block_only();
attr_visitor.last_pos = attrs[0].span.lo;
if attr_visitor.visit_attrs(attrs) {
// Attributes included a skip instruction.
if contains_skip(attrs) {
return None;
}
attr_visitor.format_missing(pats[0].span.lo);
attr_visitor.buffer.to_string()
format!("{}\n{}",
try_opt!(attrs.rewrite(context, shape)),
shape.indent.to_string(context.config))
} else {
String::new()
};
@ -1502,28 +1495,22 @@ fn rewrite_guard(context: &RewriteContext,
if let Some(ref guard) = *guard {
// First try to fit the guard string on the same line as the pattern.
// 4 = ` if `, 5 = ` => {`
let overhead = pattern_width + 4 + 5;
if overhead < shape.width {
let cond_shape = shape
.shrink_left(pattern_width + 4)
.unwrap()
.sub_width(5)
.unwrap();
let cond_str = guard.rewrite(context, cond_shape);
if let Some(cond_str) = cond_str {
if let Some(cond_shape) = shape
.shrink_left(pattern_width + 4)
.and_then(|s| s.sub_width(5)) {
if let Some(cond_str) = guard
.rewrite(context, cond_shape)
.and_then(|s| s.rewrite(context, cond_shape)) {
return Some(format!(" if {}", cond_str));
}
}
// Not enough space to put the guard after the pattern, try a newline.
let overhead = shape.indent.block_indent(context.config).width() + 4 + 5;
if overhead < shape.width {
let cond_str = guard.rewrite(context,
Shape::legacy(shape.width - overhead,
// 3 == `if `
shape.indent.block_indent(context.config) +
3));
if let Some(cond_str) = cond_str {
// 3 == `if `
if let Some(cond_shape) = Shape::indented(shape.indent.block_indent(context.config) + 3,
context.config)
.sub_width(3) {
if let Some(cond_str) = guard.rewrite(context, cond_shape) {
return Some(format!("\n{}if {}",
shape
.indent

View File

@ -21,3 +21,20 @@ fn main() {
}
}
}
fn issue1656() {
{
{
match rewrite {
Some(ref body_str)
if (!body_str.contains('\n') && body_str.len() <= arm_shape.width) ||
!context.config.wrap_match_arms() ||
(extend && first_line_width(body_str) <= arm_shape.width) ||
is_block => {
return None;
}
_ => {}
}
}
}
}

View File

@ -306,8 +306,8 @@ fn guards() {
barrrrrrrrrrrr => {}
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
if fooooooooooooooooooooo &&
(bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb ||
cccccccccccccccccccccccccccccccccccccccc) => {}
(bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb || cccccccccccccccccccccccccccccccccccccccc) => {
}
}
}