ast: Merge Ty into Pat, merge Mod and Fn into Bind
This commit is contained in:
@@ -78,24 +78,6 @@ impl<M: Match<A> + Annotation, A: Annotation> Match<A> for Anno<M, A> {
|
||||
}
|
||||
}
|
||||
|
||||
impl<A: Annotation> Match<A> for Fn<A> {
|
||||
fn recurse(sub: &mut Subst<A>, pat: &Self, expr: &Self) -> bool {
|
||||
let (
|
||||
Self(pat_id, pat_arg, _pat_rety, pat_body),
|
||||
Self(expr_id, expr_arg, _expr_rety, expr_body),
|
||||
) = (pat, expr);
|
||||
pat_id == expr_id
|
||||
&& Match::recurse(sub, pat_arg, expr_arg)
|
||||
&& Match::recurse(sub, pat_body, expr_body)
|
||||
}
|
||||
|
||||
fn apply(&mut self, sub: &Subst<A>) {
|
||||
let Self(_, pat, _rety, body) = self;
|
||||
pat.apply(sub);
|
||||
body.apply(sub);
|
||||
}
|
||||
}
|
||||
|
||||
impl<A: Annotation> Match<A> for Bind<A> {
|
||||
fn recurse(sub: &mut Subst<A>, pat: &Self, expr: &Self) -> bool {
|
||||
let (Self(pat_kind, pat_pat, pat_expr), Self(expr_kind, expr_pat, expr_expr)) = (pat, expr);
|
||||
@@ -124,20 +106,6 @@ impl<A: Annotation> Match<A> for crate::ast::Make<A> {
|
||||
}
|
||||
}
|
||||
|
||||
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 Typedef {
|
||||
fn recurse(sub: &mut Subst<A>, pat: &Self, expr: &Self) -> bool {
|
||||
let (Self(pat_kind, pat_pat), Self(expr_kind, expr_pat)) = (pat, expr);
|
||||
@@ -165,10 +133,6 @@ impl<A: Annotation> Match<A> for Expr<A> {
|
||||
(Expr::Struct(_), _) => false,
|
||||
(Expr::Make(pat), Expr::Make(expr)) => Match::recurse(sub, pat, expr),
|
||||
(Expr::Make(..), _) => 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)) => {
|
||||
Match::recurse(sub, pat_op, expr_op) && Match::recurse(sub, pat_exprs, expr_exprs)
|
||||
}
|
||||
@@ -187,8 +151,6 @@ impl<A: Annotation> Match<A> for Expr<A> {
|
||||
Expr::Bind(expr) => expr.apply(sub),
|
||||
Expr::Struct(expr) => expr.apply(sub),
|
||||
Expr::Make(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);
|
||||
@@ -220,14 +182,12 @@ impl<A: Annotation> Match<A> for Pat {
|
||||
(Pat::Name(_), _) => false,
|
||||
(Pat::Path(_), Pat::Path(_)) => true,
|
||||
(Pat::Path(_), _) => false,
|
||||
(Pat::Struct(_, pat), Pat::Struct(_, expr)) => Match::recurse(sub, pat, expr),
|
||||
(Pat::Struct(..), _) => false,
|
||||
(Pat::TupStruct(_, pat), Pat::TupStruct(_, expr)) => Match::recurse(sub, pat, expr),
|
||||
(Pat::TupStruct(..), _) => false,
|
||||
(Pat::NamedStruct(_, pat), Pat::NamedStruct(_, expr)) => Match::recurse(sub, pat, expr),
|
||||
(Pat::NamedStruct(..), _) => false,
|
||||
(Pat::NamedTuple(_, pat), Pat::NamedTuple(_, expr)) => Match::recurse(sub, pat, expr),
|
||||
(Pat::NamedTuple(..), _) => false,
|
||||
(Pat::Lit(pat), Pat::Lit(expr)) => pat == expr,
|
||||
(Pat::Lit(_), _) => false,
|
||||
(Pat::Typed(pat, _), Pat::Typed(expr, _)) => Match::recurse(sub, pat, expr),
|
||||
(Pat::Typed(..), _) => false,
|
||||
(Pat::Op(_, pat), Pat::Op(_, expr)) => Match::recurse(sub, pat, expr),
|
||||
(Pat::Op(..), _) => false,
|
||||
}
|
||||
@@ -241,27 +201,13 @@ impl<A: Annotation> Match<A> for Pat {
|
||||
*self = expr.clone()
|
||||
}
|
||||
}
|
||||
Pat::Struct(_, expr) => expr.apply(sub),
|
||||
Pat::TupStruct(_, expr) => expr.apply(sub),
|
||||
Pat::Typed(pat, ty) => {
|
||||
pat.apply(sub);
|
||||
ty.apply(sub);
|
||||
}
|
||||
Pat::NamedStruct(_, expr) => expr.apply(sub),
|
||||
Pat::NamedTuple(_, expr) => expr.apply(sub),
|
||||
Pat::Op(_, pats) => pats.apply(sub),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl<A: Annotation> Match<A> for Ty {
|
||||
fn apply(&mut self, sub: &Subst<A>) {
|
||||
todo!("Apply subst {sub:?} for {self}.")
|
||||
}
|
||||
|
||||
fn recurse(sub: &mut Subst<A>, pat: &Self, expr: &Self) -> bool {
|
||||
todo!("Construct subst {sub:?} from {pat} and {expr}.")
|
||||
}
|
||||
}
|
||||
|
||||
impl<A: Annotation> Match<A> for Op {
|
||||
fn recurse(_: &mut Subst<A>, pat: &Self, expr: &Self) -> bool {
|
||||
pat == expr
|
||||
|
||||
Reference in New Issue
Block a user