use crate::syntax::Type; pub trait Visit<'a> { fn visit_type(&mut self, ty: &'a Type) { visit_type(self, ty); } } pub fn visit_type<'a, V>(visitor: &mut V, ty: &'a Type) where V: Visit<'a> + ?Sized, { match ty { Type::Ident(_) | Type::Str(_) | Type::Void(_) => {} Type::RustBox(ty) | Type::UniquePtr(ty) | Type::SharedPtr(ty) | Type::WeakPtr(ty) | Type::CxxVector(ty) | Type::RustVec(ty) => visitor.visit_type(&ty.inner), Type::Ref(r) => visitor.visit_type(&r.inner), Type::Ptr(p) => visitor.visit_type(&p.inner), Type::Array(a) => visitor.visit_type(&a.inner), Type::SliceRef(s) => visitor.visit_type(&s.inner), Type::Fn(fun) => { if let Some(ret) = &fun.ret { visitor.visit_type(ret); } for arg in &fun.args { visitor.visit_type(&arg.ty); } } } }