impl TypeVisitable in type traversal macros

上级 e4b9625b
......@@ -293,7 +293,7 @@ pub fn unchecked_map<W>(self, map_op: impl FnOnce(V) -> W) -> Canonical<'tcx, W>
pub type QueryOutlivesConstraint<'tcx> =
ty::Binder<'tcx, ty::OutlivesPredicate<GenericArg<'tcx>, Region<'tcx>>>;
TrivialTypeFoldableAndLiftImpls! {
TrivialTypeTraversalAndLiftImpls! {
for <'tcx> {
crate::infer::canonical::Certainty,
crate::infer::canonical::CanonicalVarInfo<'tcx>,
......@@ -301,7 +301,7 @@ pub fn unchecked_map<W>(self, map_op: impl FnOnce(V) -> W) -> Canonical<'tcx, W>
}
}
TrivialTypeFoldableImpls! {
TrivialTypeTraversalImpls! {
for <'tcx> {
crate::infer::canonical::CanonicalVarInfos<'tcx>,
}
......
......@@ -18,7 +18,7 @@
}
///////////////////////////////////////////////////////////////////////////
// Lift and TypeFoldable macros
// Lift and TypeFoldable/TypeVisitable macros
//
// When possible, use one of these (relatively) convenient macros to write
// the impls for you.
......@@ -48,7 +48,7 @@ fn lift_to_tcx(self, _: $crate::ty::TyCtxt<$tcx>) -> Option<Self> {
/// Used for types that are `Copy` and which **do not care arena
/// allocated data** (i.e., don't need to be folded).
#[macro_export]
macro_rules! TrivialTypeFoldableImpls {
macro_rules! TrivialTypeTraversalImpls {
(for <$tcx:lifetime> { $($ty:ty,)+ }) => {
$(
impl<$tcx> $crate::ty::fold::TypeFoldable<$tcx> for $ty {
......@@ -58,8 +58,10 @@ fn try_fold_with<F: $crate::ty::fold::FallibleTypeFolder<$tcx>>(
) -> ::std::result::Result<$ty, F::Error> {
Ok(self)
}
}
fn visit_with<F: $crate::ty::fold::TypeVisitor<$tcx>>(
impl<$tcx> $crate::ty::visit::TypeVisitable<$tcx> for $ty {
fn visit_with<F: $crate::ty::visit::TypeVisitor<$tcx>>(
&self,
_: &mut F)
-> ::std::ops::ControlFlow<F::BreakTy>
......@@ -71,7 +73,7 @@ fn visit_with<F: $crate::ty::fold::TypeVisitor<$tcx>>(
};
($($ty:ty,)+) => {
TrivialTypeFoldableImpls! {
TrivialTypeTraversalImpls! {
for <'tcx> {
$($ty,)+
}
......@@ -80,15 +82,15 @@ fn visit_with<F: $crate::ty::fold::TypeVisitor<$tcx>>(
}
#[macro_export]
macro_rules! TrivialTypeFoldableAndLiftImpls {
macro_rules! TrivialTypeTraversalAndLiftImpls {
($($t:tt)*) => {
TrivialTypeFoldableImpls! { $($t)* }
TrivialTypeTraversalImpls! { $($t)* }
CloneLiftImpls! { $($t)* }
}
}
#[macro_export]
macro_rules! EnumTypeFoldableImpl {
macro_rules! EnumTypeTraversalImpl {
(impl<$($p:tt),*> TypeFoldable<$tcx:tt> for $s:path {
$($variants:tt)*
} $(where $($wc:tt)*)*) => {
......@@ -99,14 +101,22 @@ fn try_fold_with<V: $crate::ty::fold::FallibleTypeFolder<$tcx>>(
self,
folder: &mut V,
) -> ::std::result::Result<Self, V::Error> {
EnumTypeFoldableImpl!(@FoldVariants(self, folder) input($($variants)*) output())
EnumTypeTraversalImpl!(@FoldVariants(self, folder) input($($variants)*) output())
}
}
};
fn visit_with<V: $crate::ty::fold::TypeVisitor<$tcx>>(
(impl<$($p:tt),*> TypeVisitable<$tcx:tt> for $s:path {
$($variants:tt)*
} $(where $($wc:tt)*)*) => {
impl<$($p),*> $crate::ty::visit::TypeVisitable<$tcx> for $s
$(where $($wc)*)*
{
fn visit_with<V: $crate::ty::visit::TypeVisitor<$tcx>>(
&self,
visitor: &mut V,
) -> ::std::ops::ControlFlow<V::BreakTy> {
EnumTypeFoldableImpl!(@VisitVariants(self, visitor) input($($variants)*) output())
EnumTypeTraversalImpl!(@VisitVariants(self, visitor) input($($variants)*) output())
}
}
};
......@@ -120,7 +130,7 @@ fn visit_with<V: $crate::ty::fold::TypeVisitor<$tcx>>(
(@FoldVariants($this:expr, $folder:expr)
input( ($variant:path) ( $($variant_arg:ident),* ) , $($input:tt)*)
output( $($output:tt)*) ) => {
EnumTypeFoldableImpl!(
EnumTypeTraversalImpl!(
@FoldVariants($this, $folder)
input($($input)*)
output(
......@@ -137,7 +147,7 @@ fn visit_with<V: $crate::ty::fold::TypeVisitor<$tcx>>(
(@FoldVariants($this:expr, $folder:expr)
input( ($variant:path) { $($variant_arg:ident),* $(,)? } , $($input:tt)*)
output( $($output:tt)*) ) => {
EnumTypeFoldableImpl!(
EnumTypeTraversalImpl!(
@FoldVariants($this, $folder)
input($($input)*)
output(
......@@ -155,7 +165,7 @@ fn visit_with<V: $crate::ty::fold::TypeVisitor<$tcx>>(
(@FoldVariants($this:expr, $folder:expr)
input( ($variant:path), $($input:tt)*)
output( $($output:tt)*) ) => {
EnumTypeFoldableImpl!(
EnumTypeTraversalImpl!(
@FoldVariants($this, $folder)
input($($input)*)
output(
......@@ -174,12 +184,12 @@ fn visit_with<V: $crate::ty::fold::TypeVisitor<$tcx>>(
(@VisitVariants($this:expr, $visitor:expr)
input( ($variant:path) ( $($variant_arg:ident),* ) , $($input:tt)*)
output( $($output:tt)*) ) => {
EnumTypeFoldableImpl!(
EnumTypeTraversalImpl!(
@VisitVariants($this, $visitor)
input($($input)*)
output(
$variant ( $($variant_arg),* ) => {
$($crate::ty::fold::TypeFoldable::visit_with(
$($crate::ty::visit::TypeVisitable::visit_with(
$variant_arg, $visitor
)?;)*
::std::ops::ControlFlow::CONTINUE
......@@ -192,12 +202,12 @@ fn visit_with<V: $crate::ty::fold::TypeVisitor<$tcx>>(
(@VisitVariants($this:expr, $visitor:expr)
input( ($variant:path) { $($variant_arg:ident),* $(,)? } , $($input:tt)*)
output( $($output:tt)*) ) => {
EnumTypeFoldableImpl!(
EnumTypeTraversalImpl!(
@VisitVariants($this, $visitor)
input($($input)*)
output(
$variant { $($variant_arg),* } => {
$($crate::ty::fold::TypeFoldable::visit_with(
$($crate::ty::visit::TypeVisitable::visit_with(
$variant_arg, $visitor
)?;)*
::std::ops::ControlFlow::CONTINUE
......@@ -210,7 +220,7 @@ fn visit_with<V: $crate::ty::fold::TypeVisitor<$tcx>>(
(@VisitVariants($this:expr, $visitor:expr)
input( ($variant:path), $($input:tt)*)
output( $($output:tt)*) ) => {
EnumTypeFoldableImpl!(
EnumTypeTraversalImpl!(
@VisitVariants($this, $visitor)
input($($input)*)
output(
......
......@@ -58,6 +58,6 @@ fn hash_stable(&self, _: &mut CTX, _: &mut StableHasher) {
}
}
TrivialTypeFoldableAndLiftImpls! {
TrivialTypeTraversalAndLiftImpls! {
GraphIsCyclicCache,
}
......@@ -29,7 +29,7 @@ fn from(err: ErrorGuaranteed) -> ErrorHandled {
}
}
TrivialTypeFoldableAndLiftImpls! {
TrivialTypeTraversalAndLiftImpls! {
ErrorHandled,
}
......
......@@ -762,7 +762,7 @@ pub enum ImplicitSelfKind {
None,
}
TrivialTypeFoldableAndLiftImpls! { BindingForm<'tcx>, }
TrivialTypeTraversalAndLiftImpls! { BindingForm<'tcx>, }
mod binding_form_impl {
use rustc_data_structures::stable_hasher::{HashStable, StableHasher};
......@@ -2641,7 +2641,7 @@ pub(crate) fn variant(
}
}
TrivialTypeFoldableAndLiftImpls! { ProjectionKind, }
TrivialTypeTraversalAndLiftImpls! { ProjectionKind, }
impl<'tcx> TypeFoldable<'tcx> for UserTypeProjection {
fn try_fold_with<F: FallibleTypeFolder<'tcx>>(self, folder: &mut F) -> Result<Self, F::Error> {
......
......@@ -73,6 +73,6 @@ fn hash_stable(&self, _: &mut CTX, _: &mut StableHasher) {
}
}
TrivialTypeFoldableAndLiftImpls! {
TrivialTypeTraversalAndLiftImpls! {
PredecessorCache,
}
......@@ -73,6 +73,6 @@ fn hash_stable(&self, _: &mut CTX, _: &mut StableHasher) {
}
}
TrivialTypeFoldableAndLiftImpls! {
TrivialTypeTraversalAndLiftImpls! {
SwitchSourceCache,
}
......@@ -384,6 +384,6 @@ fn hash_stable(&self, _: &mut CTX, _: &mut StableHasher) {
}
}
TrivialTypeFoldableAndLiftImpls! {
TrivialTypeTraversalAndLiftImpls! {
PostorderCache,
}
......@@ -4,7 +4,7 @@
use crate::ty;
use rustc_data_structures::functor::IdFunctor;
TrivialTypeFoldableAndLiftImpls! {
TrivialTypeTraversalAndLiftImpls! {
BlockTailInfo,
MirPhase,
SourceInfo,
......
......@@ -42,7 +42,7 @@ fn from(e: ErrorGuaranteed) -> NotConstEvaluatable {
}
}
TrivialTypeFoldableAndLiftImpls! {
TrivialTypeTraversalAndLiftImpls! {
NotConstEvaluatable,
}
......
......@@ -283,7 +283,7 @@ fn from(e: ErrorGuaranteed) -> OverflowError {
}
}
TrivialTypeFoldableAndLiftImpls! {
TrivialTypeTraversalAndLiftImpls! {
OverflowError,
}
......
......@@ -129,7 +129,7 @@ fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
///////////////////////////////////////////////////////////////////////////
// Lift implementations
TrivialTypeFoldableAndLiftImpls! {
TrivialTypeTraversalAndLiftImpls! {
super::IfExpressionCause,
super::ImplSourceDiscriminantKindData,
super::ImplSourcePointeeData,
......
......@@ -8,7 +8,7 @@ pub enum BindingMode {
BindByValue(Mutability),
}
TrivialTypeFoldableAndLiftImpls! { BindingMode, }
TrivialTypeTraversalAndLiftImpls! { BindingMode, }
impl BindingMode {
pub fn convert(ba: BindingAnnotation) -> BindingMode {
......
......@@ -183,7 +183,7 @@ fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
// For things that don't carry any arena-allocated data (and are
// copy...), just add them to this list.
TrivialTypeFoldableAndLiftImpls! {
TrivialTypeTraversalAndLiftImpls! {
(),
bool,
usize,
......@@ -692,19 +692,31 @@ fn visit_with<V: TypeVisitor<'tcx>>(&self, visitor: &mut V) -> ControlFlow<V::Br
}
}
EnumTypeFoldableImpl! {
EnumTypeTraversalImpl! {
impl<'tcx, T> TypeFoldable<'tcx> for Option<T> {
(Some)(a),
(None),
} where T: TypeFoldable<'tcx>
}
EnumTypeTraversalImpl! {
impl<'tcx, T> TypeVisitable<'tcx> for Option<T> {
(Some)(a),
(None),
} where T: TypeVisitable<'tcx>
}
EnumTypeFoldableImpl! {
EnumTypeTraversalImpl! {
impl<'tcx, T, E> TypeFoldable<'tcx> for Result<T, E> {
(Ok)(a),
(Err)(a),
} where T: TypeFoldable<'tcx>, E: TypeFoldable<'tcx>,
}
EnumTypeTraversalImpl! {
impl<'tcx, T, E> TypeVisitable<'tcx> for Result<T, E> {
(Ok)(a),
(Err)(a),
} where T: TypeVisitable<'tcx>, E: TypeVisitable<'tcx>,
}
impl<'tcx, T: TypeFoldable<'tcx>> TypeFoldable<'tcx> for Rc<T> {
fn try_fold_with<F: FallibleTypeFolder<'tcx>>(
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册