1 //! This module contains "rote and uninteresting" impls of `TypeVisitable` for
2 //! various types. In general, we prefer to derive `TypeVisitable`, but
3 //! sometimes that doesn't work for whatever reason.
5 //! The more interesting impls of `TypeVisitable` remain in the `visit` module.
8 try_break
, AdtId
, AssocTypeId
, ClausePriority
, ClosureId
, Constraints
, ControlFlow
,
9 DebruijnIndex
, FloatTy
, FnDefId
, ForeignDefId
, GeneratorId
, GenericArg
, Goals
, ImplId
, IntTy
,
10 Interner
, Mutability
, OpaqueTyId
, PlaceholderIndex
, ProgramClause
, ProgramClauses
,
11 QuantifiedWhereClauses
, QuantifierKind
, Safety
, Scalar
, Substitution
, TraitId
,
12 TypeSuperVisitable
, TypeVisitable
, TypeVisitor
, UintTy
, UniverseIndex
,
14 use std
::{marker::PhantomData, sync::Arc}
;
16 /// Convenience function to visit all the items in the iterator it.
17 pub fn visit_iter
<'i
, T
, I
, B
>(
18 it
: impl Iterator
<Item
= T
>,
19 visitor
: &mut dyn TypeVisitor
<I
, BreakTy
= B
>,
20 outer_binder
: DebruijnIndex
,
27 try_break
!(e
.visit_with(visitor
, outer_binder
));
29 ControlFlow
::Continue(())
32 impl<T
: TypeVisitable
<I
>, I
: Interner
> TypeVisitable
<I
> for &T
{
35 visitor
: &mut dyn TypeVisitor
<I
, BreakTy
= B
>,
36 outer_binder
: DebruijnIndex
,
38 T
::visit_with(self, visitor
, outer_binder
)
42 impl<T
: TypeVisitable
<I
>, I
: Interner
> TypeVisitable
<I
> for Vec
<T
> {
45 visitor
: &mut dyn TypeVisitor
<I
, BreakTy
= B
>,
46 outer_binder
: DebruijnIndex
,
48 visit_iter(self.iter(), visitor
, outer_binder
)
52 impl<T
: TypeVisitable
<I
>, I
: Interner
> TypeVisitable
<I
> for &[T
] {
55 visitor
: &mut dyn TypeVisitor
<I
, BreakTy
= B
>,
56 outer_binder
: DebruijnIndex
,
58 visit_iter(self.iter(), visitor
, outer_binder
)
62 impl<T
: TypeVisitable
<I
>, I
: Interner
> TypeVisitable
<I
> for Box
<T
> {
65 visitor
: &mut dyn TypeVisitor
<I
, BreakTy
= B
>,
66 outer_binder
: DebruijnIndex
,
68 T
::visit_with(self, visitor
, outer_binder
)
72 impl<T
: TypeVisitable
<I
>, I
: Interner
> TypeVisitable
<I
> for Arc
<T
> {
75 visitor
: &mut dyn TypeVisitor
<I
, BreakTy
= B
>,
76 outer_binder
: DebruijnIndex
,
78 T
::visit_with(self, visitor
, outer_binder
)
82 macro_rules
! tuple_visit
{
84 impl<$
($n
: TypeVisitable
<I
>,)* I
: Interner
> TypeVisitable
<I
> for ($
($n
,)*) {
85 fn visit_with
<BT
>(&self, visitor
: &mut dyn TypeVisitor
<I
, BreakTy
= BT
>, outer_binder
: DebruijnIndex
) -> ControlFlow
<BT
> {
86 #[allow(non_snake_case)]
87 let &($
(ref $n
),*) = self;
89 try_break
!($n
.visit_with(visitor
, outer_binder
));
91 ControlFlow
::Continue(())
98 tuple_visit
!(A
, B
, C
);
99 tuple_visit
!(A
, B
, C
, D
);
100 tuple_visit
!(A
, B
, C
, D
, E
);
102 impl<T
: TypeVisitable
<I
>, I
: Interner
> TypeVisitable
<I
> for Option
<T
> {
105 visitor
: &mut dyn TypeVisitor
<I
, BreakTy
= B
>,
106 outer_binder
: DebruijnIndex
,
107 ) -> ControlFlow
<B
> {
109 Some(e
) => e
.visit_with(visitor
, outer_binder
),
110 None
=> ControlFlow
::Continue(()),
115 impl<I
: Interner
> TypeVisitable
<I
> for GenericArg
<I
> {
118 visitor
: &mut dyn TypeVisitor
<I
, BreakTy
= B
>,
119 outer_binder
: DebruijnIndex
,
120 ) -> ControlFlow
<B
> {
121 let interner
= visitor
.interner();
122 self.data(interner
).visit_with(visitor
, outer_binder
)
126 impl<I
: Interner
> TypeVisitable
<I
> for Substitution
<I
> {
129 visitor
: &mut dyn TypeVisitor
<I
, BreakTy
= B
>,
130 outer_binder
: DebruijnIndex
,
131 ) -> ControlFlow
<B
> {
132 let interner
= visitor
.interner();
133 visit_iter(self.iter(interner
), visitor
, outer_binder
)
137 impl<I
: Interner
> TypeVisitable
<I
> for Goals
<I
> {
140 visitor
: &mut dyn TypeVisitor
<I
, BreakTy
= B
>,
141 outer_binder
: DebruijnIndex
,
142 ) -> ControlFlow
<B
> {
143 let interner
= visitor
.interner();
144 visit_iter(self.iter(interner
), visitor
, outer_binder
)
150 macro_rules
! const_visit
{
152 impl<I
: Interner
> $
crate::visit
::TypeVisitable
<I
> for $t
{
155 _visitor
: &mut dyn ($
crate::visit
::TypeVisitor
<I
, BreakTy
= B
>),
156 _outer_binder
: DebruijnIndex
,
157 ) -> ControlFlow
<B
> {
158 ControlFlow
::Continue(())
166 const_visit
!(UniverseIndex
);
167 const_visit
!(PlaceholderIndex
);
168 const_visit
!(QuantifierKind
);
169 const_visit
!(DebruijnIndex
);
170 const_visit
!(ClausePriority
);
172 const_visit
!(Scalar
);
173 const_visit
!(UintTy
);
175 const_visit
!(FloatTy
);
176 const_visit
!(Mutability
);
177 const_visit
!(Safety
);
181 macro_rules
! id_visit
{
183 impl<I
: Interner
> $
crate::visit
::TypeVisitable
<I
> for $t
<I
> {
186 _visitor
: &mut dyn ($
crate::visit
::TypeVisitor
<I
, BreakTy
= B
>),
187 _outer_binder
: DebruijnIndex
,
188 ) -> ControlFlow
<B
> {
189 ControlFlow
::Continue(())
198 id_visit
!(OpaqueTyId
);
199 id_visit
!(AssocTypeId
);
201 id_visit
!(ClosureId
);
202 id_visit
!(GeneratorId
);
203 id_visit
!(ForeignDefId
);
205 impl<I
: Interner
> TypeSuperVisitable
<I
> for ProgramClause
<I
> {
206 fn super_visit_with
<B
>(
208 visitor
: &mut dyn TypeVisitor
<I
, BreakTy
= B
>,
209 outer_binder
: DebruijnIndex
,
210 ) -> ControlFlow
<B
> {
211 let interner
= visitor
.interner();
213 self.data(interner
).0.visit_with(visitor
, outer_binder
)
217 impl<I
: Interner
> TypeVisitable
<I
> for ProgramClauses
<I
> {
220 visitor
: &mut dyn TypeVisitor
<I
, BreakTy
= B
>,
221 outer_binder
: DebruijnIndex
,
222 ) -> ControlFlow
<B
> {
223 let interner
= visitor
.interner();
225 visit_iter(self.iter(interner
), visitor
, outer_binder
)
229 impl<I
: Interner
> TypeVisitable
<I
> for Constraints
<I
> {
232 visitor
: &mut dyn TypeVisitor
<I
, BreakTy
= B
>,
233 outer_binder
: DebruijnIndex
,
234 ) -> ControlFlow
<B
> {
235 let interner
= visitor
.interner();
237 visit_iter(self.iter(interner
), visitor
, outer_binder
)
241 impl<I
: Interner
> TypeVisitable
<I
> for QuantifiedWhereClauses
<I
> {
244 visitor
: &mut dyn TypeVisitor
<I
, BreakTy
= B
>,
245 outer_binder
: DebruijnIndex
,
246 ) -> ControlFlow
<B
> {
247 let interner
= visitor
.interner();
249 visit_iter(self.iter(interner
), visitor
, outer_binder
)
253 impl<I
: Interner
> TypeVisitable
<I
> for PhantomData
<I
> {
256 _visitor
: &mut dyn TypeVisitor
<I
, BreakTy
= B
>,
257 _outer_binder
: DebruijnIndex
,
258 ) -> ControlFlow
<B
> {
259 ControlFlow
::Continue(())