30 lines
656 B
Rust
30 lines
656 B
Rust
|
|
use crate::syn::ast::{Stmt, Expr};
|
||
|
|
|
||
|
|
pub trait Visit {
|
||
|
|
type Out;
|
||
|
|
fn visit<A: Accept<Self>>(&mut self, acceptor: &A) -> Self::Out
|
||
|
|
where Self: Sized
|
||
|
|
{
|
||
|
|
acceptor.accept(self)
|
||
|
|
}
|
||
|
|
|
||
|
|
fn visit_stmt(&mut self, stmt: &Stmt) -> Self::Out;
|
||
|
|
fn visit_expr(&mut self, expr: &Expr) -> Self::Out;
|
||
|
|
}
|
||
|
|
|
||
|
|
pub trait Accept<V: Visit> {
|
||
|
|
fn accept(&self, visitor: &mut V) -> V::Out;
|
||
|
|
}
|
||
|
|
|
||
|
|
impl<V: Visit> Accept<V> for Stmt {
|
||
|
|
fn accept(&self, visitor: &mut V) -> V::Out {
|
||
|
|
visitor.visit_stmt(self)
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
impl<V: Visit> Accept<V> for Expr {
|
||
|
|
fn accept(&self, visitor: &mut V) -> V::Out {
|
||
|
|
visitor.visit_expr(self)
|
||
|
|
}
|
||
|
|
}
|