Further foundational stuff on ProjectionKind
before I add it to AscribeUserType
.
This commit is contained in:
parent
47e2d825e1
commit
82ab668a55
2 changed files with 30 additions and 0 deletions
|
@ -1888,6 +1888,24 @@ impl<'a, 'tcx> Lift<'tcx> for &'a List<CanonicalVarInfo> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl<'a, 'tcx> Lift<'tcx> for &'a List<ProjectionKind<'a>> {
|
||||||
|
type Lifted = &'tcx List<ProjectionKind<'tcx>>;
|
||||||
|
fn lift_to_tcx<'b, 'gcx>(&self, tcx: TyCtxt<'b, 'gcx, 'tcx>) -> Option<Self::Lifted> {
|
||||||
|
if self.len() == 0 {
|
||||||
|
return Some(List::empty());
|
||||||
|
}
|
||||||
|
if tcx.interners.arena.in_arena(*self as *const _) {
|
||||||
|
return Some(unsafe { mem::transmute(*self) });
|
||||||
|
}
|
||||||
|
// Also try in the global tcx if we're not that.
|
||||||
|
if !tcx.is_global() {
|
||||||
|
self.lift_to_tcx(tcx.global_tcx())
|
||||||
|
} else {
|
||||||
|
None
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
pub mod tls {
|
pub mod tls {
|
||||||
use super::{GlobalCtxt, TyCtxt};
|
use super::{GlobalCtxt, TyCtxt};
|
||||||
|
|
||||||
|
|
|
@ -13,6 +13,7 @@
|
||||||
//! hand, though we've recently added some macros (e.g.,
|
//! hand, though we've recently added some macros (e.g.,
|
||||||
//! `BraceStructLiftImpl!`) to help with the tedium.
|
//! `BraceStructLiftImpl!`) to help with the tedium.
|
||||||
|
|
||||||
|
use mir::ProjectionKind;
|
||||||
use mir::interpret::ConstValue;
|
use mir::interpret::ConstValue;
|
||||||
use ty::{self, Lift, Ty, TyCtxt};
|
use ty::{self, Lift, Ty, TyCtxt};
|
||||||
use ty::fold::{TypeFoldable, TypeFolder, TypeVisitor};
|
use ty::fold::{TypeFoldable, TypeFolder, TypeVisitor};
|
||||||
|
@ -628,6 +629,17 @@ impl<'tcx> TypeFoldable<'tcx> for &'tcx ty::List<Ty<'tcx>> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl<'tcx> TypeFoldable<'tcx> for &'tcx ty::List<ProjectionKind<'tcx>> {
|
||||||
|
fn super_fold_with<'gcx: 'tcx, F: TypeFolder<'gcx, 'tcx>>(&self, folder: &mut F) -> Self {
|
||||||
|
let v = self.iter().map(|t| t.fold_with(folder)).collect::<SmallVec<[_; 8]>>();
|
||||||
|
folder.tcx().intern_projs(&v)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn super_visit_with<V: TypeVisitor<'tcx>>(&self, visitor: &mut V) -> bool {
|
||||||
|
self.iter().any(|t| t.visit_with(visitor))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
impl<'tcx> TypeFoldable<'tcx> for ty::instance::Instance<'tcx> {
|
impl<'tcx> TypeFoldable<'tcx> for ty::instance::Instance<'tcx> {
|
||||||
fn super_fold_with<'gcx: 'tcx, F: TypeFolder<'gcx, 'tcx>>(&self, folder: &mut F) -> Self {
|
fn super_fold_with<'gcx: 'tcx, F: TypeFolder<'gcx, 'tcx>>(&self, folder: &mut F) -> Self {
|
||||||
use ty::InstanceDef::*;
|
use ty::InstanceDef::*;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue