]>
Commit | Line | Data |
---|---|---|
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 |
6 | use crate::*; |
7 | ||
5869c6ff XL |
8 | impl<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 | 35 | impl<T, I: Interner> Fold<I> for Binders<T> |
f9f354fc | 36 | where |
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 | 62 | impl<I, T> Fold<I> for Canonical<T> |
f9f354fc XL |
63 | where |
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 | } |