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