]> git.lizzy.rs Git - rust.git/commitdiff
Implement reformat of tuple litterals
authorGaëtan Cassiers <gaetan.cassiers@gmail.com>
Mon, 25 May 2015 20:14:05 +0000 (22:14 +0200)
committerGaëtan Cassiers <gaetan.cassiers@gmail.com>
Thu, 28 May 2015 19:30:28 +0000 (21:30 +0200)
src/expr.rs
tests/idem/tuple.rs [new file with mode: 0644]

index 4b32301fe9142cae5fe179bbff8adaf068ed7c17..e731abde4e7a633a71b8cae665dcf807197e93e2 100644 (file)
@@ -194,6 +194,40 @@ fn rewrite_field(&mut self, field: &ast::Field, width: usize, offset: usize) ->
         format!("{}: {}", name, expr)
     }
 
+    fn rewrite_tuple_lit(&mut self, items: &[ptr::P<ast::Expr>], width: usize, offset: usize)
+        -> String {
+        // opening paren
+        let indent = offset + 1;
+        // Only last line has width-1 as budget, other may take max_width
+        let item_strs: Vec<_> =
+            items.iter()
+                 .enumerate()
+                 .map(|(i, item)| self.rewrite_expr(
+                    item,
+                    // for last line, -2 is for indent + ")", for other lines, -1 is for comma
+                    if i == items.len() - 1 { width - 2 } else { config!(max_width) - indent - 1 },
+                    indent))
+                 .collect();
+        let tactics = if item_strs.iter().any(|s| s.contains('\n')) {
+            ListTactic::Vertical
+        } else {
+            ListTactic::HorizontalVertical
+        };
+        // FIXME handle comments
+        let item_strs: Vec<_> = item_strs.into_iter().map(|s| (s, String::new())).collect();
+        let fmt = ListFormatting {
+            tactic: tactics,
+            separator: ",",
+            trailing_separator: SeparatorTactic::Never,
+            indent: indent,
+            h_width: width - 2,
+            v_width: width - 2,
+        };
+        let item_str = write_list(&item_strs, &fmt);
+        format!("({})", item_str)
+    }
+
+
     pub fn rewrite_expr(&mut self, expr: &ast::Expr, width: usize, offset: usize) -> String {
         match expr.node {
             ast::Expr_::ExprLit(ref l) => {
@@ -219,6 +253,9 @@ pub fn rewrite_expr(&mut self, expr: &ast::Expr, width: usize, offset: usize) ->
                                                width,
                                                offset);
             }
+            ast::Expr_::ExprTup(ref items) => {
+                return self.rewrite_tuple_lit(items, width, offset);
+            }
             _ => {}
         }
 
diff --git a/tests/idem/tuple.rs b/tests/idem/tuple.rs
new file mode 100644 (file)
index 0000000..a0ca2c1
--- /dev/null
@@ -0,0 +1,9 @@
+// Test tuple litterals
+
+fn foo() {
+    let a = (a, a, a, a, a);
+    let aaaaaaaaaaaaaaaa = (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaa, aaaaaaaaaa);
+    let aaaaaaaaaaaaaaaaaaaaaa = (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,
+                                  aaaaaaaaaaaaaaaaaaaaaaaaa,
+                                  aaaa);
+}