From ca0b8606882da76ac0a854c7e6d01ec085dae2e0 Mon Sep 17 00:00:00 2001 From: Marcus Klaas Date: Fri, 2 Oct 2015 12:00:28 +0200 Subject: [PATCH] Format repeated element array literals --- src/expr.rs | 38 ++++++++++++++++++++++++++++++++++++-- tests/source/expr.rs | 5 +++++ tests/target/expr.rs | 8 ++++++++ 3 files changed, 49 insertions(+), 2 deletions(-) diff --git a/src/expr.rs b/src/expr.rs index b68cbb87580..8d375a8b586 100644 --- a/src/expr.rs +++ b/src/expr.rs @@ -183,11 +183,13 @@ fn rewrite(&self, context: &RewriteContext, width: usize, offset: Indent) -> Opt ast::Expr_::ExprIndex(ref expr, ref index) => { rewrite_index(expr, index, context, width, offset) } + ast::Expr_::ExprRepeat(ref expr, ref repeats) => { + rewrite_repeats(expr, repeats, context, width, offset) + } // We do not format these expressions yet, but they should still // satisfy our width restrictions. ast::Expr_::ExprInPlace(..) | - ast::Expr_::ExprInlineAsm(..) | - ast::Expr_::ExprRepeat(..) => { + ast::Expr_::ExprInlineAsm(..) => { wrap_str(context.snippet(self.span), context.config.max_width, width, @@ -197,6 +199,38 @@ fn rewrite(&self, context: &RewriteContext, width: usize, offset: Indent) -> Opt } } +fn rewrite_repeats(expr: &ast::Expr, + index: &ast::Expr, + context: &RewriteContext, + width: usize, + offset: Indent) + -> Option { + let max_width = try_opt!(width.checked_sub("[; ]".len())); + + binary_search(1, + max_width, + |expr_budget| { + let expr_str = match expr.rewrite(context, expr_budget, offset + "[".len()) { + Some(result) => result, + None => return Err(Ordering::Greater), + }; + + let last_line_width = last_line_width(&expr_str); + let index_budget = match max_width.checked_sub(last_line_width) { + Some(b) => b, + None => return Err(Ordering::Less), + }; + let index_indent = offset + last_line_width + "[; ".len(); + + let index_str = match index.rewrite(context, index_budget, index_indent) { + Some(result) => result, + None => return Err(Ordering::Less), + }; + + Ok(format!("[{}; {}]", expr_str, index_str)) + }) +} + fn rewrite_index(expr: &ast::Expr, index: &ast::Expr, context: &RewriteContext, diff --git a/tests/source/expr.rs b/tests/source/expr.rs index 16b9047dcf1..45f688693f6 100644 --- a/tests/source/expr.rs +++ b/tests/source/expr.rs @@ -202,3 +202,8 @@ fn indices() { let x = (aaaaaaaaaaaaaaaaaaaaaaaaaaaa+bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb+cccccccccccccccc) [ x + y + z ]; let y = (aaaaaaaaaaaaaaaaaaaaaaaaaaaa + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb + cccccccccccccccc)[ xxxxx + yyyyy + zzzzz ]; } + +fn repeats() { + let x = [aaaaaaaaaaaaaaaaaaaaaaaaaaaa+bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb+cccccccccccccccc; x + y + z ]; + let y = [aaaaaaaaaaaaaaaaaaaaaaaaaaaa + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb + cccccccccccccccc; xxxxx + yyyyy + zzzzz ]; +} diff --git a/tests/target/expr.rs b/tests/target/expr.rs index ab25d489c1b..6fe472c114e 100644 --- a/tests/target/expr.rs +++ b/tests/target/expr.rs @@ -216,3 +216,11 @@ fn indices() { let y = (aaaaaaaaaaaaaaaaaaaaaaaaaaaa + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb + cccccccccccccccc)[xxxxx + yyyyy + zzzzz]; } + +fn repeats() { + let x = [aaaaaaaaaaaaaaaaaaaaaaaaaaaa + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb + cccccccccccccccc; x + + y + + z]; + let y = [aaaaaaaaaaaaaaaaaaaaaaaaaaaa + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb + + cccccccccccccccc; xxxxx + yyyyy + zzzzz]; +} -- 2.44.0