Allow patterns to be followed by if and in.

Needed to support:

match X {
  pattern if Y ...
}

for pattern in Y {}
This commit is contained in:
Steven Allen 2015-05-22 10:37:44 -04:00
parent c3d60aba6c
commit f21655ec02
3 changed files with 32 additions and 1 deletions

View file

@ -478,7 +478,7 @@ There are additional rules regarding the next token after a metavariable:
* `expr` variables may only be followed by one of: `=> , ;`
* `ty` and `path` variables may only be followed by one of: `=> , : = > as`
* `pat` variables may only be followed by one of: `=> , =`
* `pat` variables may only be followed by one of: `=> , = if in`
* Other variables may be followed by any token.
These rules provide some flexibility for Rusts syntax to evolve without

View file

@ -495,6 +495,7 @@ fn is_in_follow(_: &ExtCtxt, tok: &Token, frag: &str) -> Result<bool, String> {
"pat" => {
match *tok {
FatArrow | Comma | Eq => Ok(true),
Ident(i, _) if i.as_str() == "if" || i.as_str() == "in" => Ok(true),
_ => Ok(false)
}
},

View file

@ -0,0 +1,30 @@
// Copyright 2015 The Rust Project Developers. See the COPYRIGHT
// file at the top-level directory of this distribution and at
// http://rust-lang.org/COPYRIGHT.
//
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
// option. This file may not be copied, modified, or distributed
// except according to those terms.
macro_rules! pat_in {
($p:pat in $e:expr) => {{
let mut iter = $e.into_iter();
while let $p = iter.next() {}
}}
}
macro_rules! pat_if {
($p:pat if $e:expr) => {{
match Some(1u8) {
$p if $e => {},
_ => {}
}
}}
}
fn main() {
pat_in!(Some(_) in 0..10);
pat_if!(Some(x) if x > 0);
}