1 use crate::syntax::Type;
2
3 pub trait Visit<'a> {
visit_type(&mut self, ty: &'a Type)4 fn visit_type(&mut self, ty: &'a Type) {
5 visit_type(self, ty);
6 }
7 }
8
visit_type<'a, V>(visitor: &mut V, ty: &'a Type) where V: Visit<'a> + ?Sized,9 pub fn visit_type<'a, V>(visitor: &mut V, ty: &'a Type)
10 where
11 V: Visit<'a> + ?Sized,
12 {
13 match ty {
14 Type::Ident(_) | Type::Str(_) | Type::Void(_) => {}
15 Type::RustBox(ty)
16 | Type::UniquePtr(ty)
17 | Type::SharedPtr(ty)
18 | Type::WeakPtr(ty)
19 | Type::CxxVector(ty)
20 | Type::RustVec(ty) => visitor.visit_type(&ty.inner),
21 Type::Ref(r) => visitor.visit_type(&r.inner),
22 Type::Ptr(p) => visitor.visit_type(&p.inner),
23 Type::Array(a) => visitor.visit_type(&a.inner),
24 Type::SliceRef(s) => visitor.visit_type(&s.inner),
25 Type::Fn(fun) => {
26 if let Some(ret) = &fun.ret {
27 visitor.visit_type(ret);
28 }
29 for arg in &fun.args {
30 visitor.visit_type(&arg.ty);
31 }
32 }
33 }
34 }
35