133d722a9Sopenharmony_ciuse crate::syntax::Type;
233d722a9Sopenharmony_ci
333d722a9Sopenharmony_cipub trait Visit<'a> {
433d722a9Sopenharmony_ci    fn visit_type(&mut self, ty: &'a Type) {
533d722a9Sopenharmony_ci        visit_type(self, ty);
633d722a9Sopenharmony_ci    }
733d722a9Sopenharmony_ci}
833d722a9Sopenharmony_ci
933d722a9Sopenharmony_cipub fn visit_type<'a, V>(visitor: &mut V, ty: &'a Type)
1033d722a9Sopenharmony_ciwhere
1133d722a9Sopenharmony_ci    V: Visit<'a> + ?Sized,
1233d722a9Sopenharmony_ci{
1333d722a9Sopenharmony_ci    match ty {
1433d722a9Sopenharmony_ci        Type::Ident(_) | Type::Str(_) | Type::Void(_) => {}
1533d722a9Sopenharmony_ci        Type::RustBox(ty)
1633d722a9Sopenharmony_ci        | Type::UniquePtr(ty)
1733d722a9Sopenharmony_ci        | Type::SharedPtr(ty)
1833d722a9Sopenharmony_ci        | Type::WeakPtr(ty)
1933d722a9Sopenharmony_ci        | Type::CxxVector(ty)
2033d722a9Sopenharmony_ci        | Type::RustVec(ty) => visitor.visit_type(&ty.inner),
2133d722a9Sopenharmony_ci        Type::Ref(r) => visitor.visit_type(&r.inner),
2233d722a9Sopenharmony_ci        Type::Ptr(p) => visitor.visit_type(&p.inner),
2333d722a9Sopenharmony_ci        Type::Array(a) => visitor.visit_type(&a.inner),
2433d722a9Sopenharmony_ci        Type::SliceRef(s) => visitor.visit_type(&s.inner),
2533d722a9Sopenharmony_ci        Type::Fn(fun) => {
2633d722a9Sopenharmony_ci            if let Some(ret) = &fun.ret {
2733d722a9Sopenharmony_ci                visitor.visit_type(ret);
2833d722a9Sopenharmony_ci            }
2933d722a9Sopenharmony_ci            for arg in &fun.args {
3033d722a9Sopenharmony_ci                visitor.visit_type(&arg.ty);
3133d722a9Sopenharmony_ci            }
3233d722a9Sopenharmony_ci        }
3333d722a9Sopenharmony_ci    }
3433d722a9Sopenharmony_ci}
35