mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-22 06:44:35 +00:00
add real folder to Region
This commit is contained in:
parent
da2f897e59
commit
bb17fe8bf5
@ -1532,7 +1532,7 @@ impl<'tcx> Stable<'tcx> for ty::RegionKind<'tcx> {
|
||||
})
|
||||
}
|
||||
ty::ReErased => RegionKind::ReErased,
|
||||
_=> unimplemented!()
|
||||
_ => unimplemented!(),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1,6 +1,9 @@
|
||||
use std::ops::ControlFlow;
|
||||
|
||||
use crate::Opaque;
|
||||
use crate::{
|
||||
ty::{self, BoundRegion, BoundRegionKind},
|
||||
Opaque,
|
||||
};
|
||||
|
||||
use super::ty::{
|
||||
Allocation, Binder, Const, ConstDef, ConstantKind, ExistentialPredicate, FnSig, GenericArgKind,
|
||||
@ -15,6 +18,9 @@ pub trait Folder: Sized {
|
||||
fn fold_const(&mut self, c: &Const) -> ControlFlow<Self::Break, Const> {
|
||||
c.super_fold(self)
|
||||
}
|
||||
fn visit_reg(&mut self, reg: &Region) -> ControlFlow<Self::Break, Region> {
|
||||
reg.super_fold(self)
|
||||
}
|
||||
}
|
||||
|
||||
pub trait Foldable: Sized + Clone {
|
||||
@ -107,8 +113,39 @@ impl Foldable for GenericArgs {
|
||||
}
|
||||
|
||||
impl Foldable for Region {
|
||||
fn fold<V: Folder>(&self, folder: &mut V) -> ControlFlow<V::Break, Self> {
|
||||
folder.visit_reg(self)
|
||||
}
|
||||
fn super_fold<V: Folder>(&self, folder: &mut V) -> ControlFlow<V::Break, Self> {
|
||||
let mut kind = self.kind.clone();
|
||||
match &mut kind {
|
||||
crate::ty::RegionKind::ReEarlyBound(_) => {}
|
||||
crate::ty::RegionKind::ReLateBound(_, bound_reg) => {
|
||||
*bound_reg = bound_reg.fold(folder)?
|
||||
}
|
||||
crate::ty::RegionKind::ReStatic => {}
|
||||
crate::ty::RegionKind::RePlaceholder(bound_reg) => {
|
||||
bound_reg.bound = bound_reg.bound.fold(folder)?
|
||||
}
|
||||
crate::ty::RegionKind::ReErased => {}
|
||||
}
|
||||
ControlFlow::Continue(ty::Region { kind: kind }.into())
|
||||
}
|
||||
}
|
||||
|
||||
impl Foldable for BoundRegion {
|
||||
fn super_fold<V: Folder>(&self, folder: &mut V) -> ControlFlow<V::Break, Self> {
|
||||
ControlFlow::Continue(BoundRegion { var: self.var, kind: self.kind.fold(folder)? })
|
||||
}
|
||||
}
|
||||
|
||||
impl Foldable for BoundRegionKind {
|
||||
fn super_fold<V: Folder>(&self, _folder: &mut V) -> ControlFlow<V::Break, Self> {
|
||||
ControlFlow::Continue(self.clone())
|
||||
match self {
|
||||
BoundRegionKind::BrAnon => ControlFlow::Continue(self.clone()),
|
||||
BoundRegionKind::BrNamed(_, _) => ControlFlow::Continue(self.clone()),
|
||||
BoundRegionKind::BrEnv => ControlFlow::Continue(self.clone()),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user