]> git.lizzy.rs Git - rust.git/commitdiff
Format a match arm with the beginning vertical bar
authortopecongiro <seuchida@gmail.com>
Sun, 18 Feb 2018 01:31:11 +0000 (10:31 +0900)
committertopecongiro <seuchida@gmail.com>
Sun, 18 Feb 2018 01:31:11 +0000 (10:31 +0900)
rustfmt-core/src/expr.rs
rustfmt-core/src/spanned.rs
rustfmt-core/tests/source/match.rs
rustfmt-core/tests/target/match.rs

index 1d572f642e23658df4a86832ba0fc806d2874ace..d21c272631039568f99150b21da1df611ff8cf31 100644 (file)
@@ -1406,17 +1406,22 @@ fn rewrite_match_arm(
     } else {
         (mk_sp(arm.span().lo(), arm.span().lo()), String::new())
     };
-    let pats_str =
-        rewrite_match_pattern(context, &arm.pats, &arm.guard, shape).and_then(|pats_str| {
-            combine_strs_with_missing_comments(
-                context,
-                &attrs_str,
-                &pats_str,
-                missing_span,
-                shape,
-                false,
-            )
-        })?;
+    let pats_str = rewrite_match_pattern(
+        context,
+        &arm.pats,
+        &arm.guard,
+        arm.beginning_vert.is_some(),
+        shape,
+    ).and_then(|pats_str| {
+        combine_strs_with_missing_comments(
+            context,
+            &attrs_str,
+            &pats_str,
+            missing_span,
+            shape,
+            false,
+        )
+    })?;
     rewrite_match_body(
         context,
         &arm.body,
@@ -1463,11 +1468,15 @@ fn rewrite_match_pattern(
     context: &RewriteContext,
     pats: &[ptr::P<ast::Pat>],
     guard: &Option<ptr::P<ast::Expr>>,
+    has_beginning_vert: bool,
     shape: Shape,
 ) -> Option<String> {
     // Patterns
     // 5 = ` => {`
-    let pat_shape = shape.sub_width(5)?;
+    // 2 = `| `
+    let pat_shape = shape
+        .sub_width(5)?
+        .offset_left(if has_beginning_vert { 2 } else { 0 })?;
 
     let pat_strs = pats.iter()
         .map(|p| p.rewrite(context, pat_shape))
@@ -1498,11 +1507,12 @@ fn rewrite_match_pattern(
         config: context.config,
     };
     let pats_str = write_list(&items, &fmt)?;
+    let beginning_vert = if has_beginning_vert { "| " } else { "" };
 
     // Guard
     let guard_str = rewrite_guard(context, guard, shape, trimmed_last_line_width(&pats_str))?;
 
-    Some(format!("{}{}", pats_str, guard_str))
+    Some(format!("{}{}{}", beginning_vert, pats_str, guard_str))
 }
 
 // (extend, body)
index a431f3a544a6e39e23a30a9c89bf93013765e3c4..20dd843879860a2331e2bb9e8b1ef8ac8680ead0 100644 (file)
@@ -89,7 +89,12 @@ fn span(&self) -> Span {
 
 impl Spanned for ast::Arm {
     fn span(&self) -> Span {
-        span_with_attrs_lo_hi!(self, self.pats[0].span.lo(), self.body.span.hi())
+        let lo = if let Some(sp) = self.beginning_vert {
+            sp.lo()
+        } else {
+            self.pats[0].span.lo()
+        };
+        span_with_attrs_lo_hi!(self, lo, self.body.span.hi())
     }
 }
 
index 23df0d3b6813bee0b96d5e69e6c759e9d46d6e1f..f38bf7cca977ced74331d40e721ebea011b95e55 100644 (file)
@@ -451,3 +451,14 @@ fn issue_2152() {
         "bind" | "writev" | "readv" | "sendmsg" | "recvmsg" if android && (aarch64 || x86_64) => true,
     }
 }
+
+// #2462
+// Preserve a `|` at the beginning of a match arm.
+fn match_with_beginning_vert() {
+    let x = Foo::A;
+    match x {
+        | Foo::A
+        | Foo::B => println!("AB"),
+        | Foo::C => println!("C"),
+    }
+}
index 83ee4f97b73e822d751dec655dbf2c3ad99c1ae0..72ffa966c01d2dfdc65a7aba3167042aeda81aa8 100644 (file)
@@ -483,3 +483,13 @@ fn issue_2152() {
         }
     }
 }
+
+// #2462
+// Preserve a `|` at the beginning of a match arm.
+fn match_with_beginning_vert() {
+    let x = Foo::A;
+    match x {
+        | Foo::A | Foo::B => println!("AB"),
+        | Foo::C => println!("C"),
+    }
+}