1 //! This module contains "rote and uninteresting" impls of `Visit` for
2 //! various types. In general, we prefer to derive `Visit`, but
3 //! sometimes that doesn't work for whatever reason.
5 //! The more interesting impls of `Visit` remain in the `visit` module.
8 AdtId
, AssocTypeId
, ClausePriority
, ClosureId
, Constraints
, DebruijnIndex
, FloatTy
, FnDefId
,
9 GenericArg
, Goals
, ImplId
, IntTy
, Interner
, Mutability
, OpaqueTyId
, PlaceholderIndex
,
10 ProgramClause
, ProgramClauses
, QuantifiedWhereClauses
, QuantifierKind
, Safety
, Scalar
,
11 Substitution
, SuperVisit
, TraitId
, UintTy
, UniverseIndex
, Visit
, VisitResult
, Visitor
,
13 use std
::{marker::PhantomData, sync::Arc}
;
15 /// Convenience function to visit all the items in the iterator it.
16 pub fn visit_iter
<'i
, T
, I
, R
>(
17 it
: impl Iterator
<Item
= T
>,
18 visitor
: &mut dyn Visitor
<'i
, I
, Result
= R
>,
19 outer_binder
: DebruijnIndex
,
26 let mut result
= R
::new();
28 result
= result
.combine(e
.visit_with(visitor
, outer_binder
));
29 if result
.return_early() {
36 impl<T
: Visit
<I
>, I
: Interner
> Visit
<I
> for &T
{
37 fn visit_with
<'i
, R
: VisitResult
>(
39 visitor
: &mut dyn Visitor
<'i
, I
, Result
= R
>,
40 outer_binder
: DebruijnIndex
,
45 T
::visit_with(self, visitor
, outer_binder
)
49 impl<T
: Visit
<I
>, I
: Interner
> Visit
<I
> for Vec
<T
> {
50 fn visit_with
<'i
, R
: VisitResult
>(
52 visitor
: &mut dyn Visitor
<'i
, I
, Result
= R
>,
53 outer_binder
: DebruijnIndex
,
58 visit_iter(self.iter(), visitor
, outer_binder
)
62 impl<T
: Visit
<I
>, I
: Interner
> Visit
<I
> for &[T
] {
63 fn visit_with
<'i
, R
: VisitResult
>(
65 visitor
: &mut dyn Visitor
<'i
, I
, Result
= R
>,
66 outer_binder
: DebruijnIndex
,
71 visit_iter(self.iter(), visitor
, outer_binder
)
75 impl<T
: Visit
<I
>, I
: Interner
> Visit
<I
> for Box
<T
> {
76 fn visit_with
<'i
, R
: VisitResult
>(
78 visitor
: &mut dyn Visitor
<'i
, I
, Result
= R
>,
79 outer_binder
: DebruijnIndex
,
84 T
::visit_with(self, visitor
, outer_binder
)
88 impl<T
: Visit
<I
>, I
: Interner
> Visit
<I
> for Arc
<T
> {
89 fn visit_with
<'i
, R
: VisitResult
>(
91 visitor
: &mut dyn Visitor
<'i
, I
, Result
= R
>,
92 outer_binder
: DebruijnIndex
,
97 T
::visit_with(self, visitor
, outer_binder
)
101 macro_rules
! tuple_visit
{
103 impl<$
($n
: Visit
<I
>,)* I
: Interner
> Visit
<I
> for ($
($n
,)*) {
104 fn visit_with
<'i
, R
: VisitResult
>(&self, visitor
: &mut dyn Visitor
<'i
, I
, Result
= R
>, outer_binder
: DebruijnIndex
) -> R
where I
: 'i
106 #[allow(non_snake_case)]
107 let &($
(ref $n
),*) = self;
108 let mut result
= R
::new();
110 result
= result
.combine($n
.visit_with(visitor
, outer_binder
));
111 if result
.return_early() { return result; }
120 tuple_visit
!(A
, B
, C
);
121 tuple_visit
!(A
, B
, C
, D
);
122 tuple_visit
!(A
, B
, C
, D
, E
);
124 impl<T
: Visit
<I
>, I
: Interner
> Visit
<I
> for Option
<T
> {
125 fn visit_with
<'i
, R
: VisitResult
>(
127 visitor
: &mut dyn Visitor
<'i
, I
, Result
= R
>,
128 outer_binder
: DebruijnIndex
,
134 Some(e
) => e
.visit_with(visitor
, outer_binder
),
140 impl<I
: Interner
> Visit
<I
> for GenericArg
<I
> {
141 fn visit_with
<'i
, R
: VisitResult
>(
143 visitor
: &mut dyn Visitor
<'i
, I
, Result
= R
>,
144 outer_binder
: DebruijnIndex
,
149 let interner
= visitor
.interner();
150 self.data(interner
).visit_with(visitor
, outer_binder
)
154 impl<I
: Interner
> Visit
<I
> for Substitution
<I
> {
155 fn visit_with
<'i
, R
: VisitResult
>(
157 visitor
: &mut dyn Visitor
<'i
, I
, Result
= R
>,
158 outer_binder
: DebruijnIndex
,
163 let interner
= visitor
.interner();
164 visit_iter(self.iter(interner
), visitor
, outer_binder
)
168 impl<I
: Interner
> Visit
<I
> for Goals
<I
> {
169 fn visit_with
<'i
, R
: VisitResult
>(
171 visitor
: &mut dyn Visitor
<'i
, I
, Result
= R
>,
172 outer_binder
: DebruijnIndex
,
177 let interner
= visitor
.interner();
178 visit_iter(self.iter(interner
), visitor
, outer_binder
)
184 macro_rules
! const_visit
{
186 impl<I
: Interner
> $
crate::visit
::Visit
<I
> for $t
{
187 fn visit_with
<'i
, R
: VisitResult
>(
189 _visitor
: &mut dyn ($
crate::visit
::Visitor
<'i
, I
, Result
= R
>),
190 _outer_binder
: DebruijnIndex
,
203 const_visit
!(UniverseIndex
);
204 const_visit
!(PlaceholderIndex
);
205 const_visit
!(QuantifierKind
);
206 const_visit
!(DebruijnIndex
);
207 const_visit
!(ClausePriority
);
209 const_visit
!(Scalar
);
210 const_visit
!(UintTy
);
212 const_visit
!(FloatTy
);
213 const_visit
!(Mutability
);
214 const_visit
!(Safety
);
218 macro_rules
! id_visit
{
220 impl<I
: Interner
> $
crate::visit
::Visit
<I
> for $t
<I
> {
221 fn visit_with
<'i
, R
: VisitResult
>(
223 _visitor
: &mut dyn ($
crate::visit
::Visitor
<'i
, I
, Result
= R
>),
224 _outer_binder
: DebruijnIndex
,
238 id_visit
!(OpaqueTyId
);
239 id_visit
!(AssocTypeId
);
241 id_visit
!(ClosureId
);
243 impl<I
: Interner
> SuperVisit
<I
> for ProgramClause
<I
> {
244 fn super_visit_with
<'i
, R
: VisitResult
>(
246 visitor
: &mut dyn Visitor
<'i
, I
, Result
= R
>,
247 outer_binder
: DebruijnIndex
,
252 let interner
= visitor
.interner();
254 self.data(interner
).0.visit_with(visitor
, outer_binder
)
258 impl<I
: Interner
> Visit
<I
> for ProgramClauses
<I
> {
259 fn visit_with
<'i
, R
: VisitResult
>(
261 visitor
: &mut dyn Visitor
<'i
, I
, Result
= R
>,
262 outer_binder
: DebruijnIndex
,
267 let interner
= visitor
.interner();
269 visit_iter(self.iter(interner
), visitor
, outer_binder
)
273 impl<I
: Interner
> Visit
<I
> for Constraints
<I
> {
274 fn visit_with
<'i
, R
: VisitResult
>(
276 visitor
: &mut dyn Visitor
<'i
, I
, Result
= R
>,
277 outer_binder
: DebruijnIndex
,
282 let interner
= visitor
.interner();
284 visit_iter(self.iter(interner
), visitor
, outer_binder
)
288 impl<I
: Interner
> Visit
<I
> for QuantifiedWhereClauses
<I
> {
289 fn visit_with
<'i
, R
: VisitResult
>(
291 visitor
: &mut dyn Visitor
<'i
, I
, Result
= R
>,
292 outer_binder
: DebruijnIndex
,
297 let interner
= visitor
.interner();
299 visit_iter(self.iter(interner
), visitor
, outer_binder
)
303 impl<I
: Interner
> Visit
<I
> for PhantomData
<I
> {
304 fn visit_with
<'i
, R
: VisitResult
>(
306 _visitor
: &mut dyn Visitor
<'i
, I
, Result
= R
>,
307 _outer_binder
: DebruijnIndex
,