diff --git a/src/expr.rs b/src/expr.rs index b214a42a3db..d9524c46fa5 100644 --- a/src/expr.rs +++ b/src/expr.rs @@ -2494,13 +2494,18 @@ fn rewrite_index( ("[", "]") }; - let offset = expr_str.len() + lbr.len(); - let orig_index_rw = shape - .visual_indent(offset) - .sub_width(offset + rbr.len()) - .and_then(|index_shape| index.rewrite(context, index_shape)); + let offset = last_line_width(&expr_str) + lbr.len(); + let rhs_overhead = shape.rhs_overhead(context.config); + let index_shape = if expr_str.contains('\n') { + Shape::legacy(context.config.max_width(), shape.indent) + .offset_left(offset) + .and_then(|shape| shape.sub_width(rbr.len() + rhs_overhead)) + } else { + shape.visual_indent(offset).sub_width(offset + rbr.len()) + }; + let orig_index_rw = index_shape.and_then(|s| index.rewrite(context, s)); - // Return if everything fits in a single line. + // Return if index fits in a single line. match orig_index_rw { Some(ref index_str) if !index_str.contains('\n') => { return Some(format!("{}{}{}{}", expr_str, lbr, index_str, rbr)); @@ -2510,7 +2515,6 @@ fn rewrite_index( // Try putting index on the next line and see if it fits in a single line. let indent = shape.indent.block_indent(context.config); - let rhs_overhead = shape.rhs_overhead(context.config); let index_shape = try_opt!(Shape::indented(indent, context.config).offset_left(lbr.len())); let index_shape = try_opt!(index_shape.sub_width(rbr.len() + rhs_overhead)); let new_index_rw = index.rewrite(context, index_shape); diff --git a/tests/source/expr.rs b/tests/source/expr.rs index 96e00174af8..fb0bd905d0a 100644 --- a/tests/source/expr.rs +++ b/tests/source/expr.rs @@ -222,6 +222,8 @@ fn casts() { fn indices() { let x = (aaaaaaaaaaaaaaaaaaaaaaaaaaaa+bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb+cccccccccccccccc) [ x + y + z ]; let y = (aaaaaaaaaaaaaaaaaaaaaaaaaaaa + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb + cccccccccccccccc)[ xxxxx + yyyyy + zzzzz ]; + let z = xxxxxxxxxx.x().y().zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz()[aaaaa]; + let z = xxxxxxxxxx.x().y().zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz()[aaaaa]; } fn repeats() { diff --git a/tests/target/expr.rs b/tests/target/expr.rs index c291eca34e2..26963540fcc 100644 --- a/tests/target/expr.rs +++ b/tests/target/expr.rs @@ -283,6 +283,15 @@ fn indices() { [x + y + z]; let y = (aaaaaaaaaaaaaaaaaaaaaaaaaaaa + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb + cccccccccccccccc) [xxxxx + yyyyy + zzzzz]; + let z = xxxxxxxxxx + .x() + .y() + .zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz()[aaaaa]; + let z = xxxxxxxxxx + .x() + .y() + .zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz() + [aaaaa]; } fn repeats() {