mun_syntax 0.4.0

Parsing functionality for the Mun programming language
Documentation
use super::*;

pub(super) const PATTERN_FIRST: TokenSet = expressions::LITERAL_FIRST
    .union(paths::PATH_FIRST)
    .union(TokenSet::new(&[T![-], T![_]]));

pub(super) fn pattern(p: &mut Parser) {
    pattern_r(p, PATTERN_FIRST);
}

pub(super) fn pattern_r(p: &mut Parser, recovery_set: TokenSet) {
    atom_pat(p, recovery_set);
}

fn atom_pat(p: &mut Parser, recovery_set: TokenSet) -> Option<CompletedMarker> {
    let t1 = p.nth(0);
    if t1 == IDENT {
        return Some(bind_pat(p));
    }

    let m = match t1 {
        T![_] => placeholder_pat(p),
        _ => {
            p.error_recover("expected pattern", recovery_set);
            return None;
        }
    };
    Some(m)
}

fn placeholder_pat(p: &mut Parser) -> CompletedMarker {
    assert!(p.at(T![_]));
    let m = p.start();
    p.bump(T![_]);
    m.complete(p, PLACEHOLDER_PAT)
}

fn bind_pat(p: &mut Parser) -> CompletedMarker {
    let m = p.start();
    name(p);
    m.complete(p, BIND_PAT)
}