ast: struct
This commit is contained in:
@@ -159,6 +159,18 @@ impl<A: Annotation> Match<A> for Mod<A> {
|
||||
}
|
||||
}
|
||||
|
||||
impl<A: Annotation> Match<A> for Struct {
|
||||
fn recurse(sub: &mut Subst<A>, pat: &Self, expr: &Self) -> bool {
|
||||
let (Self(pat_pat), Self(expr_pat)) = (pat, expr);
|
||||
Match::recurse(sub, pat_pat, expr_pat)
|
||||
}
|
||||
|
||||
fn apply(&mut self, sub: &Subst<A>) {
|
||||
let Self(pat) = self;
|
||||
pat.apply(sub);
|
||||
}
|
||||
}
|
||||
|
||||
impl<A: Annotation> Match<A> for Expr<A> {
|
||||
fn recurse(sub: &mut Subst<A>, pat: &Self, expr: &Self) -> bool {
|
||||
match (pat, expr) {
|
||||
@@ -172,6 +184,8 @@ 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::Struct(pat), Expr::Struct(expr)) => Match::recurse(sub, pat, expr),
|
||||
(Expr::Struct(_), _) => false,
|
||||
(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),
|
||||
@@ -197,6 +211,7 @@ 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::Struct(expr) => expr.apply(sub),
|
||||
Expr::Make(expr) => expr.apply(sub),
|
||||
Expr::Match(expr) => expr.apply(sub),
|
||||
Expr::Mod(expr) => expr.apply(sub),
|
||||
@@ -242,6 +257,10 @@ impl<A: Annotation> Match<A> for Pat {
|
||||
(Pat::Ignore, _) => false,
|
||||
(Pat::Name(pat), Pat::Name(expr)) => pat == expr,
|
||||
(Pat::Name(_), _) => 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::Rest(pat), Pat::Rest(expr)) => Match::recurse(sub, pat, expr),
|
||||
(Pat::Rest(_), _) => false,
|
||||
(Pat::Lit(pat), Pat::Lit(expr)) => pat == expr,
|
||||
@@ -265,6 +284,8 @@ impl<A: Annotation> Match<A> for Pat {
|
||||
*self = expr.clone()
|
||||
}
|
||||
}
|
||||
Pat::Struct(_, expr) => expr.apply(sub),
|
||||
Pat::TupStruct(_, expr) => expr.apply(sub),
|
||||
Pat::Rest(pat) => pat.apply(sub),
|
||||
Pat::Tuple(pats) => pats.apply(sub),
|
||||
Pat::Slice(pats) => pats.apply(sub),
|
||||
|
||||
Reference in New Issue
Block a user