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, }) }