diff --git a/src/chains.rs b/src/chains.rs
index 0181cd3d099..a2485cab69f 100644
--- a/src/chains.rs
+++ b/src/chains.rs
@@ -195,12 +195,18 @@ pub fn rewrite_chain(expr: &ast::Expr, context: &RewriteContext, shape: Shape) -
if fits_single_line {
fits_single_line = match expr.node {
ref e @ ast::ExprKind::MethodCall(..) => {
- rewrite_method_call_with_overflow(e,
- &mut last[0],
- almost_total,
- total_span,
- context,
- shape)
+ if rewrite_method_call_with_overflow(e,
+ &mut last[0],
+ almost_total,
+ total_span,
+ context,
+ shape) {
+ // If the first line of the last method does not fit into a single line
+ // after the others, allow new lines.
+ almost_total + first_line_width(&last[0]) < context.config.max_width
+ } else {
+ false
+ }
}
_ => !last[0].contains('\n'),
}
diff --git a/src/expr.rs b/src/expr.rs
index 2723c4099c1..f282f7c0b57 100644
--- a/src/expr.rs
+++ b/src/expr.rs
@@ -172,9 +172,8 @@ fn format_expr(expr: &ast::Expr,
ast::ExprKind::Mac(ref mac) => {
// Failure to rewrite a marco should not imply failure to
// rewrite the expression.
- rewrite_macro(mac, None, context, shape, MacroPosition::Expression).or_else(|| {
- wrap_str(context.snippet(expr.span), context.config.max_width, shape)
- })
+ rewrite_macro(mac, None, context, shape, MacroPosition::Expression)
+ .or_else(|| wrap_str(context.snippet(expr.span), context.config.max_width, shape))
}
ast::ExprKind::Ret(None) => wrap_str("return".to_owned(), context.config.max_width, shape),
ast::ExprKind::Ret(Some(ref expr)) => {
@@ -576,14 +575,18 @@ fn rewrite_closure(capture: ast::CaptureBy,
let block_threshold = context.config.closure_block_indent_threshold;
if block_threshold < 0 || rewrite.matches('\n').count() <= block_threshold as usize {
- return Some(format!("{} {}", prefix, rewrite));
+ if let Some(rewrite) = wrap_str(rewrite, context.config.max_width, shape) {
+ return Some(format!("{} {}", prefix, rewrite));
+ }
}
// The body of the closure is big enough to be block indented, that
// means we must re-format.
let block_shape = shape.block();
let rewrite = try_opt!(block.rewrite(&context, block_shape));
- Some(format!("{} {}", prefix, rewrite))
+ Some(format!("{} {}",
+ prefix,
+ try_opt!(wrap_str(rewrite, block_shape.width, block_shape))))
}
}
@@ -1344,11 +1347,10 @@ impl Rewrite for ast::Arm {
// 4 = ` => `.len()
if shape.width > pat_width + comma.len() + 4 {
let arm_shape = shape
- .shrink_left(pat_width + 4)
+ .offset_left(pat_width + 4)
.unwrap()
.sub_width(comma.len())
- .unwrap()
- .block();
+ .unwrap();
let rewrite = nop_block_collapse(body.rewrite(context, arm_shape), arm_shape.width);
let is_block = if let ast::ExprKind::Block(..) = body.node {
true
diff --git a/src/file_lines.rs b/src/file_lines.rs
index e68751eb887..f11a0aaf6e2 100644
--- a/src/file_lines.rs
+++ b/src/file_lines.rs
@@ -194,9 +194,8 @@ impl JsonSpan {
// To allow `collect()`ing into a `MultiMap`.
fn into_tuple(self) -> Result<(String, Range), String> {
let (lo, hi) = self.range;
- let canonical = try!(canonicalize_path_string(&self.file).map_err(|_| {
- format!("Can't canonicalize {}", &self.file)
- }));
+ let canonical = try!(canonicalize_path_string(&self.file)
+ .map_err(|_| format!("Can't canonicalize {}", &self.file)));
Ok((canonical, Range::new(lo, hi)))
}
}
diff --git a/src/items.rs b/src/items.rs
index 2cb4e46ecb5..1909b0d2679 100644
--- a/src/items.rs
+++ b/src/items.rs
@@ -1326,12 +1326,13 @@ pub fn rewrite_associated_type(ident: ast::Ident,
let type_bounds_str = if let Some(ty_param_bounds) = ty_param_bounds_opt {
let bounds: &[_] = ty_param_bounds;
- let bound_str = try_opt!(bounds.iter()
- .map(|ty_bound| {
- ty_bound.rewrite(context, Shape::legacy(context.config.max_width, indent))
- })
- .intersperse(Some(" + ".to_string()))
- .collect::