ast: pub, mod, and Ty::Fn parsing

This commit is contained in:
2025-09-30 15:32:20 -04:00
parent 46b17a7eb6
commit bcabbcd39d
5 changed files with 183 additions and 70 deletions

View File

@@ -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);