Trait rustc_middle::ty::fold::TypeFoldable
source · [−]pub trait TypeFoldable<'tcx>: TypeVisitable<'tcx> {
fn try_fold_with<F: FallibleTypeFolder<'tcx>>(
self,
folder: &mut F
) -> Result<Self, F::Error>;
fn fold_with<F: TypeFolder<'tcx>>(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
.
Required Methods
sourcefn try_fold_with<F: FallibleTypeFolder<'tcx>>(
self,
folder: &mut F
) -> Result<Self, F::Error>
fn try_fold_with<F: FallibleTypeFolder<'tcx>>(
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 method
calls a folder method specifically for that type (such as
F::try_fold_ty
). This is where control transfers from TypeFoldable
to TypeFolder
.
Provided Methods
sourcefn fold_with<F: TypeFolder<'tcx>>(self, folder: &mut F) -> Self
fn fold_with<F: TypeFolder<'tcx>>(self, folder: &mut F) -> Self
A convenient alternative to try_fold_with
for use with infallible
folders. Do not override this method, to ensure coherence with
try_fold_with
.
Implementations on Foreign Types
sourceimpl<'tcx> TypeFoldable<'tcx> for Movability
impl<'tcx> TypeFoldable<'tcx> for Movability
fn try_fold_with<F: FallibleTypeFolder<'tcx>>(
self,
_: &mut F
) -> Result<Movability, F::Error>
sourceimpl<'tcx> TypeFoldable<'tcx> for GeneratorKind
impl<'tcx> TypeFoldable<'tcx> for GeneratorKind
fn try_fold_with<F: FallibleTypeFolder<'tcx>>(
self,
_: &mut F
) -> Result<GeneratorKind, F::Error>
sourceimpl<'tcx> TypeFoldable<'tcx> for &'tcx [InlineAsmTemplatePiece]
impl<'tcx> TypeFoldable<'tcx> for &'tcx [InlineAsmTemplatePiece]
fn try_fold_with<F: FallibleTypeFolder<'tcx>>(
self,
_folder: &mut F
) -> Result<Self, F::Error>
sourceimpl<'tcx> TypeFoldable<'tcx> for &'tcx [Span]
impl<'tcx> TypeFoldable<'tcx> for &'tcx [Span]
fn try_fold_with<F: FallibleTypeFolder<'tcx>>(
self,
_folder: &mut F
) -> Result<Self, F::Error>
sourceimpl<'tcx, R: Idx, C: Idx> TypeFoldable<'tcx> for BitMatrix<R, C>
impl<'tcx, R: Idx, C: Idx> TypeFoldable<'tcx> for BitMatrix<R, C>
fn try_fold_with<F: FallibleTypeFolder<'tcx>>(
self,
_: &mut F
) -> Result<Self, F::Error>
sourceimpl<'tcx> TypeFoldable<'tcx> for ()
impl<'tcx> TypeFoldable<'tcx> for ()
fn try_fold_with<F: FallibleTypeFolder<'tcx>>(
self,
_: &mut F
) -> Result<(), F::Error>
sourceimpl<'tcx> TypeFoldable<'tcx> for bool
impl<'tcx> TypeFoldable<'tcx> for bool
fn try_fold_with<F: FallibleTypeFolder<'tcx>>(
self,
_: &mut F
) -> Result<bool, F::Error>
sourceimpl<'tcx> TypeFoldable<'tcx> for usize
impl<'tcx> TypeFoldable<'tcx> for usize
fn try_fold_with<F: FallibleTypeFolder<'tcx>>(
self,
_: &mut F
) -> Result<usize, F::Error>
sourceimpl<'tcx> TypeFoldable<'tcx> for VariantIdx
impl<'tcx> TypeFoldable<'tcx> for VariantIdx
fn try_fold_with<F: FallibleTypeFolder<'tcx>>(
self,
_: &mut F
) -> Result<VariantIdx, F::Error>
sourceimpl<'tcx> TypeFoldable<'tcx> for u32
impl<'tcx> TypeFoldable<'tcx> for u32
fn try_fold_with<F: FallibleTypeFolder<'tcx>>(
self,
_: &mut F
) -> Result<u32, F::Error>
sourceimpl<'tcx> TypeFoldable<'tcx> for u64
impl<'tcx> TypeFoldable<'tcx> for u64
fn try_fold_with<F: FallibleTypeFolder<'tcx>>(
self,
_: &mut F
) -> Result<u64, F::Error>
sourceimpl<'tcx> TypeFoldable<'tcx> for String
impl<'tcx> TypeFoldable<'tcx> for String
fn try_fold_with<F: FallibleTypeFolder<'tcx>>(
self,
_: &mut F
) -> Result<String, F::Error>
sourceimpl<'tcx> TypeFoldable<'tcx> for InlineAsmOptions
impl<'tcx> TypeFoldable<'tcx> for InlineAsmOptions
fn try_fold_with<F: FallibleTypeFolder<'tcx>>(
self,
_: &mut F
) -> Result<InlineAsmOptions, F::Error>
sourceimpl<'tcx> TypeFoldable<'tcx> for InlineAsmTemplatePiece
impl<'tcx> TypeFoldable<'tcx> for InlineAsmTemplatePiece
fn try_fold_with<F: FallibleTypeFolder<'tcx>>(
self,
_: &mut F
) -> Result<InlineAsmTemplatePiece, F::Error>
sourceimpl<'tcx> TypeFoldable<'tcx> for NodeId
impl<'tcx> TypeFoldable<'tcx> for NodeId
fn try_fold_with<F: FallibleTypeFolder<'tcx>>(
self,
_: &mut F
) -> Result<NodeId, F::Error>
sourceimpl<'tcx> TypeFoldable<'tcx> for Symbol
impl<'tcx> TypeFoldable<'tcx> for Symbol
fn try_fold_with<F: FallibleTypeFolder<'tcx>>(
self,
_: &mut F
) -> Result<Symbol, F::Error>
sourceimpl<'tcx> TypeFoldable<'tcx> for Res
impl<'tcx> TypeFoldable<'tcx> for Res
fn try_fold_with<F: FallibleTypeFolder<'tcx>>(
self,
_: &mut F
) -> Result<Res, F::Error>
sourceimpl<'tcx> TypeFoldable<'tcx> for DefId
impl<'tcx> TypeFoldable<'tcx> for DefId
fn try_fold_with<F: FallibleTypeFolder<'tcx>>(
self,
_: &mut F
) -> Result<DefId, F::Error>
sourceimpl<'tcx> TypeFoldable<'tcx> for LocalDefId
impl<'tcx> TypeFoldable<'tcx> for LocalDefId
fn try_fold_with<F: FallibleTypeFolder<'tcx>>(
self,
_: &mut F
) -> Result<LocalDefId, F::Error>
sourceimpl<'tcx> TypeFoldable<'tcx> for HirId
impl<'tcx> TypeFoldable<'tcx> for HirId
fn try_fold_with<F: FallibleTypeFolder<'tcx>>(
self,
_: &mut F
) -> Result<HirId, F::Error>
sourceimpl<'tcx> TypeFoldable<'tcx> for MatchSource
impl<'tcx> TypeFoldable<'tcx> for MatchSource
fn try_fold_with<F: FallibleTypeFolder<'tcx>>(
self,
_: &mut F
) -> Result<MatchSource, F::Error>
sourceimpl<'tcx> TypeFoldable<'tcx> for Unsafety
impl<'tcx> TypeFoldable<'tcx> for Unsafety
fn try_fold_with<F: FallibleTypeFolder<'tcx>>(
self,
_: &mut F
) -> Result<Unsafety, F::Error>
sourceimpl<'tcx> TypeFoldable<'tcx> for InlineAsmRegOrRegClass
impl<'tcx> TypeFoldable<'tcx> for InlineAsmRegOrRegClass
fn try_fold_with<F: FallibleTypeFolder<'tcx>>(
self,
_: &mut F
) -> Result<InlineAsmRegOrRegClass, F::Error>
sourceimpl<'tcx> TypeFoldable<'tcx> for Abi
impl<'tcx> TypeFoldable<'tcx> for Abi
fn try_fold_with<F: FallibleTypeFolder<'tcx>>(
self,
_: &mut F
) -> Result<Abi, F::Error>
sourceimpl<'tcx> TypeFoldable<'tcx> for Span
impl<'tcx> TypeFoldable<'tcx> for Span
fn try_fold_with<F: FallibleTypeFolder<'tcx>>(
self,
_: &mut F
) -> Result<Span, F::Error>
sourceimpl<'tcx> TypeFoldable<'tcx> for ErrorGuaranteed
impl<'tcx> TypeFoldable<'tcx> for ErrorGuaranteed
fn try_fold_with<F: FallibleTypeFolder<'tcx>>(
self,
_: &mut F
) -> Result<ErrorGuaranteed, F::Error>
sourceimpl<'tcx> TypeFoldable<'tcx> for Size
impl<'tcx> TypeFoldable<'tcx> for Size
fn try_fold_with<F: FallibleTypeFolder<'tcx>>(
self,
_: &mut F
) -> Result<Size, F::Error>
sourceimpl<'tcx, T: TypeFoldable<'tcx>, U: TypeFoldable<'tcx>> TypeFoldable<'tcx> for (T, U)
impl<'tcx, T: TypeFoldable<'tcx>, U: TypeFoldable<'tcx>> TypeFoldable<'tcx> for (T, U)
fn try_fold_with<F: FallibleTypeFolder<'tcx>>(
self,
folder: &mut F
) -> Result<(T, U), F::Error>
sourceimpl<'tcx, A: TypeFoldable<'tcx>, B: TypeFoldable<'tcx>, C: TypeFoldable<'tcx>> TypeFoldable<'tcx> for (A, B, C)
impl<'tcx, A: TypeFoldable<'tcx>, B: TypeFoldable<'tcx>, C: TypeFoldable<'tcx>> TypeFoldable<'tcx> for (A, B, C)
fn try_fold_with<F: FallibleTypeFolder<'tcx>>(
self,
folder: &mut F
) -> Result<(A, B, C), F::Error>
sourceimpl<'tcx, T> TypeFoldable<'tcx> for Option<T>where
T: TypeFoldable<'tcx>,
impl<'tcx, T> TypeFoldable<'tcx> for Option<T>where
T: TypeFoldable<'tcx>,
fn try_fold_with<V: FallibleTypeFolder<'tcx>>(
self,
folder: &mut V
) -> Result<Self, V::Error>
sourceimpl<'tcx, T, E> TypeFoldable<'tcx> for Result<T, E>where
T: TypeFoldable<'tcx>,
E: TypeFoldable<'tcx>,
impl<'tcx, T, E> TypeFoldable<'tcx> for Result<T, E>where
T: TypeFoldable<'tcx>,
E: TypeFoldable<'tcx>,
fn try_fold_with<V: FallibleTypeFolder<'tcx>>(
self,
folder: &mut V
) -> Result<Self, V::Error>
sourceimpl<'tcx, T: TypeFoldable<'tcx>> TypeFoldable<'tcx> for Rc<T>
impl<'tcx, T: TypeFoldable<'tcx>> TypeFoldable<'tcx> for Rc<T>
fn try_fold_with<F: FallibleTypeFolder<'tcx>>(
self,
folder: &mut F
) -> Result<Self, F::Error>
sourceimpl<'tcx, T: TypeFoldable<'tcx>> TypeFoldable<'tcx> for Arc<T>
impl<'tcx, T: TypeFoldable<'tcx>> TypeFoldable<'tcx> for Arc<T>
fn try_fold_with<F: FallibleTypeFolder<'tcx>>(
self,
folder: &mut F
) -> Result<Self, F::Error>
sourceimpl<'tcx, T: TypeFoldable<'tcx>> TypeFoldable<'tcx> for Box<T>
impl<'tcx, T: TypeFoldable<'tcx>> TypeFoldable<'tcx> for Box<T>
fn try_fold_with<F: FallibleTypeFolder<'tcx>>(
self,
folder: &mut F
) -> Result<Self, F::Error>
sourceimpl<'tcx, T: TypeFoldable<'tcx>> TypeFoldable<'tcx> for Vec<T>
impl<'tcx, T: TypeFoldable<'tcx>> TypeFoldable<'tcx> for Vec<T>
fn try_fold_with<F: FallibleTypeFolder<'tcx>>(
self,
folder: &mut F
) -> Result<Self, F::Error>
sourceimpl<'tcx, T: TypeFoldable<'tcx>> TypeFoldable<'tcx> for Box<[T]>
impl<'tcx, T: TypeFoldable<'tcx>> TypeFoldable<'tcx> for Box<[T]>
fn try_fold_with<F: FallibleTypeFolder<'tcx>>(
self,
folder: &mut F
) -> Result<Self, F::Error>
sourceimpl<'tcx, T: TypeFoldable<'tcx>, I: Idx> TypeFoldable<'tcx> for IndexVec<I, T>
impl<'tcx, T: TypeFoldable<'tcx>, I: Idx> TypeFoldable<'tcx> for IndexVec<I, T>
fn try_fold_with<F: FallibleTypeFolder<'tcx>>(
self,
folder: &mut F
) -> Result<Self, F::Error>
Implementors
impl<'tcx> TypeFoldable<'tcx> for &'tcx List<Predicate<'tcx>>
impl<'tcx> TypeFoldable<'tcx> for &'tcx List<Ty<'tcx>>
impl<'tcx> TypeFoldable<'tcx> for &'tcx List<Binder<'tcx, ExistentialPredicate<'tcx>>>
impl<'tcx> TypeFoldable<'tcx> for &'tcx List<PlaceElem<'tcx>>
impl<'tcx> TypeFoldable<'tcx> for &'tcx List<ProjectionKind>
impl<'tcx> TypeFoldable<'tcx> for PlaceBase
impl<'tcx> TypeFoldable<'tcx> for ProjectionKind
impl<'tcx> TypeFoldable<'tcx> for CanonicalTyVarKind
impl<'tcx> TypeFoldable<'tcx> for CanonicalVarKind<'tcx>
impl<'tcx> TypeFoldable<'tcx> for Certainty
impl<'tcx> TypeFoldable<'tcx> for CoverageKind
impl<'tcx> TypeFoldable<'tcx> for Op
impl<'tcx> TypeFoldable<'tcx> for BindingForm<'tcx>
impl<'tcx> TypeFoldable<'tcx> for ConstantKind<'tcx>
impl<'tcx> TypeFoldable<'tcx> for LocalInfo<'tcx>
impl<'tcx> TypeFoldable<'tcx> for Mutability
impl<'tcx> TypeFoldable<'tcx> for VarDebugInfoContents<'tcx>
impl<'tcx> TypeFoldable<'tcx> for ErrorHandled
impl<'tcx> TypeFoldable<'tcx> for Scalar
impl<'tcx> TypeFoldable<'tcx> for AggregateKind<'tcx>
impl<'tcx> TypeFoldable<'tcx> for BinOp
impl<'tcx> TypeFoldable<'tcx> for rustc_middle::mir::syntax::BorrowKind
impl<'tcx> TypeFoldable<'tcx> for CastKind
impl<'tcx> TypeFoldable<'tcx> for FakeReadCause
impl<'tcx> TypeFoldable<'tcx> for InlineAsmOperand<'tcx>
impl<'tcx> TypeFoldable<'tcx> for MirPhase
impl<'tcx> TypeFoldable<'tcx> for NonDivergingIntrinsic<'tcx>
impl<'tcx> TypeFoldable<'tcx> for NullOp
impl<'tcx> TypeFoldable<'tcx> for Operand<'tcx>
impl<'tcx> TypeFoldable<'tcx> for RetagKind
impl<'tcx> TypeFoldable<'tcx> for Rvalue<'tcx>
impl<'tcx> TypeFoldable<'tcx> for StatementKind<'tcx>
impl<'tcx> TypeFoldable<'tcx> for TerminatorKind<'tcx>
impl<'tcx> TypeFoldable<'tcx> for UnOp
impl<'tcx> TypeFoldable<'tcx> for Reveal
impl<'tcx> TypeFoldable<'tcx> for SelectionError<'tcx>
impl<'tcx> TypeFoldable<'tcx> for OutlivesBound<'tcx>
impl<'tcx> TypeFoldable<'tcx> for OverflowError
impl<'tcx> TypeFoldable<'tcx> for SelectionCandidate<'tcx>
impl<'tcx> TypeFoldable<'tcx> for NotConstEvaluatable
impl<'tcx> TypeFoldable<'tcx> for Adjust<'tcx>
impl<'tcx> TypeFoldable<'tcx> for AutoBorrow<'tcx>
impl<'tcx> TypeFoldable<'tcx> for AutoBorrowMutability
impl<'tcx> TypeFoldable<'tcx> for PointerCast
impl<'tcx> TypeFoldable<'tcx> for AdtKind
impl<'tcx> TypeFoldable<'tcx> for AssocKind
impl<'tcx> TypeFoldable<'tcx> for BindingMode
impl<'tcx> TypeFoldable<'tcx> for rustc_middle::ty::closure::BorrowKind
impl<'tcx> TypeFoldable<'tcx> for ClosureKind
impl<'tcx> TypeFoldable<'tcx> for UpvarCapture
impl<'tcx> TypeFoldable<'tcx> for ConstKind<'tcx>
impl<'tcx> TypeFoldable<'tcx> for InferConst<'tcx>
impl<'tcx> TypeFoldable<'tcx> for ValTree<'tcx>
impl<'tcx> TypeFoldable<'tcx> for UserType<'tcx>
impl<'tcx> TypeFoldable<'tcx> for BoundConstness
impl<'tcx> TypeFoldable<'tcx> for FloatTy
impl<'tcx> TypeFoldable<'tcx> for ImplPolarity
impl<'tcx> TypeFoldable<'tcx> for ImplSubject<'tcx>
impl<'tcx> TypeFoldable<'tcx> for InferTy
impl<'tcx> TypeFoldable<'tcx> for IntVarValue
impl<'tcx> TypeFoldable<'tcx> for PredicateKind<'tcx>
impl<'tcx> TypeFoldable<'tcx> for TermKind<'tcx>
impl<'tcx> TypeFoldable<'tcx> for Variance
impl<'tcx> TypeFoldable<'tcx> for TypeError<'tcx>
impl<'tcx> TypeFoldable<'tcx> for InstanceDef<'tcx>
impl<'tcx> TypeFoldable<'tcx> for BoundRegionKind
impl<'tcx> TypeFoldable<'tcx> for ExistentialPredicate<'tcx>
impl<'tcx> TypeFoldable<'tcx> for rustc_middle::hir::place::Place<'tcx>
impl<'tcx> TypeFoldable<'tcx> for PlaceWithHirId<'tcx>
impl<'tcx> TypeFoldable<'tcx> for Projection<'tcx>
impl<'tcx> TypeFoldable<'tcx> for CanonicalVarInfo<'tcx>
impl<'tcx> TypeFoldable<'tcx> for CanonicalVarValues<'tcx>
impl<'tcx> TypeFoldable<'tcx> for QueryRegionConstraints<'tcx>
impl<'tcx> TypeFoldable<'tcx> for MemberConstraint<'tcx>
impl<'tcx> TypeFoldable<'tcx> for Scope
impl<'tcx> TypeFoldable<'tcx> for BasicBlocks<'tcx>
impl<'tcx> TypeFoldable<'tcx> for CodeRegion
impl<'tcx> TypeFoldable<'tcx> for CounterValueReference
impl<'tcx> TypeFoldable<'tcx> for ExpressionOperandId
impl<'tcx> TypeFoldable<'tcx> for InjectedExpressionId
impl<'tcx> TypeFoldable<'tcx> for InjectedExpressionIndex
impl<'tcx> TypeFoldable<'tcx> for MappedExpressionIndex
impl<'tcx> TypeFoldable<'tcx> for GraphIsCyclicCache
impl<'tcx> TypeFoldable<'tcx> for GlobalId<'tcx>
impl<'tcx> TypeFoldable<'tcx> for PredecessorCache
impl<'tcx> TypeFoldable<'tcx> for GeneratorLayout<'tcx>
impl<'tcx> TypeFoldable<'tcx> for GeneratorSavedLocal
impl<'tcx> TypeFoldable<'tcx> for BasicBlock
impl<'tcx> TypeFoldable<'tcx> for BasicBlockData<'tcx>
impl<'tcx> TypeFoldable<'tcx> for BlockTailInfo
impl<'tcx> TypeFoldable<'tcx> for Body<'tcx>
impl<'tcx> TypeFoldable<'tcx> for Constant<'tcx>
impl<'tcx> TypeFoldable<'tcx> for Field
impl<'tcx> TypeFoldable<'tcx> for GeneratorInfo<'tcx>
impl<'tcx> TypeFoldable<'tcx> for Local
impl<'tcx> TypeFoldable<'tcx> for LocalDecl<'tcx>
impl<'tcx> TypeFoldable<'tcx> for MirSource<'tcx>
impl<'tcx> TypeFoldable<'tcx> for Promoted
impl<'tcx> TypeFoldable<'tcx> for SourceInfo
impl<'tcx> TypeFoldable<'tcx> for SourceScope
impl<'tcx> TypeFoldable<'tcx> for SourceScopeData<'tcx>
impl<'tcx> TypeFoldable<'tcx> for SourceScopeLocalData
impl<'tcx> TypeFoldable<'tcx> for Statement<'tcx>
impl<'tcx> TypeFoldable<'tcx> for UserTypeProjection
impl<'tcx> TypeFoldable<'tcx> for UserTypeProjections
impl<'tcx> TypeFoldable<'tcx> for VarDebugInfo<'tcx>
impl<'tcx> TypeFoldable<'tcx> for SwitchSourceCache
impl<'tcx> TypeFoldable<'tcx> for CopyNonOverlapping<'tcx>
impl<'tcx> TypeFoldable<'tcx> for Coverage
impl<'tcx> TypeFoldable<'tcx> for rustc_middle::mir::syntax::Place<'tcx>
impl<'tcx> TypeFoldable<'tcx> for PlaceTy<'tcx>
impl<'tcx> TypeFoldable<'tcx> for SwitchTargets
impl<'tcx> TypeFoldable<'tcx> for Terminator<'tcx>
impl<'tcx> TypeFoldable<'tcx> for PostorderCache
impl<'tcx> TypeFoldable<'tcx> for LocalVarId
impl<'tcx> TypeFoldable<'tcx> for ChalkEnvironmentAndGoal<'tcx>
impl<'tcx> TypeFoldable<'tcx> for DropckOutlivesResult<'tcx>
impl<'tcx> TypeFoldable<'tcx> for NormalizationResult<'tcx>
impl<'tcx> TypeFoldable<'tcx> for AscribeUserType<'tcx>
impl<'tcx> TypeFoldable<'tcx> for Eq<'tcx>
impl<'tcx> TypeFoldable<'tcx> for ProvePredicate<'tcx>
impl<'tcx> TypeFoldable<'tcx> for Subtype<'tcx>
impl<'tcx> TypeFoldable<'tcx> for IfExpressionCause<'tcx>
impl<'tcx> TypeFoldable<'tcx> for ImplSourceDiscriminantKindData
impl<'tcx> TypeFoldable<'tcx> for ImplSourcePointeeData
impl<'tcx> TypeFoldable<'tcx> for Adjustment<'tcx>
impl<'tcx> TypeFoldable<'tcx> for OverloadedDeref<'tcx>
impl<'tcx> TypeFoldable<'tcx> for AdtDef<'tcx>
AdtDefs are basically the same as a DefId.