]> git.lizzy.rs Git - rust.git/commitdiff
Format repeated element array literals
authorMarcus Klaas <mail@marcusklaas.nl>
Fri, 2 Oct 2015 10:00:28 +0000 (12:00 +0200)
committerMarcus Klaas <mail@marcusklaas.nl>
Fri, 2 Oct 2015 10:00:28 +0000 (12:00 +0200)
src/expr.rs
tests/source/expr.rs
tests/target/expr.rs

index b68cbb8758092b756cdb73e0c23c9e57556fe5b4..8d375a8b586680c3f02aa8deaa2fc364b261ec38 100644 (file)
@@ -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<String> {
+    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,
index 16b9047dcf1e717f391d7ea94e4be00a7e304bfb..45f688693f6d03dae6d63383f4847e3200f038a4 100644 (file)
@@ -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 ];
+}
index ab25d489c1b3bf24df5ec4e59666abb7abacbbc7..6fe472c114e36e2d4f55ac4971a9a99838a1aa3f 100644 (file)
@@ -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];
+}