Explicit TypeVisitable implementations
This commit is contained in:
parent
9ffdc2de8c
commit
f66c06f7f2
@ -2,6 +2,7 @@
|
|||||||
use crate::traits::project::Normalized;
|
use crate::traits::project::Normalized;
|
||||||
use rustc_middle::ty;
|
use rustc_middle::ty;
|
||||||
use rustc_middle::ty::fold::{FallibleTypeFolder, TypeFoldable, TypeVisitor};
|
use rustc_middle::ty::fold::{FallibleTypeFolder, TypeFoldable, TypeVisitor};
|
||||||
|
use rustc_middle::ty::visit::TypeVisitable;
|
||||||
|
|
||||||
use std::fmt;
|
use std::fmt;
|
||||||
use std::ops::ControlFlow;
|
use std::ops::ControlFlow;
|
||||||
@ -68,7 +69,9 @@ fn try_fold_with<F: FallibleTypeFolder<'tcx>>(self, folder: &mut F) -> Result<Se
|
|||||||
param_env: self.param_env.try_fold_with(folder)?,
|
param_env: self.param_env.try_fold_with(folder)?,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'tcx, O: TypeVisitable<'tcx>> TypeVisitable<'tcx> for traits::Obligation<'tcx, O> {
|
||||||
fn visit_with<V: TypeVisitor<'tcx>>(&self, visitor: &mut V) -> ControlFlow<V::BreakTy> {
|
fn visit_with<V: TypeVisitor<'tcx>>(&self, visitor: &mut V) -> ControlFlow<V::BreakTy> {
|
||||||
self.predicate.visit_with(visitor)?;
|
self.predicate.visit_with(visitor)?;
|
||||||
self.param_env.visit_with(visitor)
|
self.param_env.visit_with(visitor)
|
||||||
|
@ -11,6 +11,7 @@
|
|||||||
use crate::ty::fold::{FallibleTypeFolder, TypeFoldable, TypeSuperFoldable, TypeVisitor};
|
use crate::ty::fold::{FallibleTypeFolder, TypeFoldable, TypeSuperFoldable, TypeVisitor};
|
||||||
use crate::ty::print::{FmtPrinter, Printer};
|
use crate::ty::print::{FmtPrinter, Printer};
|
||||||
use crate::ty::subst::{GenericArg, InternalSubsts, Subst, SubstsRef};
|
use crate::ty::subst::{GenericArg, InternalSubsts, Subst, SubstsRef};
|
||||||
|
use crate::ty::visit::TypeVisitable;
|
||||||
use crate::ty::{self, List, Ty, TyCtxt};
|
use crate::ty::{self, List, Ty, TyCtxt};
|
||||||
use crate::ty::{AdtDef, InstanceDef, ScalarInt, UserTypeAnnotationIndex};
|
use crate::ty::{AdtDef, InstanceDef, ScalarInt, UserTypeAnnotationIndex};
|
||||||
|
|
||||||
@ -68,6 +69,7 @@
|
|||||||
|
|
||||||
pub mod traversal;
|
pub mod traversal;
|
||||||
mod type_foldable;
|
mod type_foldable;
|
||||||
|
mod type_visitable;
|
||||||
pub mod visit;
|
pub mod visit;
|
||||||
|
|
||||||
pub use self::generic_graph::graphviz_safe_def_name;
|
pub use self::generic_graph::graphviz_safe_def_name;
|
||||||
@ -2650,7 +2652,9 @@ fn try_fold_with<F: FallibleTypeFolder<'tcx>>(self, folder: &mut F) -> Result<Se
|
|||||||
projs: self.projs.try_fold_with(folder)?,
|
projs: self.projs.try_fold_with(folder)?,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'tcx> TypeVisitable<'tcx> for UserTypeProjection {
|
||||||
fn visit_with<Vs: TypeVisitor<'tcx>>(&self, visitor: &mut Vs) -> ControlFlow<Vs::BreakTy> {
|
fn visit_with<Vs: TypeVisitor<'tcx>>(&self, visitor: &mut Vs) -> ControlFlow<Vs::BreakTy> {
|
||||||
self.base.visit_with(visitor)
|
self.base.visit_with(visitor)
|
||||||
// Note: there's nothing in `self.proj` to visit.
|
// Note: there's nothing in `self.proj` to visit.
|
||||||
|
@ -89,65 +89,12 @@ fn try_fold_with<F: FallibleTypeFolder<'tcx>>(self, folder: &mut F) -> Result<Se
|
|||||||
};
|
};
|
||||||
Ok(Terminator { source_info: self.source_info, kind })
|
Ok(Terminator { source_info: self.source_info, kind })
|
||||||
}
|
}
|
||||||
|
|
||||||
fn visit_with<V: TypeVisitor<'tcx>>(&self, visitor: &mut V) -> ControlFlow<V::BreakTy> {
|
|
||||||
use crate::mir::TerminatorKind::*;
|
|
||||||
|
|
||||||
match self.kind {
|
|
||||||
SwitchInt { ref discr, switch_ty, .. } => {
|
|
||||||
discr.visit_with(visitor)?;
|
|
||||||
switch_ty.visit_with(visitor)
|
|
||||||
}
|
|
||||||
Drop { ref place, .. } => place.visit_with(visitor),
|
|
||||||
DropAndReplace { ref place, ref value, .. } => {
|
|
||||||
place.visit_with(visitor)?;
|
|
||||||
value.visit_with(visitor)
|
|
||||||
}
|
|
||||||
Yield { ref value, .. } => value.visit_with(visitor),
|
|
||||||
Call { ref func, ref args, ref destination, .. } => {
|
|
||||||
destination.visit_with(visitor)?;
|
|
||||||
func.visit_with(visitor)?;
|
|
||||||
args.visit_with(visitor)
|
|
||||||
}
|
|
||||||
Assert { ref cond, ref msg, .. } => {
|
|
||||||
cond.visit_with(visitor)?;
|
|
||||||
use AssertKind::*;
|
|
||||||
match msg {
|
|
||||||
BoundsCheck { ref len, ref index } => {
|
|
||||||
len.visit_with(visitor)?;
|
|
||||||
index.visit_with(visitor)
|
|
||||||
}
|
|
||||||
Overflow(_, l, r) => {
|
|
||||||
l.visit_with(visitor)?;
|
|
||||||
r.visit_with(visitor)
|
|
||||||
}
|
|
||||||
OverflowNeg(op) | DivisionByZero(op) | RemainderByZero(op) => {
|
|
||||||
op.visit_with(visitor)
|
|
||||||
}
|
|
||||||
ResumedAfterReturn(_) | ResumedAfterPanic(_) => ControlFlow::CONTINUE,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
InlineAsm { ref operands, .. } => operands.visit_with(visitor),
|
|
||||||
Goto { .. }
|
|
||||||
| Resume
|
|
||||||
| Abort
|
|
||||||
| Return
|
|
||||||
| GeneratorDrop
|
|
||||||
| Unreachable
|
|
||||||
| FalseEdge { .. }
|
|
||||||
| FalseUnwind { .. } => ControlFlow::CONTINUE,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'tcx> TypeFoldable<'tcx> for GeneratorKind {
|
impl<'tcx> TypeFoldable<'tcx> for GeneratorKind {
|
||||||
fn try_fold_with<F: FallibleTypeFolder<'tcx>>(self, _: &mut F) -> Result<Self, F::Error> {
|
fn try_fold_with<F: FallibleTypeFolder<'tcx>>(self, _: &mut F) -> Result<Self, F::Error> {
|
||||||
Ok(self)
|
Ok(self)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn visit_with<V: TypeVisitor<'tcx>>(&self, _: &mut V) -> ControlFlow<V::BreakTy> {
|
|
||||||
ControlFlow::CONTINUE
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'tcx> TypeFoldable<'tcx> for Place<'tcx> {
|
impl<'tcx> TypeFoldable<'tcx> for Place<'tcx> {
|
||||||
@ -157,21 +104,12 @@ fn try_fold_with<F: FallibleTypeFolder<'tcx>>(self, folder: &mut F) -> Result<Se
|
|||||||
projection: self.projection.try_fold_with(folder)?,
|
projection: self.projection.try_fold_with(folder)?,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
fn visit_with<V: TypeVisitor<'tcx>>(&self, visitor: &mut V) -> ControlFlow<V::BreakTy> {
|
|
||||||
self.local.visit_with(visitor)?;
|
|
||||||
self.projection.visit_with(visitor)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'tcx> TypeFoldable<'tcx> for &'tcx ty::List<PlaceElem<'tcx>> {
|
impl<'tcx> TypeFoldable<'tcx> for &'tcx ty::List<PlaceElem<'tcx>> {
|
||||||
fn 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> {
|
||||||
ty::util::fold_list(self, folder, |tcx, v| tcx.intern_place_elems(v))
|
ty::util::fold_list(self, folder, |tcx, v| tcx.intern_place_elems(v))
|
||||||
}
|
}
|
||||||
|
|
||||||
fn visit_with<V: TypeVisitor<'tcx>>(&self, visitor: &mut V) -> ControlFlow<V::BreakTy> {
|
|
||||||
self.iter().try_for_each(|t| t.visit_with(visitor))
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'tcx> TypeFoldable<'tcx> for Rvalue<'tcx> {
|
impl<'tcx> TypeFoldable<'tcx> for Rvalue<'tcx> {
|
||||||
@ -224,55 +162,6 @@ fn try_fold_with<F: FallibleTypeFolder<'tcx>>(self, folder: &mut F) -> Result<Se
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
fn visit_with<V: TypeVisitor<'tcx>>(&self, visitor: &mut V) -> ControlFlow<V::BreakTy> {
|
|
||||||
use crate::mir::Rvalue::*;
|
|
||||||
match *self {
|
|
||||||
Use(ref op) => op.visit_with(visitor),
|
|
||||||
Repeat(ref op, _) => op.visit_with(visitor),
|
|
||||||
ThreadLocalRef(did) => did.visit_with(visitor),
|
|
||||||
Ref(region, _, ref place) => {
|
|
||||||
region.visit_with(visitor)?;
|
|
||||||
place.visit_with(visitor)
|
|
||||||
}
|
|
||||||
AddressOf(_, ref place) => place.visit_with(visitor),
|
|
||||||
Len(ref place) => place.visit_with(visitor),
|
|
||||||
Cast(_, ref op, ty) => {
|
|
||||||
op.visit_with(visitor)?;
|
|
||||||
ty.visit_with(visitor)
|
|
||||||
}
|
|
||||||
BinaryOp(_, box (ref rhs, ref lhs)) | CheckedBinaryOp(_, box (ref rhs, ref lhs)) => {
|
|
||||||
rhs.visit_with(visitor)?;
|
|
||||||
lhs.visit_with(visitor)
|
|
||||||
}
|
|
||||||
UnaryOp(_, ref val) => val.visit_with(visitor),
|
|
||||||
Discriminant(ref place) => place.visit_with(visitor),
|
|
||||||
NullaryOp(_, ty) => ty.visit_with(visitor),
|
|
||||||
Aggregate(ref kind, ref fields) => {
|
|
||||||
match **kind {
|
|
||||||
AggregateKind::Array(ty) => {
|
|
||||||
ty.visit_with(visitor)?;
|
|
||||||
}
|
|
||||||
AggregateKind::Tuple => {}
|
|
||||||
AggregateKind::Adt(_, _, substs, user_ty, _) => {
|
|
||||||
substs.visit_with(visitor)?;
|
|
||||||
user_ty.visit_with(visitor)?;
|
|
||||||
}
|
|
||||||
AggregateKind::Closure(_, substs) => {
|
|
||||||
substs.visit_with(visitor)?;
|
|
||||||
}
|
|
||||||
AggregateKind::Generator(_, substs, _) => {
|
|
||||||
substs.visit_with(visitor)?;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
fields.visit_with(visitor)
|
|
||||||
}
|
|
||||||
ShallowInitBox(ref op, ty) => {
|
|
||||||
op.visit_with(visitor)?;
|
|
||||||
ty.visit_with(visitor)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'tcx> TypeFoldable<'tcx> for Operand<'tcx> {
|
impl<'tcx> TypeFoldable<'tcx> for Operand<'tcx> {
|
||||||
@ -283,13 +172,6 @@ fn try_fold_with<F: FallibleTypeFolder<'tcx>>(self, folder: &mut F) -> Result<Se
|
|||||||
Operand::Constant(c) => Operand::Constant(c.try_fold_with(folder)?),
|
Operand::Constant(c) => Operand::Constant(c.try_fold_with(folder)?),
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
fn visit_with<V: TypeVisitor<'tcx>>(&self, visitor: &mut V) -> ControlFlow<V::BreakTy> {
|
|
||||||
match *self {
|
|
||||||
Operand::Copy(ref place) | Operand::Move(ref place) => place.visit_with(visitor),
|
|
||||||
Operand::Constant(ref c) => c.visit_with(visitor),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'tcx> TypeFoldable<'tcx> for PlaceElem<'tcx> {
|
impl<'tcx> TypeFoldable<'tcx> for PlaceElem<'tcx> {
|
||||||
@ -307,43 +189,24 @@ fn try_fold_with<F: FallibleTypeFolder<'tcx>>(self, folder: &mut F) -> Result<Se
|
|||||||
Subslice { from, to, from_end } => Subslice { from, to, from_end },
|
Subslice { from, to, from_end } => Subslice { from, to, from_end },
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
fn visit_with<Vs: TypeVisitor<'tcx>>(&self, visitor: &mut Vs) -> ControlFlow<Vs::BreakTy> {
|
|
||||||
use crate::mir::ProjectionElem::*;
|
|
||||||
|
|
||||||
match self {
|
|
||||||
Field(_, ty) => ty.visit_with(visitor),
|
|
||||||
Index(v) => v.visit_with(visitor),
|
|
||||||
_ => ControlFlow::CONTINUE,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'tcx> TypeFoldable<'tcx> for Field {
|
impl<'tcx> TypeFoldable<'tcx> for Field {
|
||||||
fn try_fold_with<F: FallibleTypeFolder<'tcx>>(self, _: &mut F) -> Result<Self, F::Error> {
|
fn try_fold_with<F: FallibleTypeFolder<'tcx>>(self, _: &mut F) -> Result<Self, F::Error> {
|
||||||
Ok(self)
|
Ok(self)
|
||||||
}
|
}
|
||||||
fn visit_with<V: TypeVisitor<'tcx>>(&self, _: &mut V) -> ControlFlow<V::BreakTy> {
|
|
||||||
ControlFlow::CONTINUE
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'tcx> TypeFoldable<'tcx> for GeneratorSavedLocal {
|
impl<'tcx> TypeFoldable<'tcx> for GeneratorSavedLocal {
|
||||||
fn try_fold_with<F: FallibleTypeFolder<'tcx>>(self, _: &mut F) -> Result<Self, F::Error> {
|
fn try_fold_with<F: FallibleTypeFolder<'tcx>>(self, _: &mut F) -> Result<Self, F::Error> {
|
||||||
Ok(self)
|
Ok(self)
|
||||||
}
|
}
|
||||||
fn visit_with<V: TypeVisitor<'tcx>>(&self, _: &mut V) -> ControlFlow<V::BreakTy> {
|
|
||||||
ControlFlow::CONTINUE
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'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> {
|
fn try_fold_with<F: FallibleTypeFolder<'tcx>>(self, _: &mut F) -> Result<Self, F::Error> {
|
||||||
Ok(self)
|
Ok(self)
|
||||||
}
|
}
|
||||||
fn visit_with<V: TypeVisitor<'tcx>>(&self, _: &mut V) -> ControlFlow<V::BreakTy> {
|
|
||||||
ControlFlow::CONTINUE
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'tcx> TypeFoldable<'tcx> for Constant<'tcx> {
|
impl<'tcx> TypeFoldable<'tcx> for Constant<'tcx> {
|
||||||
@ -354,10 +217,6 @@ fn try_fold_with<F: FallibleTypeFolder<'tcx>>(self, folder: &mut F) -> Result<Se
|
|||||||
literal: self.literal.try_fold_with(folder)?,
|
literal: self.literal.try_fold_with(folder)?,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
fn visit_with<V: TypeVisitor<'tcx>>(&self, visitor: &mut V) -> ControlFlow<V::BreakTy> {
|
|
||||||
self.literal.visit_with(visitor)?;
|
|
||||||
self.user_ty.visit_with(visitor)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'tcx> TypeFoldable<'tcx> for ConstantKind<'tcx> {
|
impl<'tcx> TypeFoldable<'tcx> for ConstantKind<'tcx> {
|
||||||
@ -365,10 +224,6 @@ impl<'tcx> TypeFoldable<'tcx> for ConstantKind<'tcx> {
|
|||||||
fn 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> {
|
||||||
folder.try_fold_mir_const(self)
|
folder.try_fold_mir_const(self)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn visit_with<V: TypeVisitor<'tcx>>(&self, visitor: &mut V) -> ControlFlow<V::BreakTy> {
|
|
||||||
visitor.visit_mir_const(*self)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'tcx> TypeSuperFoldable<'tcx> for ConstantKind<'tcx> {
|
impl<'tcx> TypeSuperFoldable<'tcx> for ConstantKind<'tcx> {
|
||||||
@ -381,11 +236,4 @@ fn try_super_fold_with<F: FallibleTypeFolder<'tcx>>(
|
|||||||
ConstantKind::Val(v, t) => Ok(ConstantKind::Val(v, t.try_fold_with(folder)?)),
|
ConstantKind::Val(v, t) => Ok(ConstantKind::Val(v, t.try_fold_with(folder)?)),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn super_visit_with<V: TypeVisitor<'tcx>>(&self, visitor: &mut V) -> ControlFlow<V::BreakTy> {
|
|
||||||
match *self {
|
|
||||||
ConstantKind::Ty(c) => c.visit_with(visitor),
|
|
||||||
ConstantKind::Val(_, t) => t.visit_with(visitor),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
186
compiler/rustc_middle/src/mir/type_visitable.rs
Normal file
186
compiler/rustc_middle/src/mir/type_visitable.rs
Normal file
@ -0,0 +1,186 @@
|
|||||||
|
//! `TypeVisitable` implementations for MIR types
|
||||||
|
|
||||||
|
use super::*;
|
||||||
|
use crate::ty;
|
||||||
|
|
||||||
|
impl<'tcx> TypeVisitable<'tcx> for Terminator<'tcx> {
|
||||||
|
fn visit_with<V: TypeVisitor<'tcx>>(&self, visitor: &mut V) -> ControlFlow<V::BreakTy> {
|
||||||
|
use crate::mir::TerminatorKind::*;
|
||||||
|
|
||||||
|
match self.kind {
|
||||||
|
SwitchInt { ref discr, switch_ty, .. } => {
|
||||||
|
discr.visit_with(visitor)?;
|
||||||
|
switch_ty.visit_with(visitor)
|
||||||
|
}
|
||||||
|
Drop { ref place, .. } => place.visit_with(visitor),
|
||||||
|
DropAndReplace { ref place, ref value, .. } => {
|
||||||
|
place.visit_with(visitor)?;
|
||||||
|
value.visit_with(visitor)
|
||||||
|
}
|
||||||
|
Yield { ref value, .. } => value.visit_with(visitor),
|
||||||
|
Call { ref func, ref args, ref destination, .. } => {
|
||||||
|
destination.visit_with(visitor)?;
|
||||||
|
func.visit_with(visitor)?;
|
||||||
|
args.visit_with(visitor)
|
||||||
|
}
|
||||||
|
Assert { ref cond, ref msg, .. } => {
|
||||||
|
cond.visit_with(visitor)?;
|
||||||
|
use AssertKind::*;
|
||||||
|
match msg {
|
||||||
|
BoundsCheck { ref len, ref index } => {
|
||||||
|
len.visit_with(visitor)?;
|
||||||
|
index.visit_with(visitor)
|
||||||
|
}
|
||||||
|
Overflow(_, l, r) => {
|
||||||
|
l.visit_with(visitor)?;
|
||||||
|
r.visit_with(visitor)
|
||||||
|
}
|
||||||
|
OverflowNeg(op) | DivisionByZero(op) | RemainderByZero(op) => {
|
||||||
|
op.visit_with(visitor)
|
||||||
|
}
|
||||||
|
ResumedAfterReturn(_) | ResumedAfterPanic(_) => ControlFlow::CONTINUE,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
InlineAsm { ref operands, .. } => operands.visit_with(visitor),
|
||||||
|
Goto { .. }
|
||||||
|
| Resume
|
||||||
|
| Abort
|
||||||
|
| Return
|
||||||
|
| GeneratorDrop
|
||||||
|
| Unreachable
|
||||||
|
| FalseEdge { .. }
|
||||||
|
| FalseUnwind { .. } => ControlFlow::CONTINUE,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'tcx> TypeVisitable<'tcx> for GeneratorKind {
|
||||||
|
fn visit_with<V: TypeVisitor<'tcx>>(&self, _: &mut V) -> ControlFlow<V::BreakTy> {
|
||||||
|
ControlFlow::CONTINUE
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'tcx> TypeVisitable<'tcx> for Place<'tcx> {
|
||||||
|
fn visit_with<V: TypeVisitor<'tcx>>(&self, visitor: &mut V) -> ControlFlow<V::BreakTy> {
|
||||||
|
self.local.visit_with(visitor)?;
|
||||||
|
self.projection.visit_with(visitor)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'tcx> TypeVisitable<'tcx> for &'tcx ty::List<PlaceElem<'tcx>> {
|
||||||
|
fn visit_with<V: TypeVisitor<'tcx>>(&self, visitor: &mut V) -> ControlFlow<V::BreakTy> {
|
||||||
|
self.iter().try_for_each(|t| t.visit_with(visitor))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'tcx> TypeVisitable<'tcx> for Rvalue<'tcx> {
|
||||||
|
fn visit_with<V: TypeVisitor<'tcx>>(&self, visitor: &mut V) -> ControlFlow<V::BreakTy> {
|
||||||
|
use crate::mir::Rvalue::*;
|
||||||
|
match *self {
|
||||||
|
Use(ref op) => op.visit_with(visitor),
|
||||||
|
Repeat(ref op, _) => op.visit_with(visitor),
|
||||||
|
ThreadLocalRef(did) => did.visit_with(visitor),
|
||||||
|
Ref(region, _, ref place) => {
|
||||||
|
region.visit_with(visitor)?;
|
||||||
|
place.visit_with(visitor)
|
||||||
|
}
|
||||||
|
AddressOf(_, ref place) => place.visit_with(visitor),
|
||||||
|
Len(ref place) => place.visit_with(visitor),
|
||||||
|
Cast(_, ref op, ty) => {
|
||||||
|
op.visit_with(visitor)?;
|
||||||
|
ty.visit_with(visitor)
|
||||||
|
}
|
||||||
|
BinaryOp(_, box (ref rhs, ref lhs)) | CheckedBinaryOp(_, box (ref rhs, ref lhs)) => {
|
||||||
|
rhs.visit_with(visitor)?;
|
||||||
|
lhs.visit_with(visitor)
|
||||||
|
}
|
||||||
|
UnaryOp(_, ref val) => val.visit_with(visitor),
|
||||||
|
Discriminant(ref place) => place.visit_with(visitor),
|
||||||
|
NullaryOp(_, ty) => ty.visit_with(visitor),
|
||||||
|
Aggregate(ref kind, ref fields) => {
|
||||||
|
match **kind {
|
||||||
|
AggregateKind::Array(ty) => {
|
||||||
|
ty.visit_with(visitor)?;
|
||||||
|
}
|
||||||
|
AggregateKind::Tuple => {}
|
||||||
|
AggregateKind::Adt(_, _, substs, user_ty, _) => {
|
||||||
|
substs.visit_with(visitor)?;
|
||||||
|
user_ty.visit_with(visitor)?;
|
||||||
|
}
|
||||||
|
AggregateKind::Closure(_, substs) => {
|
||||||
|
substs.visit_with(visitor)?;
|
||||||
|
}
|
||||||
|
AggregateKind::Generator(_, substs, _) => {
|
||||||
|
substs.visit_with(visitor)?;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
fields.visit_with(visitor)
|
||||||
|
}
|
||||||
|
ShallowInitBox(ref op, ty) => {
|
||||||
|
op.visit_with(visitor)?;
|
||||||
|
ty.visit_with(visitor)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'tcx> TypeVisitable<'tcx> for Operand<'tcx> {
|
||||||
|
fn visit_with<V: TypeVisitor<'tcx>>(&self, visitor: &mut V) -> ControlFlow<V::BreakTy> {
|
||||||
|
match *self {
|
||||||
|
Operand::Copy(ref place) | Operand::Move(ref place) => place.visit_with(visitor),
|
||||||
|
Operand::Constant(ref c) => c.visit_with(visitor),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'tcx> TypeVisitable<'tcx> for PlaceElem<'tcx> {
|
||||||
|
fn visit_with<Vs: TypeVisitor<'tcx>>(&self, visitor: &mut Vs) -> ControlFlow<Vs::BreakTy> {
|
||||||
|
use crate::mir::ProjectionElem::*;
|
||||||
|
|
||||||
|
match self {
|
||||||
|
Field(_, ty) => ty.visit_with(visitor),
|
||||||
|
Index(v) => v.visit_with(visitor),
|
||||||
|
_ => ControlFlow::CONTINUE,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'tcx> TypeVisitable<'tcx> for Field {
|
||||||
|
fn visit_with<V: TypeVisitor<'tcx>>(&self, _: &mut V) -> ControlFlow<V::BreakTy> {
|
||||||
|
ControlFlow::CONTINUE
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'tcx> TypeVisitable<'tcx> for GeneratorSavedLocal {
|
||||||
|
fn visit_with<V: TypeVisitor<'tcx>>(&self, _: &mut V) -> ControlFlow<V::BreakTy> {
|
||||||
|
ControlFlow::CONTINUE
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'tcx, R: Idx, C: Idx> TypeVisitable<'tcx> for BitMatrix<R, C> {
|
||||||
|
fn visit_with<V: TypeVisitor<'tcx>>(&self, _: &mut V) -> ControlFlow<V::BreakTy> {
|
||||||
|
ControlFlow::CONTINUE
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'tcx> TypeVisitable<'tcx> for Constant<'tcx> {
|
||||||
|
fn visit_with<V: TypeVisitor<'tcx>>(&self, visitor: &mut V) -> ControlFlow<V::BreakTy> {
|
||||||
|
self.literal.visit_with(visitor)?;
|
||||||
|
self.user_ty.visit_with(visitor)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'tcx> TypeVisitable<'tcx> for ConstantKind<'tcx> {
|
||||||
|
fn visit_with<V: TypeVisitor<'tcx>>(&self, visitor: &mut V) -> ControlFlow<V::BreakTy> {
|
||||||
|
visitor.visit_mir_const(*self)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'tcx> TypeSuperVisitable<'tcx> for ConstantKind<'tcx> {
|
||||||
|
fn super_visit_with<V: TypeVisitor<'tcx>>(&self, visitor: &mut V) -> ControlFlow<V::BreakTy> {
|
||||||
|
match *self {
|
||||||
|
ConstantKind::Ty(c) => c.visit_with(visitor),
|
||||||
|
ConstantKind::Val(_, t) => t.visit_with(visitor),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -1385,7 +1385,9 @@ fn try_fold_with<F: ty::fold::FallibleTypeFolder<'tcx>>(
|
|||||||
self.constness().try_fold_with(folder)?,
|
self.constness().try_fold_with(folder)?,
|
||||||
))
|
))
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'tcx> TypeVisitable<'tcx> for ParamEnv<'tcx> {
|
||||||
fn visit_with<V: TypeVisitor<'tcx>>(&self, visitor: &mut V) -> ControlFlow<V::BreakTy> {
|
fn visit_with<V: TypeVisitor<'tcx>>(&self, visitor: &mut V) -> ControlFlow<V::BreakTy> {
|
||||||
self.caller_bounds().visit_with(visitor)?;
|
self.caller_bounds().visit_with(visitor)?;
|
||||||
self.reveal().visit_with(visitor)?;
|
self.reveal().visit_with(visitor)?;
|
||||||
|
@ -6,6 +6,7 @@
|
|||||||
use crate::mir::ProjectionKind;
|
use crate::mir::ProjectionKind;
|
||||||
use crate::ty::fold::{FallibleTypeFolder, TypeFoldable, TypeSuperFoldable, TypeVisitor};
|
use crate::ty::fold::{FallibleTypeFolder, TypeFoldable, TypeSuperFoldable, TypeVisitor};
|
||||||
use crate::ty::print::{with_no_trimmed_paths, FmtPrinter, Printer};
|
use crate::ty::print::{with_no_trimmed_paths, FmtPrinter, Printer};
|
||||||
|
use crate::ty::visit::{TypeSuperVisitable, TypeVisitable};
|
||||||
use crate::ty::{self, InferConst, Lift, Term, Ty, TyCtxt};
|
use crate::ty::{self, InferConst, Lift, Term, Ty, TyCtxt};
|
||||||
use rustc_data_structures::functor::IdFunctor;
|
use rustc_data_structures::functor::IdFunctor;
|
||||||
use rustc_hir as hir;
|
use rustc_hir as hir;
|
||||||
@ -651,7 +652,9 @@ impl<'tcx> TypeFoldable<'tcx> for ty::AdtDef<'tcx> {
|
|||||||
fn 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> {
|
||||||
Ok(self)
|
Ok(self)
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'tcx> TypeVisitable<'tcx> for ty::AdtDef<'tcx> {
|
||||||
fn visit_with<V: TypeVisitor<'tcx>>(&self, _visitor: &mut V) -> ControlFlow<V::BreakTy> {
|
fn visit_with<V: TypeVisitor<'tcx>>(&self, _visitor: &mut V) -> ControlFlow<V::BreakTy> {
|
||||||
ControlFlow::CONTINUE
|
ControlFlow::CONTINUE
|
||||||
}
|
}
|
||||||
@ -664,7 +667,9 @@ fn try_fold_with<F: FallibleTypeFolder<'tcx>>(
|
|||||||
) -> Result<(T, U), F::Error> {
|
) -> Result<(T, U), F::Error> {
|
||||||
Ok((self.0.try_fold_with(folder)?, self.1.try_fold_with(folder)?))
|
Ok((self.0.try_fold_with(folder)?, self.1.try_fold_with(folder)?))
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'tcx, T: TypeVisitable<'tcx>, U: TypeVisitable<'tcx>> TypeVisitable<'tcx> for (T, U) {
|
||||||
fn visit_with<V: TypeVisitor<'tcx>>(&self, visitor: &mut V) -> ControlFlow<V::BreakTy> {
|
fn visit_with<V: TypeVisitor<'tcx>>(&self, visitor: &mut V) -> ControlFlow<V::BreakTy> {
|
||||||
self.0.visit_with(visitor)?;
|
self.0.visit_with(visitor)?;
|
||||||
self.1.visit_with(visitor)
|
self.1.visit_with(visitor)
|
||||||
@ -684,7 +689,11 @@ fn try_fold_with<F: FallibleTypeFolder<'tcx>>(
|
|||||||
self.2.try_fold_with(folder)?,
|
self.2.try_fold_with(folder)?,
|
||||||
))
|
))
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'tcx, A: TypeVisitable<'tcx>, B: TypeVisitable<'tcx>, C: TypeVisitable<'tcx>>
|
||||||
|
TypeVisitable<'tcx> for (A, B, C)
|
||||||
|
{
|
||||||
fn visit_with<V: TypeVisitor<'tcx>>(&self, visitor: &mut V) -> ControlFlow<V::BreakTy> {
|
fn visit_with<V: TypeVisitor<'tcx>>(&self, visitor: &mut V) -> ControlFlow<V::BreakTy> {
|
||||||
self.0.visit_with(visitor)?;
|
self.0.visit_with(visitor)?;
|
||||||
self.1.visit_with(visitor)?;
|
self.1.visit_with(visitor)?;
|
||||||
@ -756,7 +765,9 @@ fn try_fold_with<F: FallibleTypeFolder<'tcx>>(
|
|||||||
Ok(Rc::from_raw(Rc::into_raw(unique).cast()))
|
Ok(Rc::from_raw(Rc::into_raw(unique).cast()))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'tcx, T: TypeVisitable<'tcx>> TypeVisitable<'tcx> for Rc<T> {
|
||||||
fn visit_with<V: TypeVisitor<'tcx>>(&self, visitor: &mut V) -> ControlFlow<V::BreakTy> {
|
fn visit_with<V: TypeVisitor<'tcx>>(&self, visitor: &mut V) -> ControlFlow<V::BreakTy> {
|
||||||
(**self).visit_with(visitor)
|
(**self).visit_with(visitor)
|
||||||
}
|
}
|
||||||
@ -800,7 +811,9 @@ fn try_fold_with<F: FallibleTypeFolder<'tcx>>(
|
|||||||
Ok(Arc::from_raw(Arc::into_raw(unique).cast()))
|
Ok(Arc::from_raw(Arc::into_raw(unique).cast()))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'tcx, T: TypeVisitable<'tcx>> TypeVisitable<'tcx> for Arc<T> {
|
||||||
fn visit_with<V: TypeVisitor<'tcx>>(&self, visitor: &mut V) -> ControlFlow<V::BreakTy> {
|
fn visit_with<V: TypeVisitor<'tcx>>(&self, visitor: &mut V) -> ControlFlow<V::BreakTy> {
|
||||||
(**self).visit_with(visitor)
|
(**self).visit_with(visitor)
|
||||||
}
|
}
|
||||||
@ -810,7 +823,9 @@ 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> {
|
fn try_fold_with<F: FallibleTypeFolder<'tcx>>(self, folder: &mut F) -> Result<Self, F::Error> {
|
||||||
self.try_map_id(|value| value.try_fold_with(folder))
|
self.try_map_id(|value| value.try_fold_with(folder))
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'tcx, T: TypeVisitable<'tcx>> TypeVisitable<'tcx> for Box<T> {
|
||||||
fn visit_with<V: TypeVisitor<'tcx>>(&self, visitor: &mut V) -> ControlFlow<V::BreakTy> {
|
fn visit_with<V: TypeVisitor<'tcx>>(&self, visitor: &mut V) -> ControlFlow<V::BreakTy> {
|
||||||
(**self).visit_with(visitor)
|
(**self).visit_with(visitor)
|
||||||
}
|
}
|
||||||
@ -820,7 +835,9 @@ 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> {
|
fn try_fold_with<F: FallibleTypeFolder<'tcx>>(self, folder: &mut F) -> Result<Self, F::Error> {
|
||||||
self.try_map_id(|t| t.try_fold_with(folder))
|
self.try_map_id(|t| t.try_fold_with(folder))
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'tcx, T: TypeVisitable<'tcx>> TypeVisitable<'tcx> for Vec<T> {
|
||||||
fn visit_with<V: TypeVisitor<'tcx>>(&self, visitor: &mut V) -> ControlFlow<V::BreakTy> {
|
fn visit_with<V: TypeVisitor<'tcx>>(&self, visitor: &mut V) -> ControlFlow<V::BreakTy> {
|
||||||
self.iter().try_for_each(|t| t.visit_with(visitor))
|
self.iter().try_for_each(|t| t.visit_with(visitor))
|
||||||
}
|
}
|
||||||
@ -830,7 +847,9 @@ 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> {
|
fn try_fold_with<F: FallibleTypeFolder<'tcx>>(self, folder: &mut F) -> Result<Self, F::Error> {
|
||||||
self.try_map_id(|t| t.try_fold_with(folder))
|
self.try_map_id(|t| t.try_fold_with(folder))
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'tcx, T: TypeVisitable<'tcx>> TypeVisitable<'tcx> for Box<[T]> {
|
||||||
fn visit_with<V: TypeVisitor<'tcx>>(&self, visitor: &mut V) -> ControlFlow<V::BreakTy> {
|
fn visit_with<V: TypeVisitor<'tcx>>(&self, visitor: &mut V) -> ControlFlow<V::BreakTy> {
|
||||||
self.iter().try_for_each(|t| t.visit_with(visitor))
|
self.iter().try_for_each(|t| t.visit_with(visitor))
|
||||||
}
|
}
|
||||||
@ -840,7 +859,9 @@ impl<'tcx, T: TypeFoldable<'tcx>> TypeFoldable<'tcx> for ty::EarlyBinder<T> {
|
|||||||
fn 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> {
|
||||||
self.try_map_bound(|ty| ty.try_fold_with(folder))
|
self.try_map_bound(|ty| ty.try_fold_with(folder))
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'tcx, T: TypeVisitable<'tcx>> TypeVisitable<'tcx> for ty::EarlyBinder<T> {
|
||||||
fn visit_with<V: TypeVisitor<'tcx>>(&self, visitor: &mut V) -> ControlFlow<V::BreakTy> {
|
fn visit_with<V: TypeVisitor<'tcx>>(&self, visitor: &mut V) -> ControlFlow<V::BreakTy> {
|
||||||
self.as_ref().0.visit_with(visitor)
|
self.as_ref().0.visit_with(visitor)
|
||||||
}
|
}
|
||||||
@ -850,7 +871,9 @@ impl<'tcx, T: TypeFoldable<'tcx>> TypeFoldable<'tcx> for ty::Binder<'tcx, T> {
|
|||||||
fn 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> {
|
||||||
folder.try_fold_binder(self)
|
folder.try_fold_binder(self)
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'tcx, T: TypeVisitable<'tcx>> TypeVisitable<'tcx> for ty::Binder<'tcx, T> {
|
||||||
fn visit_with<V: TypeVisitor<'tcx>>(&self, visitor: &mut V) -> ControlFlow<V::BreakTy> {
|
fn visit_with<V: TypeVisitor<'tcx>>(&self, visitor: &mut V) -> ControlFlow<V::BreakTy> {
|
||||||
visitor.visit_binder(self)
|
visitor.visit_binder(self)
|
||||||
}
|
}
|
||||||
@ -863,7 +886,9 @@ fn try_super_fold_with<F: FallibleTypeFolder<'tcx>>(
|
|||||||
) -> Result<Self, F::Error> {
|
) -> Result<Self, F::Error> {
|
||||||
self.try_map_bound(|ty| ty.try_fold_with(folder))
|
self.try_map_bound(|ty| ty.try_fold_with(folder))
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'tcx, T: TypeVisitable<'tcx>> TypeSuperVisitable<'tcx> for ty::Binder<'tcx, T> {
|
||||||
fn super_visit_with<V: TypeVisitor<'tcx>>(&self, visitor: &mut V) -> ControlFlow<V::BreakTy> {
|
fn super_visit_with<V: TypeVisitor<'tcx>>(&self, visitor: &mut V) -> ControlFlow<V::BreakTy> {
|
||||||
self.as_ref().skip_binder().visit_with(visitor)
|
self.as_ref().skip_binder().visit_with(visitor)
|
||||||
}
|
}
|
||||||
@ -873,7 +898,11 @@ impl<'tcx> TypeFoldable<'tcx> for &'tcx ty::List<ty::Binder<'tcx, ty::Existentia
|
|||||||
fn 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> {
|
||||||
ty::util::fold_list(self, folder, |tcx, v| tcx.intern_poly_existential_predicates(v))
|
ty::util::fold_list(self, folder, |tcx, v| tcx.intern_poly_existential_predicates(v))
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'tcx> TypeVisitable<'tcx>
|
||||||
|
for &'tcx ty::List<ty::Binder<'tcx, ty::ExistentialPredicate<'tcx>>>
|
||||||
|
{
|
||||||
fn visit_with<V: TypeVisitor<'tcx>>(&self, visitor: &mut V) -> ControlFlow<V::BreakTy> {
|
fn visit_with<V: TypeVisitor<'tcx>>(&self, visitor: &mut V) -> ControlFlow<V::BreakTy> {
|
||||||
self.iter().try_for_each(|p| p.visit_with(visitor))
|
self.iter().try_for_each(|p| p.visit_with(visitor))
|
||||||
}
|
}
|
||||||
@ -883,7 +912,9 @@ impl<'tcx> TypeFoldable<'tcx> for &'tcx ty::List<ProjectionKind> {
|
|||||||
fn 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> {
|
||||||
ty::util::fold_list(self, folder, |tcx, v| tcx.intern_projs(v))
|
ty::util::fold_list(self, folder, |tcx, v| tcx.intern_projs(v))
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'tcx> TypeVisitable<'tcx> for &'tcx ty::List<ProjectionKind> {
|
||||||
fn visit_with<V: TypeVisitor<'tcx>>(&self, visitor: &mut V) -> ControlFlow<V::BreakTy> {
|
fn visit_with<V: TypeVisitor<'tcx>>(&self, visitor: &mut V) -> ControlFlow<V::BreakTy> {
|
||||||
self.iter().try_for_each(|t| t.visit_with(visitor))
|
self.iter().try_for_each(|t| t.visit_with(visitor))
|
||||||
}
|
}
|
||||||
@ -915,7 +946,9 @@ fn try_fold_with<F: FallibleTypeFolder<'tcx>>(self, folder: &mut F) -> Result<Se
|
|||||||
},
|
},
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'tcx> TypeVisitable<'tcx> for ty::instance::Instance<'tcx> {
|
||||||
fn visit_with<V: TypeVisitor<'tcx>>(&self, visitor: &mut V) -> ControlFlow<V::BreakTy> {
|
fn visit_with<V: TypeVisitor<'tcx>>(&self, visitor: &mut V) -> ControlFlow<V::BreakTy> {
|
||||||
use crate::ty::InstanceDef::*;
|
use crate::ty::InstanceDef::*;
|
||||||
self.substs.visit_with(visitor)?;
|
self.substs.visit_with(visitor)?;
|
||||||
@ -941,7 +974,9 @@ impl<'tcx> TypeFoldable<'tcx> for interpret::GlobalId<'tcx> {
|
|||||||
fn 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> {
|
||||||
Ok(Self { instance: self.instance.try_fold_with(folder)?, promoted: self.promoted })
|
Ok(Self { instance: self.instance.try_fold_with(folder)?, promoted: self.promoted })
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'tcx> TypeVisitable<'tcx> for interpret::GlobalId<'tcx> {
|
||||||
fn visit_with<V: TypeVisitor<'tcx>>(&self, visitor: &mut V) -> ControlFlow<V::BreakTy> {
|
fn visit_with<V: TypeVisitor<'tcx>>(&self, visitor: &mut V) -> ControlFlow<V::BreakTy> {
|
||||||
self.instance.visit_with(visitor)
|
self.instance.visit_with(visitor)
|
||||||
}
|
}
|
||||||
@ -951,7 +986,9 @@ impl<'tcx> TypeFoldable<'tcx> for Ty<'tcx> {
|
|||||||
fn 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> {
|
||||||
folder.try_fold_ty(self)
|
folder.try_fold_ty(self)
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'tcx> TypeVisitable<'tcx> for Ty<'tcx> {
|
||||||
fn visit_with<V: TypeVisitor<'tcx>>(&self, visitor: &mut V) -> ControlFlow<V::BreakTy> {
|
fn visit_with<V: TypeVisitor<'tcx>>(&self, visitor: &mut V) -> ControlFlow<V::BreakTy> {
|
||||||
visitor.visit_ty(*self)
|
visitor.visit_ty(*self)
|
||||||
}
|
}
|
||||||
@ -1001,7 +1038,9 @@ fn try_super_fold_with<F: FallibleTypeFolder<'tcx>>(
|
|||||||
|
|
||||||
Ok(if *self.kind() == kind { self } else { folder.tcx().mk_ty(kind) })
|
Ok(if *self.kind() == kind { self } else { folder.tcx().mk_ty(kind) })
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'tcx> TypeSuperVisitable<'tcx> for Ty<'tcx> {
|
||||||
fn super_visit_with<V: TypeVisitor<'tcx>>(&self, visitor: &mut V) -> ControlFlow<V::BreakTy> {
|
fn super_visit_with<V: TypeVisitor<'tcx>>(&self, visitor: &mut V) -> ControlFlow<V::BreakTy> {
|
||||||
match self.kind() {
|
match self.kind() {
|
||||||
ty::RawPtr(ref tm) => tm.visit_with(visitor),
|
ty::RawPtr(ref tm) => tm.visit_with(visitor),
|
||||||
@ -1049,7 +1088,9 @@ impl<'tcx> TypeFoldable<'tcx> for ty::Region<'tcx> {
|
|||||||
fn 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> {
|
||||||
folder.try_fold_region(self)
|
folder.try_fold_region(self)
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'tcx> TypeVisitable<'tcx> for ty::Region<'tcx> {
|
||||||
fn visit_with<V: TypeVisitor<'tcx>>(&self, visitor: &mut V) -> ControlFlow<V::BreakTy> {
|
fn visit_with<V: TypeVisitor<'tcx>>(&self, visitor: &mut V) -> ControlFlow<V::BreakTy> {
|
||||||
visitor.visit_region(*self)
|
visitor.visit_region(*self)
|
||||||
}
|
}
|
||||||
@ -1062,7 +1103,9 @@ fn try_super_fold_with<F: FallibleTypeFolder<'tcx>>(
|
|||||||
) -> Result<Self, F::Error> {
|
) -> Result<Self, F::Error> {
|
||||||
Ok(self)
|
Ok(self)
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'tcx> TypeSuperVisitable<'tcx> for ty::Region<'tcx> {
|
||||||
fn super_visit_with<V: TypeVisitor<'tcx>>(&self, _visitor: &mut V) -> ControlFlow<V::BreakTy> {
|
fn super_visit_with<V: TypeVisitor<'tcx>>(&self, _visitor: &mut V) -> ControlFlow<V::BreakTy> {
|
||||||
ControlFlow::CONTINUE
|
ControlFlow::CONTINUE
|
||||||
}
|
}
|
||||||
@ -1072,7 +1115,9 @@ impl<'tcx> TypeFoldable<'tcx> for ty::Predicate<'tcx> {
|
|||||||
fn 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> {
|
||||||
folder.try_fold_predicate(self)
|
folder.try_fold_predicate(self)
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'tcx> TypeVisitable<'tcx> for ty::Predicate<'tcx> {
|
||||||
fn visit_with<V: TypeVisitor<'tcx>>(&self, visitor: &mut V) -> ControlFlow<V::BreakTy> {
|
fn visit_with<V: TypeVisitor<'tcx>>(&self, visitor: &mut V) -> ControlFlow<V::BreakTy> {
|
||||||
visitor.visit_predicate(*self)
|
visitor.visit_predicate(*self)
|
||||||
}
|
}
|
||||||
@ -1094,7 +1139,9 @@ fn try_super_fold_with<F: FallibleTypeFolder<'tcx>>(
|
|||||||
let new = self.kind().try_fold_with(folder)?;
|
let new = self.kind().try_fold_with(folder)?;
|
||||||
Ok(folder.tcx().reuse_or_mk_predicate(self, new))
|
Ok(folder.tcx().reuse_or_mk_predicate(self, new))
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'tcx> TypeSuperVisitable<'tcx> for ty::Predicate<'tcx> {
|
||||||
fn super_visit_with<V: TypeVisitor<'tcx>>(&self, visitor: &mut V) -> ControlFlow<V::BreakTy> {
|
fn super_visit_with<V: TypeVisitor<'tcx>>(&self, visitor: &mut V) -> ControlFlow<V::BreakTy> {
|
||||||
self.kind().visit_with(visitor)
|
self.kind().visit_with(visitor)
|
||||||
}
|
}
|
||||||
@ -1104,7 +1151,9 @@ impl<'tcx> TypeFoldable<'tcx> for &'tcx ty::List<ty::Predicate<'tcx>> {
|
|||||||
fn 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> {
|
||||||
ty::util::fold_list(self, folder, |tcx, v| tcx.intern_predicates(v))
|
ty::util::fold_list(self, folder, |tcx, v| tcx.intern_predicates(v))
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'tcx> TypeVisitable<'tcx> for &'tcx ty::List<ty::Predicate<'tcx>> {
|
||||||
fn visit_with<V: TypeVisitor<'tcx>>(&self, visitor: &mut V) -> ControlFlow<V::BreakTy> {
|
fn visit_with<V: TypeVisitor<'tcx>>(&self, visitor: &mut V) -> ControlFlow<V::BreakTy> {
|
||||||
self.iter().try_for_each(|p| p.visit_with(visitor))
|
self.iter().try_for_each(|p| p.visit_with(visitor))
|
||||||
}
|
}
|
||||||
@ -1114,7 +1163,9 @@ 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> {
|
fn try_fold_with<F: FallibleTypeFolder<'tcx>>(self, folder: &mut F) -> Result<Self, F::Error> {
|
||||||
self.try_map_id(|x| x.try_fold_with(folder))
|
self.try_map_id(|x| x.try_fold_with(folder))
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'tcx, T: TypeVisitable<'tcx>, I: Idx> TypeVisitable<'tcx> for IndexVec<I, T> {
|
||||||
fn visit_with<V: TypeVisitor<'tcx>>(&self, visitor: &mut V) -> ControlFlow<V::BreakTy> {
|
fn visit_with<V: TypeVisitor<'tcx>>(&self, visitor: &mut V) -> ControlFlow<V::BreakTy> {
|
||||||
self.iter().try_for_each(|t| t.visit_with(visitor))
|
self.iter().try_for_each(|t| t.visit_with(visitor))
|
||||||
}
|
}
|
||||||
@ -1124,7 +1175,9 @@ impl<'tcx> TypeFoldable<'tcx> for ty::Const<'tcx> {
|
|||||||
fn 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> {
|
||||||
folder.try_fold_const(self)
|
folder.try_fold_const(self)
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'tcx> TypeVisitable<'tcx> for ty::Const<'tcx> {
|
||||||
fn visit_with<V: TypeVisitor<'tcx>>(&self, visitor: &mut V) -> ControlFlow<V::BreakTy> {
|
fn visit_with<V: TypeVisitor<'tcx>>(&self, visitor: &mut V) -> ControlFlow<V::BreakTy> {
|
||||||
visitor.visit_const(*self)
|
visitor.visit_const(*self)
|
||||||
}
|
}
|
||||||
@ -1143,7 +1196,9 @@ fn try_super_fold_with<F: FallibleTypeFolder<'tcx>>(
|
|||||||
Ok(self)
|
Ok(self)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'tcx> TypeSuperVisitable<'tcx> for ty::Const<'tcx> {
|
||||||
fn super_visit_with<V: TypeVisitor<'tcx>>(&self, visitor: &mut V) -> ControlFlow<V::BreakTy> {
|
fn super_visit_with<V: TypeVisitor<'tcx>>(&self, visitor: &mut V) -> ControlFlow<V::BreakTy> {
|
||||||
self.ty().visit_with(visitor)?;
|
self.ty().visit_with(visitor)?;
|
||||||
self.kind().visit_with(visitor)
|
self.kind().visit_with(visitor)
|
||||||
@ -1162,7 +1217,9 @@ fn try_fold_with<F: FallibleTypeFolder<'tcx>>(self, folder: &mut F) -> Result<Se
|
|||||||
| ty::ConstKind::Error(_) => self,
|
| ty::ConstKind::Error(_) => self,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'tcx> TypeVisitable<'tcx> for ty::ConstKind<'tcx> {
|
||||||
fn visit_with<V: TypeVisitor<'tcx>>(&self, visitor: &mut V) -> ControlFlow<V::BreakTy> {
|
fn visit_with<V: TypeVisitor<'tcx>>(&self, visitor: &mut V) -> ControlFlow<V::BreakTy> {
|
||||||
match *self {
|
match *self {
|
||||||
ty::ConstKind::Infer(ic) => ic.visit_with(visitor),
|
ty::ConstKind::Infer(ic) => ic.visit_with(visitor),
|
||||||
@ -1180,7 +1237,9 @@ impl<'tcx> TypeFoldable<'tcx> for InferConst<'tcx> {
|
|||||||
fn 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> {
|
||||||
Ok(self)
|
Ok(self)
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'tcx> TypeVisitable<'tcx> for InferConst<'tcx> {
|
||||||
fn visit_with<V: TypeVisitor<'tcx>>(&self, _visitor: &mut V) -> ControlFlow<V::BreakTy> {
|
fn visit_with<V: TypeVisitor<'tcx>>(&self, _visitor: &mut V) -> ControlFlow<V::BreakTy> {
|
||||||
ControlFlow::CONTINUE
|
ControlFlow::CONTINUE
|
||||||
}
|
}
|
||||||
@ -1190,7 +1249,9 @@ impl<'tcx> TypeFoldable<'tcx> for ty::Unevaluated<'tcx> {
|
|||||||
fn 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> {
|
||||||
folder.try_fold_unevaluated(self)
|
folder.try_fold_unevaluated(self)
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'tcx> TypeVisitable<'tcx> for ty::Unevaluated<'tcx> {
|
||||||
fn visit_with<V: TypeVisitor<'tcx>>(&self, visitor: &mut V) -> ControlFlow<V::BreakTy> {
|
fn visit_with<V: TypeVisitor<'tcx>>(&self, visitor: &mut V) -> ControlFlow<V::BreakTy> {
|
||||||
visitor.visit_unevaluated(*self)
|
visitor.visit_unevaluated(*self)
|
||||||
}
|
}
|
||||||
@ -1207,7 +1268,9 @@ fn try_super_fold_with<F: FallibleTypeFolder<'tcx>>(
|
|||||||
promoted: self.promoted,
|
promoted: self.promoted,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'tcx> TypeSuperVisitable<'tcx> for ty::Unevaluated<'tcx> {
|
||||||
fn super_visit_with<V: TypeVisitor<'tcx>>(&self, visitor: &mut V) -> ControlFlow<V::BreakTy> {
|
fn super_visit_with<V: TypeVisitor<'tcx>>(&self, visitor: &mut V) -> ControlFlow<V::BreakTy> {
|
||||||
self.substs.visit_with(visitor)
|
self.substs.visit_with(visitor)
|
||||||
}
|
}
|
||||||
@ -1217,7 +1280,9 @@ impl<'tcx> TypeFoldable<'tcx> for ty::Unevaluated<'tcx, ()> {
|
|||||||
fn 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> {
|
||||||
Ok(self.expand().try_fold_with(folder)?.shrink())
|
Ok(self.expand().try_fold_with(folder)?.shrink())
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'tcx> TypeVisitable<'tcx> for ty::Unevaluated<'tcx, ()> {
|
||||||
fn visit_with<V: TypeVisitor<'tcx>>(&self, visitor: &mut V) -> ControlFlow<V::BreakTy> {
|
fn visit_with<V: TypeVisitor<'tcx>>(&self, visitor: &mut V) -> ControlFlow<V::BreakTy> {
|
||||||
self.expand().visit_with(visitor)
|
self.expand().visit_with(visitor)
|
||||||
}
|
}
|
||||||
@ -1227,7 +1292,9 @@ impl<'tcx> TypeFoldable<'tcx> for hir::Constness {
|
|||||||
fn try_fold_with<F: FallibleTypeFolder<'tcx>>(self, _: &mut F) -> Result<Self, F::Error> {
|
fn try_fold_with<F: FallibleTypeFolder<'tcx>>(self, _: &mut F) -> Result<Self, F::Error> {
|
||||||
Ok(self)
|
Ok(self)
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'tcx> TypeVisitable<'tcx> for hir::Constness {
|
||||||
fn visit_with<V: TypeVisitor<'tcx>>(&self, _: &mut V) -> ControlFlow<V::BreakTy> {
|
fn visit_with<V: TypeVisitor<'tcx>>(&self, _: &mut V) -> ControlFlow<V::BreakTy> {
|
||||||
ControlFlow::CONTINUE
|
ControlFlow::CONTINUE
|
||||||
}
|
}
|
||||||
|
@ -6,6 +6,7 @@
|
|||||||
FallibleTypeFolder, TypeFoldable, TypeFolder, TypeSuperFoldable, TypeVisitor,
|
FallibleTypeFolder, TypeFoldable, TypeFolder, TypeSuperFoldable, TypeVisitor,
|
||||||
};
|
};
|
||||||
use crate::ty::sty::{ClosureSubsts, GeneratorSubsts, InlineConstSubsts};
|
use crate::ty::sty::{ClosureSubsts, GeneratorSubsts, InlineConstSubsts};
|
||||||
|
use crate::ty::visit::TypeVisitable;
|
||||||
use crate::ty::{self, Lift, List, ParamConst, Ty, TyCtxt};
|
use crate::ty::{self, Lift, List, ParamConst, Ty, TyCtxt};
|
||||||
|
|
||||||
use rustc_data_structures::intern::{Interned, WithStableHash};
|
use rustc_data_structures::intern::{Interned, WithStableHash};
|
||||||
@ -205,7 +206,9 @@ fn try_fold_with<F: FallibleTypeFolder<'tcx>>(self, folder: &mut F) -> Result<Se
|
|||||||
GenericArgKind::Const(ct) => ct.try_fold_with(folder).map(Into::into),
|
GenericArgKind::Const(ct) => ct.try_fold_with(folder).map(Into::into),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'tcx> TypeVisitable<'tcx> for GenericArg<'tcx> {
|
||||||
fn visit_with<V: TypeVisitor<'tcx>>(&self, visitor: &mut V) -> ControlFlow<V::BreakTy> {
|
fn visit_with<V: TypeVisitor<'tcx>>(&self, visitor: &mut V) -> ControlFlow<V::BreakTy> {
|
||||||
match self.unpack() {
|
match self.unpack() {
|
||||||
GenericArgKind::Lifetime(lt) => lt.visit_with(visitor),
|
GenericArgKind::Lifetime(lt) => lt.visit_with(visitor),
|
||||||
@ -449,7 +452,9 @@ fn try_fold_with<F: FallibleTypeFolder<'tcx>>(self, folder: &mut F) -> Result<Se
|
|||||||
_ => ty::util::fold_list(self, folder, |tcx, v| tcx.intern_substs(v)),
|
_ => ty::util::fold_list(self, folder, |tcx, v| tcx.intern_substs(v)),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'tcx> TypeVisitable<'tcx> for SubstsRef<'tcx> {
|
||||||
fn visit_with<V: TypeVisitor<'tcx>>(&self, visitor: &mut V) -> ControlFlow<V::BreakTy> {
|
fn visit_with<V: TypeVisitor<'tcx>>(&self, visitor: &mut V) -> ControlFlow<V::BreakTy> {
|
||||||
self.iter().try_for_each(|t| t.visit_with(visitor))
|
self.iter().try_for_each(|t| t.visit_with(visitor))
|
||||||
}
|
}
|
||||||
@ -485,7 +490,9 @@ fn try_fold_with<F: FallibleTypeFolder<'tcx>>(self, folder: &mut F) -> Result<Se
|
|||||||
_ => ty::util::fold_list(self, folder, |tcx, v| tcx.intern_type_list(v)),
|
_ => ty::util::fold_list(self, folder, |tcx, v| tcx.intern_type_list(v)),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'tcx> TypeVisitable<'tcx> for &'tcx ty::List<Ty<'tcx>> {
|
||||||
fn visit_with<V: TypeVisitor<'tcx>>(&self, visitor: &mut V) -> ControlFlow<V::BreakTy> {
|
fn visit_with<V: TypeVisitor<'tcx>>(&self, visitor: &mut V) -> ControlFlow<V::BreakTy> {
|
||||||
self.iter().try_for_each(|t| t.visit_with(visitor))
|
self.iter().try_for_each(|t| t.visit_with(visitor))
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user