about summary refs log tree commit diff
path: root/src/patterns.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/patterns.rs')
-rw-r--r--src/patterns.rs41
1 files changed, 34 insertions, 7 deletions
diff --git a/src/patterns.rs b/src/patterns.rs
index a0493be0f1c..96d45c6ac55 100644
--- a/src/patterns.rs
+++ b/src/patterns.rs
@@ -1,13 +1,13 @@
 use syntax::ast::{self, BindingMode, FieldPat, Pat, PatKind, RangeEnd, RangeSyntax};
 use syntax::ptr;
-use syntax::source_map::{self, BytePos, Span};
+use syntax::source_map::{BytePos, Span};
 
 use crate::comment::{combine_strs_with_missing_comments, FindUncommented};
 use crate::config::lists::*;
 use crate::expr::{can_be_overflowed_expr, rewrite_unary_prefix, wrap_struct_field};
 use crate::lists::{
-    itemize_list, shape_for_tactic, struct_lit_formatting, struct_lit_shape, struct_lit_tactic,
-    write_list,
+    definitive_tactic, itemize_list, shape_for_tactic, struct_lit_formatting, struct_lit_shape,
+    struct_lit_tactic, write_list, ListFormatting, Separator,
 };
 use crate::macros::{rewrite_macro, MacroPosition};
 use crate::overflow;
@@ -51,12 +51,39 @@ fn is_short_pattern_inner(pat: &ast::Pat) -> bool {
         ast::PatKind::Box(ref p) | ast::PatKind::Ref(ref p, _) | ast::PatKind::Paren(ref p) => {
             is_short_pattern_inner(&*p)
         }
+        PatKind::Or(ref pats) => pats.iter().all(|p| is_short_pattern_inner(p)),
     }
 }
 
 impl Rewrite for Pat {
     fn rewrite(&self, context: &RewriteContext<'_>, shape: Shape) -> Option<String> {
         match self.node {
+            PatKind::Or(ref pats) => {
+                let pat_items = itemize_list(
+                    context.snippet_provider,
+                    pats.iter(),
+                    "",
+                    "|",
+                    |pat| pat.span().lo(),
+                    |pat| pat.span().hi(),
+                    |pat| pat.rewrite(context, shape),
+                    self.span.lo(),
+                    self.span.hi(),
+                    false,
+                );
+                let pat_vec: Vec<_> = pat_items.collect();
+                let tactic = definitive_tactic(
+                    &pat_vec,
+                    ListTactic::HorizontalVertical,
+                    Separator::VerticalBar,
+                    shape.width,
+                );
+                let fmt = ListFormatting::new(shape, context.config)
+                    .tactic(tactic)
+                    .trailing_separator(SeparatorTactic::Never)
+                    .separator(" |");
+                write_list(&pat_vec, &fmt)
+            }
             PatKind::Box(ref pat) => rewrite_unary_prefix(context, "box ", &**pat, shape),
             PatKind::Ident(binding_mode, ident, ref sub_pat) => {
                 let (prefix, mutability) = match binding_mode {
@@ -154,7 +181,7 @@ impl Rewrite for Pat {
 
 fn rewrite_struct_pat(
     path: &ast::Path,
-    fields: &[source_map::Spanned<ast::FieldPat>],
+    fields: &[ast::FieldPat],
     ellipsis: bool,
     span: Span,
     context: &RewriteContext<'_>,
@@ -180,14 +207,14 @@ fn rewrite_struct_pat(
         terminator,
         ",",
         |f| {
-            if f.node.attrs.is_empty() {
+            if f.attrs.is_empty() {
                 f.span.lo()
             } else {
-                f.node.attrs.first().unwrap().span.lo()
+                f.attrs.first().unwrap().span.lo()
             }
         },
         |f| f.span.hi(),
-        |f| f.node.rewrite(context, v_shape),
+        |f| f.rewrite(context, v_shape),
         context.snippet_provider.span_after(span, "{"),
         span.hi(),
         false,