rust/src/parser/grammar/patterns.rs
Aleksey Kladov 9ce7e81102 cleanups
2018-07-31 15:40:40 +03:00

53 lines
1 KiB
Rust

use super::*;
pub(super) fn pattern(p: &mut Parser) {
match p.current() {
UNDERSCORE => placeholder_pat(p),
AMPERSAND => ref_pat(p),
IDENT | REF_KW | MUT_KW => bind_pat(p),
_ => p.err_and_bump("expected pattern"),
}
}
// test placeholder_pat
// fn main() { let _ = (); }
fn placeholder_pat(p: &mut Parser) {
assert!(p.at(UNDERSCORE));
let m = p.start();
p.bump();
m.complete(p, PLACEHOLDER_PAT);
}
// test ref_pat
// fn main() {
// let &a = ();
// let &mut b = ();
// }
fn ref_pat(p: &mut Parser) {
assert!(p.at(AMPERSAND));
let m = p.start();
p.bump();
p.eat(MUT_KW);
pattern(p);
m.complete(p, REF_PAT);
}
// test bind_pat
// fn main() {
// let a = ();
// let mut b = ();
// let ref c = ();
// let ref mut d = ();
// let e @ _ = ();
// let ref mut f @ g @ _ = ();
// }
fn bind_pat(p: &mut Parser) {
let m = p.start();
p.eat(REF_KW);
p.eat(MUT_KW);
name(p);
if p.eat(AT) {
pattern(p);
}
m.complete(p, BIND_PAT);
}