pub trait Visitor {
type Result: VisitorResult;
// Provided methods
fn visit_expression(&mut self, expr: &Expression) -> Self::Result { ... }
fn visit_statement(&mut self, stmt: &Statement) -> Self::Result { ... }
fn visit_type(&mut self, ty: &Type) -> Self::Result { ... }
fn visit_module(&mut self, prog: &Module) -> Self::Result { ... }
fn visit_item(&mut self, item: &Item) -> Self::Result { ... }
}