pub trait TypeFoldable<I: Interner>: TypeVisitable<I> + Clone {
// Required methods
fn try_fold_with<F: FallibleTypeFolder<I>>(
self,
folder: &mut F,
) -> Result<Self, F::Error>;
fn fold_with<F: TypeFolder<I>>(self, folder: &mut F) -> Self;
}Expand description
This trait is implemented for every type that can be folded, providing the skeleton of the traversal.
To implement this conveniently, use the derive macro located in
rustc_macros.
This trait is a sub-trait of TypeVisitable. This is because many
TypeFolder instances use the methods in TypeVisitableExt while folding,
which means in practice almost every foldable type needs to also be
visitable. (However, there are some types that are visitable without being
foldable.)
Required Methods§
Sourcefn try_fold_with<F: FallibleTypeFolder<I>>(
self,
folder: &mut F,
) -> Result<Self, F::Error>
fn try_fold_with<F: FallibleTypeFolder<I>>( self, folder: &mut F, ) -> Result<Self, F::Error>
The entry point for folding. To fold a value t with a folder f
call: t.try_fold_with(f).
For most types, this just traverses the value, calling try_fold_with
on each field/element.
For types of interest (such as Ty), the implementation of this method
calls a folder method specifically for that type (such as
F::try_fold_ty). This is where control transfers from TypeFoldable
to FallibleTypeFolder.
Sourcefn fold_with<F: TypeFolder<I>>(self, folder: &mut F) -> Self
fn fold_with<F: TypeFolder<I>>(self, folder: &mut F) -> Self
The entry point for folding. To fold a value t with a folder f
call: t.fold_with(f).
For most types, this just traverses the value, calling fold_with
on each field/element.
For types of interest (such as Ty), the implementation of this method
calls a folder method specifically for that type (such as
F::fold_ty). This is where control transfers from TypeFoldable
to TypeFolder.
Same as TypeFoldable::try_fold_with, but not fallible. Make sure to keep
the behavior in sync across functions.
Dyn Compatibility§
This trait is not dyn compatible.
In older versions of Rust, dyn compatibility was called "object safety", so this trait is not object safe.
Implementations on Foreign Types§
Source§impl<I: Interner> TypeFoldable<I> for bool
impl<I: Interner> TypeFoldable<I> for bool
fn try_fold_with<F: FallibleTypeFolder<I>>( self, _: &mut F, ) -> Result<Self, F::Error>
fn fold_with<F: TypeFolder<I>>(self, _: &mut F) -> Self
Source§impl<I: Interner> TypeFoldable<I> for u16
impl<I: Interner> TypeFoldable<I> for u16
fn try_fold_with<F: FallibleTypeFolder<I>>( self, _: &mut F, ) -> Result<Self, F::Error>
fn fold_with<F: TypeFolder<I>>(self, _: &mut F) -> Self
Source§impl<I: Interner> TypeFoldable<I> for u32
impl<I: Interner> TypeFoldable<I> for u32
fn try_fold_with<F: FallibleTypeFolder<I>>( self, _: &mut F, ) -> Result<Self, F::Error>
fn fold_with<F: TypeFolder<I>>(self, _: &mut F) -> Self
Source§impl<I: Interner> TypeFoldable<I> for u64
impl<I: Interner> TypeFoldable<I> for u64
fn try_fold_with<F: FallibleTypeFolder<I>>( self, _: &mut F, ) -> Result<Self, F::Error>
fn fold_with<F: TypeFolder<I>>(self, _: &mut F) -> Self
Source§impl<I: Interner> TypeFoldable<I> for ()
impl<I: Interner> TypeFoldable<I> for ()
fn try_fold_with<F: FallibleTypeFolder<I>>( self, _: &mut F, ) -> Result<Self, F::Error>
fn fold_with<F: TypeFolder<I>>(self, _: &mut F) -> Self
Source§impl<I: Interner> TypeFoldable<I> for usize
impl<I: Interner> TypeFoldable<I> for usize
fn try_fold_with<F: FallibleTypeFolder<I>>( self, _: &mut F, ) -> Result<Self, F::Error>
fn fold_with<F: TypeFolder<I>>(self, _: &mut F) -> Self
Source§impl<I: Interner, A: TypeFoldable<I>, B: TypeFoldable<I>, C: TypeFoldable<I>> TypeFoldable<I> for (A, B, C)
impl<I: Interner, A: TypeFoldable<I>, B: TypeFoldable<I>, C: TypeFoldable<I>> TypeFoldable<I> for (A, B, C)
fn try_fold_with<F: FallibleTypeFolder<I>>( self, folder: &mut F, ) -> Result<(A, B, C), F::Error>
fn fold_with<F: TypeFolder<I>>(self, folder: &mut F) -> Self
Source§impl<I: Interner, T: TypeFoldable<I>> TypeFoldable<I> for Option<T>
impl<I: Interner, T: TypeFoldable<I>> TypeFoldable<I> for Option<T>
fn try_fold_with<F: FallibleTypeFolder<I>>( self, folder: &mut F, ) -> Result<Self, F::Error>
fn fold_with<F: TypeFolder<I>>(self, folder: &mut F) -> Self
Source§impl<I: Interner, T: TypeFoldable<I>> TypeFoldable<I> for Box<[T]>
impl<I: Interner, T: TypeFoldable<I>> TypeFoldable<I> for Box<[T]>
fn try_fold_with<F: FallibleTypeFolder<I>>( self, folder: &mut F, ) -> Result<Self, F::Error>
fn fold_with<F: TypeFolder<I>>(self, folder: &mut F) -> Self
Source§impl<I: Interner, T: TypeFoldable<I>> TypeFoldable<I> for Box<T>
impl<I: Interner, T: TypeFoldable<I>> TypeFoldable<I> for Box<T>
fn try_fold_with<F: FallibleTypeFolder<I>>( self, folder: &mut F, ) -> Result<Self, F::Error>
fn fold_with<F: TypeFolder<I>>(self, folder: &mut F) -> Self
Source§impl<I: Interner, T: TypeFoldable<I>> TypeFoldable<I> for Arc<T>
impl<I: Interner, T: TypeFoldable<I>> TypeFoldable<I> for Arc<T>
fn try_fold_with<F: FallibleTypeFolder<I>>( self, folder: &mut F, ) -> Result<Self, F::Error>
fn fold_with<F: TypeFolder<I>>(self, folder: &mut F) -> Self
Source§impl<I: Interner, T: TypeFoldable<I>> TypeFoldable<I> for Vec<T>
impl<I: Interner, T: TypeFoldable<I>> TypeFoldable<I> for Vec<T>
fn try_fold_with<F: FallibleTypeFolder<I>>( self, folder: &mut F, ) -> Result<Self, F::Error>
fn fold_with<F: TypeFolder<I>>(self, folder: &mut F) -> Self
Source§impl<I: Interner, T: TypeFoldable<I>> TypeFoldable<I> for ThinVec<T>
impl<I: Interner, T: TypeFoldable<I>> TypeFoldable<I> for ThinVec<T>
fn try_fold_with<F: FallibleTypeFolder<I>>( self, folder: &mut F, ) -> Result<Self, F::Error>
fn fold_with<F: TypeFolder<I>>(self, folder: &mut F) -> Self
Source§impl<I: Interner, T: TypeFoldable<I>, E: TypeFoldable<I>> TypeFoldable<I> for Result<T, E>
impl<I: Interner, T: TypeFoldable<I>, E: TypeFoldable<I>> TypeFoldable<I> for Result<T, E>
fn try_fold_with<F: FallibleTypeFolder<I>>( self, folder: &mut F, ) -> Result<Self, F::Error>
fn fold_with<F: TypeFolder<I>>(self, folder: &mut F) -> Self
Source§impl<I: Interner, T: TypeFoldable<I>, Ix: Idx> TypeFoldable<I> for IndexVec<Ix, T>
impl<I: Interner, T: TypeFoldable<I>, Ix: Idx> TypeFoldable<I> for IndexVec<Ix, T>
fn try_fold_with<F: FallibleTypeFolder<I>>( self, folder: &mut F, ) -> Result<Self, F::Error>
fn fold_with<F: TypeFolder<I>>(self, folder: &mut F) -> Self
Source§impl<I: Interner, T: TypeFoldable<I>, U: TypeFoldable<I>> TypeFoldable<I> for (T, U)
impl<I: Interner, T: TypeFoldable<I>, U: TypeFoldable<I>> TypeFoldable<I> for (T, U)
fn try_fold_with<F: FallibleTypeFolder<I>>( self, folder: &mut F, ) -> Result<(T, U), F::Error>
fn fold_with<F: TypeFolder<I>>(self, folder: &mut F) -> Self
Implementors§
impl<I: Interner, T> !TypeFoldable<I> for EarlyBinder<I, T>
nightly only.For early binders, you should first call instantiate before using any visitors.