Rollup merge of #113969 - ericmarkmartin:smir-ty-dynamic, r=spastorino
add dynamic for smir r? spastorino
This commit is contained in:
commit
60a5d2dbde
@ -59,6 +59,10 @@ pub fn br_named_def(did: DefId) -> stable_mir::ty::BrNamedDef {
|
|||||||
with_tables(|t| t.br_named_def(did))
|
with_tables(|t| t.br_named_def(did))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn trait_def(did: DefId) -> stable_mir::ty::TraitDef {
|
||||||
|
with_tables(|t| t.trait_def(did))
|
||||||
|
}
|
||||||
|
|
||||||
impl<'tcx> Tables<'tcx> {
|
impl<'tcx> Tables<'tcx> {
|
||||||
pub fn item_def_id(&self, item: &stable_mir::CrateItem) -> DefId {
|
pub fn item_def_id(&self, item: &stable_mir::CrateItem) -> DefId {
|
||||||
self.def_ids[item.0]
|
self.def_ids[item.0]
|
||||||
@ -100,6 +104,10 @@ impl<'tcx> Tables<'tcx> {
|
|||||||
stable_mir::ty::BrNamedDef(self.create_def_id(did))
|
stable_mir::ty::BrNamedDef(self.create_def_id(did))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn trait_def(&mut self, did: DefId) -> stable_mir::ty::TraitDef {
|
||||||
|
stable_mir::ty::TraitDef(self.create_def_id(did))
|
||||||
|
}
|
||||||
|
|
||||||
fn create_def_id(&mut self, did: DefId) -> stable_mir::DefId {
|
fn create_def_id(&mut self, did: DefId) -> stable_mir::DefId {
|
||||||
// FIXME: this becomes inefficient when we have too many ids
|
// FIXME: this becomes inefficient when we have too many ids
|
||||||
for (i, &d) in self.def_ids.iter().enumerate() {
|
for (i, &d) in self.def_ids.iter().enumerate() {
|
||||||
|
@ -258,6 +258,72 @@ impl<'tcx> Stable<'tcx> for ty::AliasTy<'tcx> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl<'tcx> Stable<'tcx> for ty::DynKind {
|
||||||
|
type T = stable_mir::ty::DynKind;
|
||||||
|
|
||||||
|
fn stable(&self, _: &mut Tables<'tcx>) -> Self::T {
|
||||||
|
use ty::DynKind;
|
||||||
|
match self {
|
||||||
|
DynKind::Dyn => stable_mir::ty::DynKind::Dyn,
|
||||||
|
DynKind::DynStar => stable_mir::ty::DynKind::DynStar,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'tcx> Stable<'tcx> for ty::ExistentialPredicate<'tcx> {
|
||||||
|
type T = stable_mir::ty::ExistentialPredicate;
|
||||||
|
|
||||||
|
fn stable(&self, tables: &mut Tables<'tcx>) -> Self::T {
|
||||||
|
use stable_mir::ty::ExistentialPredicate::*;
|
||||||
|
match self {
|
||||||
|
ty::ExistentialPredicate::Trait(existential_trait_ref) => {
|
||||||
|
Trait(existential_trait_ref.stable(tables))
|
||||||
|
}
|
||||||
|
ty::ExistentialPredicate::Projection(existential_projection) => {
|
||||||
|
Projection(existential_projection.stable(tables))
|
||||||
|
}
|
||||||
|
ty::ExistentialPredicate::AutoTrait(def_id) => AutoTrait(tables.trait_def(*def_id)),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'tcx> Stable<'tcx> for ty::ExistentialTraitRef<'tcx> {
|
||||||
|
type T = stable_mir::ty::ExistentialTraitRef;
|
||||||
|
|
||||||
|
fn stable(&self, tables: &mut Tables<'tcx>) -> Self::T {
|
||||||
|
let ty::ExistentialTraitRef { def_id, args } = self;
|
||||||
|
stable_mir::ty::ExistentialTraitRef {
|
||||||
|
def_id: tables.trait_def(*def_id),
|
||||||
|
generic_args: args.stable(tables),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'tcx> Stable<'tcx> for ty::TermKind<'tcx> {
|
||||||
|
type T = stable_mir::ty::TermKind;
|
||||||
|
|
||||||
|
fn stable(&self, tables: &mut Tables<'tcx>) -> Self::T {
|
||||||
|
use stable_mir::ty::TermKind;
|
||||||
|
match self {
|
||||||
|
ty::TermKind::Ty(ty) => TermKind::Type(tables.intern_ty(*ty)),
|
||||||
|
ty::TermKind::Const(const_) => TermKind::Const(opaque(const_)),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'tcx> Stable<'tcx> for ty::ExistentialProjection<'tcx> {
|
||||||
|
type T = stable_mir::ty::ExistentialProjection;
|
||||||
|
|
||||||
|
fn stable(&self, tables: &mut Tables<'tcx>) -> Self::T {
|
||||||
|
let ty::ExistentialProjection { def_id, args, term } = self;
|
||||||
|
stable_mir::ty::ExistentialProjection {
|
||||||
|
def_id: tables.trait_def(*def_id),
|
||||||
|
generic_args: args.stable(tables),
|
||||||
|
term: term.unpack().stable(tables),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
impl<'tcx> Stable<'tcx> for ty::adjustment::PointerCoercion {
|
impl<'tcx> Stable<'tcx> for ty::adjustment::PointerCoercion {
|
||||||
type T = stable_mir::mir::PointerCoercion;
|
type T = stable_mir::mir::PointerCoercion;
|
||||||
fn stable(&self, tables: &mut Tables<'tcx>) -> Self::T {
|
fn stable(&self, tables: &mut Tables<'tcx>) -> Self::T {
|
||||||
@ -525,13 +591,17 @@ impl<'tcx> Stable<'tcx> for ty::GenericArgs<'tcx> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'tcx> Stable<'tcx> for ty::PolyFnSig<'tcx> {
|
impl<'tcx, S, V> Stable<'tcx> for ty::Binder<'tcx, S>
|
||||||
type T = stable_mir::ty::PolyFnSig;
|
where
|
||||||
|
S: Stable<'tcx, T = V>,
|
||||||
|
{
|
||||||
|
type T = stable_mir::ty::Binder<V>;
|
||||||
|
|
||||||
fn stable(&self, tables: &mut Tables<'tcx>) -> Self::T {
|
fn stable(&self, tables: &mut Tables<'tcx>) -> Self::T {
|
||||||
use stable_mir::ty::Binder;
|
use stable_mir::ty::Binder;
|
||||||
|
|
||||||
Binder {
|
Binder {
|
||||||
value: self.skip_binder().stable(tables),
|
value: self.as_ref().skip_binder().stable(tables),
|
||||||
bound_vars: self
|
bound_vars: self
|
||||||
.bound_vars()
|
.bound_vars()
|
||||||
.iter()
|
.iter()
|
||||||
@ -671,7 +741,16 @@ impl<'tcx> Stable<'tcx> for Ty<'tcx> {
|
|||||||
generic_args.stable(tables),
|
generic_args.stable(tables),
|
||||||
)),
|
)),
|
||||||
ty::FnPtr(poly_fn_sig) => TyKind::RigidTy(RigidTy::FnPtr(poly_fn_sig.stable(tables))),
|
ty::FnPtr(poly_fn_sig) => TyKind::RigidTy(RigidTy::FnPtr(poly_fn_sig.stable(tables))),
|
||||||
ty::Dynamic(_, _, _) => todo!(),
|
ty::Dynamic(existential_predicates, region, dyn_kind) => {
|
||||||
|
TyKind::RigidTy(RigidTy::Dynamic(
|
||||||
|
existential_predicates
|
||||||
|
.iter()
|
||||||
|
.map(|existential_predicate| existential_predicate.stable(tables))
|
||||||
|
.collect(),
|
||||||
|
opaque(region),
|
||||||
|
dyn_kind.stable(tables),
|
||||||
|
))
|
||||||
|
}
|
||||||
ty::Closure(def_id, generic_args) => TyKind::RigidTy(RigidTy::Closure(
|
ty::Closure(def_id, generic_args) => TyKind::RigidTy(RigidTy::Closure(
|
||||||
rustc_internal::closure_def(*def_id),
|
rustc_internal::closure_def(*def_id),
|
||||||
generic_args.stable(tables),
|
generic_args.stable(tables),
|
||||||
|
@ -38,6 +38,7 @@ pub enum RigidTy {
|
|||||||
FnPtr(PolyFnSig),
|
FnPtr(PolyFnSig),
|
||||||
Closure(ClosureDef, GenericArgs),
|
Closure(ClosureDef, GenericArgs),
|
||||||
Generator(GeneratorDef, GenericArgs, Movability),
|
Generator(GeneratorDef, GenericArgs, Movability),
|
||||||
|
Dynamic(Vec<Binder<ExistentialPredicate>>, Region, DynKind),
|
||||||
Never,
|
Never,
|
||||||
Tuple(Vec<Ty>),
|
Tuple(Vec<Ty>),
|
||||||
}
|
}
|
||||||
@ -98,6 +99,9 @@ pub struct AdtDef(pub(crate) DefId);
|
|||||||
#[derive(Clone, PartialEq, Eq, Debug)]
|
#[derive(Clone, PartialEq, Eq, Debug)]
|
||||||
pub struct AliasDef(pub(crate) DefId);
|
pub struct AliasDef(pub(crate) DefId);
|
||||||
|
|
||||||
|
#[derive(Clone, PartialEq, Eq, Debug)]
|
||||||
|
pub struct TraitDef(pub(crate) DefId);
|
||||||
|
|
||||||
#[derive(Clone, Debug)]
|
#[derive(Clone, Debug)]
|
||||||
pub struct GenericArgs(pub Vec<GenericArgKind>);
|
pub struct GenericArgs(pub Vec<GenericArgKind>);
|
||||||
|
|
||||||
@ -108,6 +112,12 @@ pub enum GenericArgKind {
|
|||||||
Const(Const),
|
Const(Const),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(Clone, Debug)]
|
||||||
|
pub enum TermKind {
|
||||||
|
Type(Ty),
|
||||||
|
Const(Const),
|
||||||
|
}
|
||||||
|
|
||||||
#[derive(Clone, Debug)]
|
#[derive(Clone, Debug)]
|
||||||
pub enum AliasKind {
|
pub enum AliasKind {
|
||||||
Projection,
|
Projection,
|
||||||
@ -192,3 +202,29 @@ pub enum BoundRegionKind {
|
|||||||
BrNamed(BrNamedDef, String),
|
BrNamed(BrNamedDef, String),
|
||||||
BrEnv,
|
BrEnv,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(Clone, Debug)]
|
||||||
|
pub enum DynKind {
|
||||||
|
Dyn,
|
||||||
|
DynStar,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Clone, Debug)]
|
||||||
|
pub enum ExistentialPredicate {
|
||||||
|
Trait(ExistentialTraitRef),
|
||||||
|
Projection(ExistentialProjection),
|
||||||
|
AutoTrait(TraitDef),
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Clone, Debug)]
|
||||||
|
pub struct ExistentialTraitRef {
|
||||||
|
pub def_id: TraitDef,
|
||||||
|
pub generic_args: GenericArgs,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Clone, Debug)]
|
||||||
|
pub struct ExistentialProjection {
|
||||||
|
pub def_id: TraitDef,
|
||||||
|
pub generic_args: GenericArgs,
|
||||||
|
pub term: TermKind,
|
||||||
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user