From f86615299190b77fd5890ee3951ed85e36d829df Mon Sep 17 00:00:00 2001 From: Matt Ickstadt Date: Sat, 26 Aug 2017 17:09:31 -0500 Subject: Implement RFC 1925 --- src/libsyntax/ast.rs | 1 + src/libsyntax/ext/build.rs | 3 ++- src/libsyntax/feature_gate.rs | 11 +++++++++++ src/libsyntax/fold.rs | 4 +++- src/libsyntax/parse/parser.rs | 7 +++++++ 5 files changed, 24 insertions(+), 2 deletions(-) (limited to 'src/libsyntax') diff --git a/src/libsyntax/ast.rs b/src/libsyntax/ast.rs index 925178f8639..720f6cd32bd 100644 --- a/src/libsyntax/ast.rs +++ b/src/libsyntax/ast.rs @@ -810,6 +810,7 @@ pub struct Arm { pub pats: Vec>, pub guard: Option>, pub body: P, + pub beginning_vert: Option, // For RFC 1925 feature gate } #[derive(Clone, PartialEq, Eq, RustcEncodable, RustcDecodable, Hash, Debug)] diff --git a/src/libsyntax/ext/build.rs b/src/libsyntax/ext/build.rs index 66df734b328..48d789372a0 100644 --- a/src/libsyntax/ext/build.rs +++ b/src/libsyntax/ext/build.rs @@ -878,7 +878,8 @@ impl<'a> AstBuilder for ExtCtxt<'a> { attrs: vec![], pats, guard: None, - body: expr + body: expr, + beginning_vert: None, } } diff --git a/src/libsyntax/feature_gate.rs b/src/libsyntax/feature_gate.rs index 8251b03632a..adef4942b67 100644 --- a/src/libsyntax/feature_gate.rs +++ b/src/libsyntax/feature_gate.rs @@ -379,6 +379,9 @@ declare_features! ( // allow `#[must_use]` on functions (RFC 1940) (active, fn_must_use, "1.21.0", Some(43302)), + + // allow '|' at beginning of match arms (RFC 1925) + (active, match_beginning_vert, "1.21.0", Some(44101)), ); declare_features! ( @@ -1435,6 +1438,14 @@ impl<'a> Visitor<'a> for PostExpansionVisitor<'a> { visit::walk_expr(self, e); } + fn visit_arm(&mut self, arm: &'a ast::Arm) { + if let Some(span) = arm.beginning_vert { + gate_feature_post!(&self, match_beginning_vert, + span, + "Use of a '|' at the beginning of a match arm is experimental") + } + } + fn visit_pat(&mut self, pattern: &'a ast::Pat) { match pattern.node { PatKind::Slice(_, Some(_), ref last) if !last.is_empty() => { diff --git a/src/libsyntax/fold.rs b/src/libsyntax/fold.rs index d9f453a93ad..03c47b71d02 100644 --- a/src/libsyntax/fold.rs +++ b/src/libsyntax/fold.rs @@ -344,12 +344,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, fld: &mut T) -> 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 d08373334f1..1f033b25fe4 100644 --- a/src/libsyntax/parse/parser.rs +++ b/src/libsyntax/parse/parser.rs @@ -3155,6 +3155,12 @@ impl<'a> Parser<'a> { maybe_whole!(self, NtArm, |x| x); let attrs = self.parse_outer_attributes()?; + // Allow a '|' before the pats (RFC 1925) + 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()?) @@ -3178,6 +3184,7 @@ impl<'a> Parser<'a> { pats, guard, body: expr, + beginning_vert, }) } -- cgit 1.4.1-3-g733a5 From eb143c344e088dabe00ece4e54caf6afd6eed94e Mon Sep 17 00:00:00 2001 From: Matt Ickstadt Date: Fri, 1 Sep 2017 14:39:46 -0500 Subject: Fix arm visitor --- src/libsyntax/feature_gate.rs | 1 + 1 file changed, 1 insertion(+) (limited to 'src/libsyntax') diff --git a/src/libsyntax/feature_gate.rs b/src/libsyntax/feature_gate.rs index adef4942b67..54d41a030fd 100644 --- a/src/libsyntax/feature_gate.rs +++ b/src/libsyntax/feature_gate.rs @@ -1444,6 +1444,7 @@ impl<'a> Visitor<'a> for PostExpansionVisitor<'a> { span, "Use of a '|' at the beginning of a match arm is experimental") } + visit::walk_arm(self, arm) } fn visit_pat(&mut self, pattern: &'a ast::Pat) { -- cgit 1.4.1-3-g733a5