]> git.proxmox.com Git - rustc.git/blame - vendor/chalk-ir-0.55.0/src/fold/binder_impls.rs
Merge tag 'debian/1.52.1+dfsg1-1_exp2' into proxmox/buster
[rustc.git] / vendor / chalk-ir-0.55.0 / src / fold / binder_impls.rs
CommitLineData
f9f354fc
XL
1//! This module contains impls of `Fold` for those types that
2//! introduce binders.
3//!
4//! The more interesting impls of `Fold` remain in the `fold` module.
5
f9f354fc
XL
6use crate::*;
7
5869c6ff
XL
8impl<I: Interner> Fold<I> for FnPointer<I> {
9 type Result = FnPointer<I>;
f9f354fc 10 fn fold_with<'i>(
5869c6ff
XL
11 self,
12 folder: &mut dyn Folder<'i, I>,
f9f354fc
XL
13 outer_binder: DebruijnIndex,
14 ) -> Fallible<Self::Result>
15 where
16 I: 'i,
f9f354fc 17 {
3dfed10e 18 let FnPointer {
f9f354fc
XL
19 num_binders,
20 substitution,
1b1a35ee 21 sig,
f9f354fc 22 } = self;
3dfed10e 23 Ok(FnPointer {
5869c6ff 24 num_binders,
f9f354fc 25 substitution: substitution.fold_with(folder, outer_binder.shifted_in())?,
1b1a35ee 26 sig: FnSig {
5869c6ff 27 abi: sig.abi,
1b1a35ee
XL
28 safety: sig.safety,
29 variadic: sig.variadic,
30 },
f9f354fc
XL
31 })
32 }
33}
34
5869c6ff 35impl<T, I: Interner> Fold<I> for Binders<T>
f9f354fc 36where
5869c6ff
XL
37 T: HasInterner<Interner = I> + Fold<I>,
38 <T as Fold<I>>::Result: HasInterner<Interner = I>,
f9f354fc
XL
39 I: Interner,
40{
41 type Result = Binders<T::Result>;
42 fn fold_with<'i>(
5869c6ff
XL
43 self,
44 folder: &mut dyn Folder<'i, I>,
f9f354fc
XL
45 outer_binder: DebruijnIndex,
46 ) -> Fallible<Self::Result>
47 where
48 I: 'i,
f9f354fc
XL
49 {
50 let Binders {
51 binders: self_binders,
52 value: self_value,
53 } = self;
54 let value = self_value.fold_with(folder, outer_binder.shifted_in())?;
f035d41b 55 let binders = VariableKinds {
5869c6ff 56 interned: self_binders.interned().clone(),
f9f354fc
XL
57 };
58 Ok(Binders::new(binders, value))
59 }
60}
61
5869c6ff 62impl<I, T> Fold<I> for Canonical<T>
f9f354fc
XL
63where
64 I: Interner,
5869c6ff
XL
65 T: HasInterner<Interner = I> + Fold<I>,
66 <T as Fold<I>>::Result: HasInterner<Interner = I>,
f9f354fc
XL
67{
68 type Result = Canonical<T::Result>;
69 fn fold_with<'i>(
5869c6ff
XL
70 self,
71 folder: &mut dyn Folder<'i, I>,
f9f354fc
XL
72 outer_binder: DebruijnIndex,
73 ) -> Fallible<Self::Result>
74 where
75 I: 'i,
f9f354fc
XL
76 {
77 let Canonical {
78 binders: self_binders,
79 value: self_value,
80 } = self;
81 let value = self_value.fold_with(folder, outer_binder.shifted_in())?;
82 let binders = CanonicalVarKinds {
5869c6ff 83 interned: self_binders.interned().clone(),
f9f354fc 84 };
3dfed10e 85 Ok(Canonical { binders, value })
f9f354fc
XL
86 }
87}