about summary refs log tree commit diff
diff options
context:
space:
mode:
authorSeiichi Uchida <seuchida@gmail.com>2019-08-06 11:09:45 +0900
committerGitHub <noreply@github.com>2019-08-06 11:09:45 +0900
commitc0cb5eb5358c38c07c0b57217e691bc3ebbb5e85 (patch)
tree114e83a8516b41c5aef4344ca131149e41e427c3
parent127de250417eac37c71f0383472d920e553ff814 (diff)
Fix broken tuple pattern (#3729)
-rw-r--r--src/patterns.rs21
-rw-r--r--tests/source/pattern.rs7
-rw-r--r--tests/target/issue-1021.rs2
-rw-r--r--tests/target/pattern.rs5
4 files changed, 33 insertions, 2 deletions
diff --git a/src/patterns.rs b/src/patterns.rs
index 57051a286a7..b5032eca6d5 100644
--- a/src/patterns.rs
+++ b/src/patterns.rs
@@ -272,6 +272,18 @@ impl<'a> Spanned for TuplePatField<'a> {
     }
 }
 
+impl<'a> TuplePatField<'a> {
+    fn is_dotdot(&self) -> bool {
+        match self {
+            TuplePatField::Pat(pat) => match pat.node {
+                ast::PatKind::Rest => true,
+                _ => false,
+            },
+            TuplePatField::Dotdot(_) => true,
+        }
+    }
+}
+
 pub(crate) fn can_be_overflowed_pat(
     context: &RewriteContext<'_>,
     pat: &TuplePatField<'_>,
@@ -321,7 +333,10 @@ fn rewrite_tuple_pat(
         (&pat_vec[..], span)
     };
 
+    let is_last_pat_dotdot = pat_vec.last().map_or(false, |p| p.is_dotdot());
+    let add_comma = path_str.is_none() && pat_vec.len() == 1 && !is_last_pat_dotdot;
     let path_str = path_str.unwrap_or_default();
+
     overflow::rewrite_with_parens(
         &context,
         &path_str,
@@ -329,7 +344,11 @@ fn rewrite_tuple_pat(
         shape,
         span,
         context.config.max_width(),
-        None,
+        if add_comma {
+            Some(SeparatorTactic::Always)
+        } else {
+            None
+        },
     )
 }
 
diff --git a/tests/source/pattern.rs b/tests/source/pattern.rs
index fc3b1455e0d..f06d03cadf2 100644
--- a/tests/source/pattern.rs
+++ b/tests/source/pattern.rs
@@ -81,3 +81,10 @@ fn slice_patterns() {
         _ => {}
     }
 }
+
+fn issue3728() {
+    let foo = |
+    (c,)
+        | c;
+    foo((1,));
+}
diff --git a/tests/target/issue-1021.rs b/tests/target/issue-1021.rs
index 94911d1f8ee..ba1029d4e61 100644
--- a/tests/target/issue-1021.rs
+++ b/tests/target/issue-1021.rs
@@ -15,7 +15,7 @@ fn main() {
         (true, ..) => (),
         (.., true) => (),
         (..) => (),
-        (_) => (),
+        (_,) => (),
         (/* .. */ ..) => (),
         (/* .. */ .., true) => (),
     }
diff --git a/tests/target/pattern.rs b/tests/target/pattern.rs
index d8a96d64920..576018ac623 100644
--- a/tests/target/pattern.rs
+++ b/tests/target/pattern.rs
@@ -91,3 +91,8 @@ fn slice_patterns() {
         _ => {}
     }
 }
+
+fn issue3728() {
+    let foo = |(c,)| c;
+    foo((1,));
+}