diff --git a/src/libsyntax/ast.rs b/src/libsyntax/ast.rs
index c7ab6158256ba..ed9597129056c 100644
--- a/src/libsyntax/ast.rs
+++ b/src/libsyntax/ast.rs
@@ -883,6 +883,9 @@ pub struct Arm {
pub pats: Vec
>,
pub guard: Option
>,
pub body: P,
+ /// Holds a span of `| ` at the beginning of an arm, if available.
+ /// This field is used in rustfmt.
+ pub beginning_vert: Option,
}
#[derive(Clone, PartialEq, Eq, RustcEncodable, RustcDecodable, Hash, Debug)]
diff --git a/src/libsyntax/ext/build.rs b/src/libsyntax/ext/build.rs
index 2e6de96d65a6d..cf63592c2ece2 100644
--- a/src/libsyntax/ext/build.rs
+++ b/src/libsyntax/ext/build.rs
@@ -883,6 +883,7 @@ impl<'a> AstBuilder for ExtCtxt<'a> {
pats,
guard: None,
body: expr,
+ beginning_vert: None,
}
}
diff --git a/src/libsyntax/fold.rs b/src/libsyntax/fold.rs
index 921ed3565a471..0f8fe57e380e5 100644
--- a/src/libsyntax/fold.rs
+++ b/src/libsyntax/fold.rs
@@ -340,13 +340,14 @@ pub fn fold_thin_attrs(attrs: ThinVec, fld: &mut T) -> Thi
fold_attrs(attrs.into(), fld).into()
}
-pub fn noop_fold_arm(Arm {attrs, pats, guard, body}: Arm,
+pub fn noop_fold_arm(Arm {attrs, pats, guard, body, beginning_vert}: Arm,
fld: &mut T) -> Arm {
Arm {
attrs: fold_attrs(attrs, fld),
pats: pats.move_map(|x| fld.fold_pat(x)),
guard: guard.map(|x| fld.fold_expr(x)),
body: fld.fold_expr(body),
+ beginning_vert,
}
}
diff --git a/src/libsyntax/parse/parser.rs b/src/libsyntax/parse/parser.rs
index ac582627f88fd..3ded2b35ea763 100644
--- a/src/libsyntax/parse/parser.rs
+++ b/src/libsyntax/parse/parser.rs
@@ -3395,7 +3395,11 @@ impl<'a> Parser<'a> {
let attrs = self.parse_outer_attributes()?;
// Allow a '|' before the pats (RFC 1925)
- self.eat(&token::BinOp(token::Or));
+ let beginning_vert = if self.eat(&token::BinOp(token::Or)) {
+ Some(self.prev_span)
+ } else {
+ None
+ };
let pats = self.parse_pats()?;
let guard = if self.eat_keyword(keywords::If) {
Some(self.parse_expr()?)
@@ -3419,6 +3423,7 @@ impl<'a> Parser<'a> {
pats,
guard,
body: expr,
+ beginning_vert,
})
}