ast: pub, mod, and Ty::Fn parsing
This commit is contained in:
@@ -132,6 +132,33 @@ impl<A: Annotation> Match<A> for crate::ast::Match<A> {
|
||||
}
|
||||
}
|
||||
|
||||
impl<A: Annotation> Match<A> for crate::ast::Make<A> {
|
||||
fn recurse(sub: &mut Subst<A>, pat: &Self, expr: &Self) -> bool {
|
||||
let (Make(pat, pat_arms), Make(expr, expr_arms)) = (pat, expr);
|
||||
Match::recurse(sub, pat, expr) && Match::recurse(sub, pat_arms, expr_arms)
|
||||
}
|
||||
|
||||
fn apply(&mut self, sub: &Subst<A>) {
|
||||
let Make(expr, make_arms) = self;
|
||||
expr.apply(sub);
|
||||
make_arms.apply(sub);
|
||||
}
|
||||
}
|
||||
|
||||
impl<A: Annotation> Match<A> for Mod<A> {
|
||||
fn recurse(sub: &mut Subst<A>, pat: &Self, expr: &Self) -> bool {
|
||||
let (Self(_pat_ty, pat_expr), Self(_expr_ty, expr_expr)) = (pat, expr);
|
||||
// TODO: unify types for ast matching
|
||||
// Match::recurse(sub, pat_ty, expr_ty) &&
|
||||
Match::recurse(sub, pat_expr, expr_expr)
|
||||
}
|
||||
|
||||
fn apply(&mut self, sub: &Subst<A>) {
|
||||
let Mod(_ty, expr) = self;
|
||||
expr.apply(sub);
|
||||
}
|
||||
}
|
||||
|
||||
impl<A: Annotation> Match<A> for Expr<A> {
|
||||
fn recurse(sub: &mut Subst<A>, pat: &Self, expr: &Self) -> bool {
|
||||
match (pat, expr) {
|
||||
@@ -145,12 +172,12 @@ impl<A: Annotation> Match<A> for Expr<A> {
|
||||
(Expr::Let(..), _) => false,
|
||||
(Expr::Const(pat), Expr::Const(expr)) => Match::recurse(sub, pat, expr),
|
||||
(Expr::Const(..), _) => false,
|
||||
(Expr::Make(pat, pat_arms), Expr::Make(expr, expr_arms)) => {
|
||||
Match::recurse(sub, pat, expr) && Match::recurse(sub, pat_arms, expr_arms)
|
||||
}
|
||||
(Expr::Make(pat), Expr::Make(expr)) => Match::recurse(sub, pat, expr),
|
||||
(Expr::Make(..), _) => false,
|
||||
(Expr::Match(pat), Expr::Match(expr)) => Match::recurse(sub, pat, expr),
|
||||
(Expr::Match(..), _) => false,
|
||||
(Expr::Mod(pat), Expr::Mod(expr)) => Match::recurse(sub, pat, expr),
|
||||
(Expr::Mod(..), _) => false,
|
||||
(Expr::Fn(pat), Expr::Fn(expr)) => Match::recurse(sub, pat, expr),
|
||||
(Expr::Fn(..), _) => false,
|
||||
(Expr::Op(pat_op, pat_exprs), Expr::Op(expr_op, expr_exprs)) => {
|
||||
@@ -168,22 +195,12 @@ impl<A: Annotation> Match<A> for Expr<A> {
|
||||
}
|
||||
}
|
||||
Expr::Id(_) | Expr::Lit(_) => {}
|
||||
Expr::Let(expr) => {
|
||||
expr.apply(sub);
|
||||
}
|
||||
Expr::Const(expr) => {
|
||||
expr.apply(sub);
|
||||
}
|
||||
Expr::Make(expr, make_arms) => {
|
||||
expr.apply(sub);
|
||||
make_arms.apply(sub);
|
||||
}
|
||||
Expr::Match(expr) => {
|
||||
expr.apply(sub);
|
||||
}
|
||||
Expr::Fn(expr) => {
|
||||
expr.apply(sub);
|
||||
}
|
||||
Expr::Let(expr) => expr.apply(sub),
|
||||
Expr::Const(expr) => expr.apply(sub),
|
||||
Expr::Make(expr) => expr.apply(sub),
|
||||
Expr::Match(expr) => expr.apply(sub),
|
||||
Expr::Mod(expr) => expr.apply(sub),
|
||||
Expr::Fn(expr) => expr.apply(sub),
|
||||
Expr::Op(op, exprs) => {
|
||||
op.apply(sub);
|
||||
exprs.apply(sub);
|
||||
|
||||
Reference in New Issue
Block a user