//! This module contains impls of `TypeFoldable` for those types that //! introduce binders. //! //! The more interesting impls of `TypeFoldable` remain in the `fold` module. use crate::*; impl TypeFoldable for FnPointer { fn try_fold_with( self, folder: &mut dyn FallibleTypeFolder, outer_binder: DebruijnIndex, ) -> Result { let FnPointer { num_binders, substitution, sig, } = self; Ok(FnPointer { num_binders, substitution: substitution.try_fold_with(folder, outer_binder.shifted_in())?, sig: FnSig { abi: sig.abi, safety: sig.safety, variadic: sig.variadic, }, }) } } impl TypeFoldable for Binders where T: HasInterner + TypeFoldable, I: Interner, { fn try_fold_with( self, folder: &mut dyn FallibleTypeFolder, outer_binder: DebruijnIndex, ) -> Result { let Binders { binders: self_binders, value: self_value, } = self; let value = self_value.try_fold_with(folder, outer_binder.shifted_in())?; let binders = VariableKinds { interned: self_binders.interned().clone(), }; Ok(Binders::new(binders, value)) } } impl TypeFoldable for Canonical where I: Interner, T: HasInterner + TypeFoldable, { fn try_fold_with( self, folder: &mut dyn FallibleTypeFolder, outer_binder: DebruijnIndex, ) -> Result { let Canonical { binders: self_binders, value: self_value, } = self; let value = self_value.try_fold_with(folder, outer_binder.shifted_in())?; let binders = CanonicalVarKinds { interned: self_binders.interned().clone(), }; Ok(Canonical { binders, value }) } }