]>
git.proxmox.com Git - rustc.git/blob - vendor/chalk-ir-0.14.0/src/fold/boring_impls.rs
1 //! This module contains "rote and uninteresting" impls of `Fold` for
2 //! various types. In general, we prefer to derive `Fold`, but
3 //! sometimes that doesn't work for whatever reason.
5 //! The more interesting impls of `Fold` remain in the `fold` module.
7 use crate::interner
::TargetInterner
;
9 use std
::marker
::PhantomData
;
12 impl<'a
, T
: Fold
<I
, TI
>, I
: Interner
, TI
: TargetInterner
<I
>> Fold
<I
, TI
> for &'a T
{
13 type Result
= T
::Result
;
16 folder
: &mut dyn Folder
<'i
, I
, TI
>,
17 outer_binder
: DebruijnIndex
,
18 ) -> Fallible
<Self::Result
>
23 (**self).fold_with(folder
, outer_binder
)
27 impl<T
: Fold
<I
, TI
>, I
: Interner
, TI
: TargetInterner
<I
>> Fold
<I
, TI
> for Vec
<T
> {
28 type Result
= Vec
<T
::Result
>;
31 folder
: &mut dyn Folder
<'i
, I
, TI
>,
32 outer_binder
: DebruijnIndex
,
33 ) -> Fallible
<Self::Result
>
39 .map(|e
| e
.fold_with(folder
, outer_binder
))
44 impl<T
: Fold
<I
, TI
>, I
: Interner
, TI
: TargetInterner
<I
>> Fold
<I
, TI
> for Box
<T
> {
45 type Result
= Box
<T
::Result
>;
48 folder
: &mut dyn Folder
<'i
, I
, TI
>,
49 outer_binder
: DebruijnIndex
,
50 ) -> Fallible
<Self::Result
>
55 Ok(Box
::new((**self).fold_with(folder
, outer_binder
)?
))
59 impl<T
: Fold
<I
, TI
>, I
: Interner
, TI
: TargetInterner
<I
>> Fold
<I
, TI
> for Arc
<T
> {
60 type Result
= Arc
<T
::Result
>;
63 folder
: &mut dyn Folder
<'i
, I
, TI
>,
64 outer_binder
: DebruijnIndex
,
65 ) -> Fallible
<Self::Result
>
70 Ok(Arc
::new((**self).fold_with(folder
, outer_binder
)?
))
74 macro_rules
! tuple_fold
{
76 impl<$
($n
: Fold
<I
, TI
>,)* I
: Interner
, TI
: TargetInterner
<I
>> Fold
<I
, TI
> for ($
($n
,)*) {
77 type Result
= ($
($n
::Result
,)*);
78 fn fold_with
<'i
>(&self, folder
: &mut dyn Folder
<'i
, I
, TI
>, outer_binder
: DebruijnIndex
) -> Fallible
<Self::Result
>
83 #[allow(non_snake_case)]
84 let &($
(ref $n
),*) = self;
85 Ok(($
($n
.fold_with(folder
, outer_binder
)?
,)*))
93 tuple_fold
!(A
, B
, C
, D
);
94 tuple_fold
!(A
, B
, C
, D
, E
);
96 impl<T
: Fold
<I
, TI
>, I
: Interner
, TI
: TargetInterner
<I
>> Fold
<I
, TI
> for Option
<T
> {
97 type Result
= Option
<T
::Result
>;
100 folder
: &mut dyn Folder
<'i
, I
, TI
>,
101 outer_binder
: DebruijnIndex
,
102 ) -> Fallible
<Self::Result
>
109 Some(e
) => Ok(Some(e
.fold_with(folder
, outer_binder
)?
)),
114 impl<I
: Interner
, TI
: TargetInterner
<I
>> Fold
<I
, TI
> for GenericArg
<I
> {
115 type Result
= GenericArg
<TI
>;
118 folder
: &mut dyn Folder
<'i
, I
, TI
>,
119 outer_binder
: DebruijnIndex
,
120 ) -> Fallible
<Self::Result
>
125 let interner
= folder
.interner();
126 let target_interner
= folder
.target_interner();
128 let data
= self.data(interner
).fold_with(folder
, outer_binder
)?
;
129 Ok(GenericArg
::new(target_interner
, data
))
133 impl<I
: Interner
, TI
: TargetInterner
<I
>> Fold
<I
, TI
> for Substitution
<I
> {
134 type Result
= Substitution
<TI
>;
137 folder
: &mut dyn Folder
<'i
, I
, TI
>,
138 outer_binder
: DebruijnIndex
,
139 ) -> Fallible
<Self::Result
>
144 let interner
= folder
.interner();
145 let target_interner
= folder
.target_interner();
148 .map(|p
| p
.fold_with(folder
, outer_binder
));
149 Ok(Substitution
::from_fallible(target_interner
, folded
)?
)
153 impl<I
: Interner
, TI
: TargetInterner
<I
>> Fold
<I
, TI
> for Goals
<I
> {
154 type Result
= Goals
<TI
>;
157 folder
: &mut dyn Folder
<'i
, I
, TI
>,
158 outer_binder
: DebruijnIndex
,
159 ) -> Fallible
<Self::Result
>
164 let interner
= folder
.interner();
165 let target_interner
= folder
.target_interner();
168 .map(|p
| p
.fold_with(folder
, outer_binder
));
169 Ok(Goals
::from_fallible(target_interner
, folded
)?
)
173 impl<I
: Interner
, TI
: TargetInterner
<I
>> Fold
<I
, TI
> for ProgramClauses
<I
> {
174 type Result
= ProgramClauses
<TI
>;
177 folder
: &mut dyn Folder
<'i
, I
, TI
>,
178 outer_binder
: DebruijnIndex
,
179 ) -> Fallible
<Self::Result
>
184 let interner
= folder
.interner();
185 let target_interner
= folder
.target_interner();
188 .map(|p
| p
.fold_with(folder
, outer_binder
));
189 Ok(ProgramClauses
::from_fallible(target_interner
, folded
)?
)
193 impl<I
: Interner
, TI
: TargetInterner
<I
>> Fold
<I
, TI
> for QuantifiedWhereClauses
<I
> {
194 type Result
= QuantifiedWhereClauses
<TI
>;
197 folder
: &mut dyn Folder
<'i
, I
, TI
>,
198 outer_binder
: DebruijnIndex
,
199 ) -> Fallible
<Self::Result
>
204 let interner
= folder
.interner();
205 let target_interner
= folder
.target_interner();
208 .map(|p
| p
.fold_with(folder
, outer_binder
));
209 Ok(QuantifiedWhereClauses
::from_fallible(
217 macro_rules
! copy_fold
{
219 impl<I
: Interner
, TI
: TargetInterner
<I
>> $
crate::fold
::Fold
<I
, TI
> for $t
{
223 _folder
: &mut dyn ($
crate::fold
::Folder
<'i
, I
, TI
>),
224 _outer_binder
: DebruijnIndex
,
225 ) -> ::chalk_ir
::Fallible
<Self::Result
>
238 copy_fold
!(UniverseIndex
);
239 copy_fold
!(PlaceholderIndex
);
240 copy_fold
!(QuantifierKind
);
241 copy_fold
!(DebruijnIndex
);
247 copy_fold
!(ClausePriority
);
248 copy_fold
!(Mutability
);
251 macro_rules
! id_fold
{
253 $
crate::id_fold
!($t
, transfer_def_id
);
256 ($t
:ident
, $transfer_fn
:ident
) => {
257 impl<I
: Interner
, TI
: TargetInterner
<I
>> $
crate::fold
::Fold
<I
, TI
> for $t
<I
> {
258 type Result
= $t
<TI
>;
261 _folder
: &mut dyn ($
crate::fold
::Folder
<'i
, I
, TI
>),
262 _outer_binder
: DebruijnIndex
,
263 ) -> ::chalk_ir
::Fallible
<Self::Result
>
268 let $
t(def_id_tf
) = *self;
269 let def_id_ttf
= TI
::$
transfer_fn(def_id_tf
);
277 id_fold
!(AdtId
, transfer_adt_id
);
279 id_fold
!(AssocTypeId
);
280 id_fold
!(OpaqueTyId
);
284 impl<I
: Interner
, TI
: TargetInterner
<I
>> SuperFold
<I
, TI
> for ProgramClauseData
<I
> {
285 fn super_fold_with
<'i
>(
287 folder
: &mut dyn Folder
<'i
, I
, TI
>,
288 outer_binder
: DebruijnIndex
,
289 ) -> ::chalk_ir
::Fallible
<Self::Result
>
294 Ok(ProgramClauseData(self.0.fold_with
(folder
, outer_binder
)?
))
298 impl<I
: Interner
, TI
: TargetInterner
<I
>> SuperFold
<I
, TI
> for ProgramClause
<I
> {
299 fn super_fold_with
<'i
>(
301 folder
: &mut dyn Folder
<'i
, I
, TI
>,
302 outer_binder
: DebruijnIndex
,
303 ) -> ::chalk_ir
::Fallible
<Self::Result
>
308 let clause
= self.data(folder
.interner());
310 .super_fold_with(folder
, outer_binder
)?
311 .intern(folder
.target_interner()))
315 impl<I
: Interner
, TI
: TargetInterner
<I
>> Fold
<I
, TI
> for PhantomData
<I
> {
316 type Result
= PhantomData
<TI
>;
320 _folder
: &mut dyn Folder
<'i
, I
, TI
>,
321 _outer_binder
: DebruijnIndex
,
322 ) -> ::chalk_ir
::Fallible
<Self::Result
>