Skip to content

Commit

Permalink
Allow a way to add constructors for rustc_type_ir types
Browse files Browse the repository at this point in the history
  • Loading branch information
compiler-errors committed Feb 27, 2024
1 parent 8790c3c commit 04cff47
Show file tree
Hide file tree
Showing 8 changed files with 71 additions and 35 deletions.
17 changes: 17 additions & 0 deletions compiler/rustc_middle/src/ty/consts.rs
Expand Up @@ -175,7 +175,24 @@ impl<'tcx> Const<'tcx> {
let reported = tcx.dcx().span_delayed_bug(span, msg);
Const::new_error(tcx, reported, ty)
}
}

impl<'tcx> rustc_type_ir::new::Const<TyCtxt<'tcx>> for Const<'tcx> {
fn new(tcx: TyCtxt<'tcx>, kind: ty::ConstKind<'tcx>, ty: Ty<'tcx>) -> Self {
Const::new(tcx, kind, ty)
}

fn new_anon_bound(
tcx: TyCtxt<'tcx>,
debruijn: ty::DebruijnIndex,
var: ty::BoundVar,
ty: Ty<'tcx>,
) -> Self {
Const::new_bound(tcx, debruijn, var, ty)
}
}

impl<'tcx> Const<'tcx> {
/// Literals and const generic parameters are eagerly converted to a constant, everything else
/// becomes `Unevaluated`.
#[instrument(skip(tcx), level = "debug")]
Expand Down
21 changes: 0 additions & 21 deletions compiler/rustc_middle/src/ty/context.rs
Expand Up @@ -132,27 +132,6 @@ impl<'tcx> Interner for TyCtxt<'tcx> {
fn mk_canonical_var_infos(self, infos: &[ty::CanonicalVarInfo<Self>]) -> Self::CanonicalVars {
self.mk_canonical_var_infos(infos)
}

fn mk_bound_ty(self, debruijn: ty::DebruijnIndex, var: ty::BoundVar) -> Self::Ty {
Ty::new_bound(self, debruijn, ty::BoundTy { var, kind: ty::BoundTyKind::Anon })
}

fn mk_bound_region(self, debruijn: ty::DebruijnIndex, var: ty::BoundVar) -> Self::Region {
Region::new_bound(
self,
debruijn,
ty::BoundRegion { var, kind: ty::BoundRegionKind::BrAnon },
)
}

fn mk_bound_const(
self,
debruijn: ty::DebruijnIndex,
var: ty::BoundVar,
ty: Self::Ty,
) -> Self::Const {
Const::new_bound(self, debruijn, var, ty)
}
}

type InternedSet<'tcx, T> = ShardedHashMap<InternedInSet<'tcx, T>, ()>;
Expand Down
10 changes: 10 additions & 0 deletions compiler/rustc_middle/src/ty/region.rs
Expand Up @@ -136,6 +136,16 @@ impl<'tcx> Region<'tcx> {
}
}

impl<'tcx> rustc_type_ir::new::Region<TyCtxt<'tcx>> for Region<'tcx> {
fn new(tcx: TyCtxt<'tcx>, kind: ty::RegionKind<'tcx>) -> Self {
tcx.intern_region(kind)
}

fn new_anon_bound(tcx: TyCtxt<'tcx>, debruijn: ty::DebruijnIndex, var: ty::BoundVar) -> Self {
Region::new_bound(tcx, debruijn, ty::BoundRegion { var, kind: ty::BoundRegionKind::BrAnon })
}
}

/// Region utilities
impl<'tcx> Region<'tcx> {
pub fn kind(self) -> RegionKind<'tcx> {
Expand Down
13 changes: 12 additions & 1 deletion compiler/rustc_middle/src/ty/sty.rs
Expand Up @@ -1426,7 +1426,8 @@ impl From<BoundVar> for BoundTy {

/// Constructors for `Ty`
impl<'tcx> Ty<'tcx> {
// Avoid this in favour of more specific `new_*` methods, where possible.
/// Avoid using this in favour of more specific `new_*` methods, where possible.
/// The more specific methods will often optimize their creation.
#[allow(rustc::usage_of_ty_tykind)]
#[inline]
pub fn new(tcx: TyCtxt<'tcx>, st: TyKind<'tcx>) -> Ty<'tcx> {
Expand Down Expand Up @@ -1811,6 +1812,16 @@ impl<'tcx> Ty<'tcx> {
}
}

impl<'tcx> rustc_type_ir::new::Ty<TyCtxt<'tcx>> for Ty<'tcx> {
fn new(tcx: TyCtxt<'tcx>, kind: ty::TyKind<'tcx>) -> Self {
Ty::new(tcx, kind)
}

fn new_anon_bound(tcx: TyCtxt<'tcx>, debruijn: ty::DebruijnIndex, var: ty::BoundVar) -> Self {
Ty::new_bound(tcx, debruijn, ty::BoundTy { var, kind: ty::BoundTyKind::Anon })
}
}

/// Type utilities
impl<'tcx> Ty<'tcx> {
#[inline(always)]
Expand Down
7 changes: 4 additions & 3 deletions compiler/rustc_next_trait_solver/src/canonicalizer.rs
@@ -1,6 +1,7 @@
use std::cmp::Ordering;

use rustc_type_ir::fold::{TypeFoldable, TypeFolder, TypeSuperFoldable};
use rustc_type_ir::new::{Const, Region, Ty};
use rustc_type_ir::visit::TypeVisitableExt;
use rustc_type_ir::{
self as ty, Canonical, CanonicalTyVarKind, CanonicalVarInfo, CanonicalVarKind, ConstTy,
Expand Down Expand Up @@ -293,7 +294,7 @@ impl<Infcx: InferCtxtLike<Interner = I>, I: Interner> TypeFolder<I>
var
});

self.interner().mk_bound_region(self.binder_index, var)
Region::new_anon_bound(self.interner(), self.binder_index, var)
}

fn fold_ty(&mut self, t: I::Ty) -> I::Ty
Expand Down Expand Up @@ -375,7 +376,7 @@ impl<Infcx: InferCtxtLike<Interner = I>, I: Interner> TypeFolder<I>
}),
);

self.interner().mk_bound_ty(self.binder_index, var)
Ty::new_anon_bound(self.interner(), self.binder_index, var)
}

fn fold_const(&mut self, c: I::Const) -> I::Const
Expand Down Expand Up @@ -435,6 +436,6 @@ impl<Infcx: InferCtxtLike<Interner = I>, I: Interner> TypeFolder<I>
}),
);

self.interner().mk_bound_const(self.binder_index, var, c.ty())
Const::new_anon_bound(self.interner(), self.binder_index, var, c.ty())
}
}
18 changes: 8 additions & 10 deletions compiler/rustc_type_ir/src/interner.rs
Expand Up @@ -4,8 +4,8 @@ use std::hash::Hash;

use crate::visit::{Flags, TypeSuperVisitable, TypeVisitable};
use crate::{
BoundVar, BoundVars, CanonicalVarInfo, ConstKind, DebruijnIndex, DebugWithInfcx, RegionKind,
TyKind, UniverseIndex,
new, BoundVar, BoundVars, CanonicalVarInfo, ConstKind, DebugWithInfcx, RegionKind, TyKind,
UniverseIndex,
};

pub trait Interner: Sized {
Expand Down Expand Up @@ -34,7 +34,8 @@ pub trait Interner: Sized {
+ Into<Self::GenericArg>
+ IntoKind<Kind = TyKind<Self>>
+ TypeSuperVisitable<Self>
+ Flags;
+ Flags
+ new::Ty<Self>;
type Tys: Copy + Debug + Hash + Ord + IntoIterator<Item = Self::Ty>;
type AliasTy: Copy + DebugWithInfcx<Self> + Hash + Ord;
type ParamTy: Copy + Debug + Hash + Ord;
Expand All @@ -56,7 +57,8 @@ pub trait Interner: Sized {
+ IntoKind<Kind = ConstKind<Self>>
+ ConstTy<Self>
+ TypeSuperVisitable<Self>
+ Flags;
+ Flags
+ new::Const<Self>;
type AliasConst: Copy + DebugWithInfcx<Self> + Hash + Ord;
type PlaceholderConst: Copy + Debug + Hash + Ord + PlaceholderLike;
type ParamConst: Copy + Debug + Hash + Ord;
Expand All @@ -71,7 +73,8 @@ pub trait Interner: Sized {
+ Ord
+ Into<Self::GenericArg>
+ IntoKind<Kind = RegionKind<Self>>
+ Flags;
+ Flags
+ new::Region<Self>;
type EarlyParamRegion: Copy + Debug + Hash + Ord;
type LateParamRegion: Copy + Debug + Hash + Ord;
type BoundRegion: Copy + Debug + Hash + Ord;
Expand All @@ -90,11 +93,6 @@ pub trait Interner: Sized {
type ClosureKind: Copy + Debug + Hash + Eq;

fn mk_canonical_var_infos(self, infos: &[CanonicalVarInfo<Self>]) -> Self::CanonicalVars;

// FIXME: We should not have all these constructors on `Interner`, but as functions on some trait.
fn mk_bound_ty(self, debruijn: DebruijnIndex, var: BoundVar) -> Self::Ty;
fn mk_bound_region(self, debruijn: DebruijnIndex, var: BoundVar) -> Self::Region;
fn mk_bound_const(self, debruijn: DebruijnIndex, var: BoundVar, ty: Self::Ty) -> Self::Const;
}

/// Common capabilities of placeholder kinds
Expand Down
1 change: 1 addition & 0 deletions compiler/rustc_type_ir/src/lib.rs
Expand Up @@ -24,6 +24,7 @@ use std::sync::Arc as Lrc;
#[cfg(feature = "nightly")]
pub mod codec;
pub mod fold;
pub mod new;
pub mod ty_info;
pub mod ty_kind;
pub mod visit;
Expand Down
19 changes: 19 additions & 0 deletions compiler/rustc_type_ir/src/new.rs
@@ -0,0 +1,19 @@
use crate::{BoundVar, ConstKind, DebruijnIndex, Interner, RegionKind, TyKind};

pub trait Ty<I: Interner<Ty = Self>> {
fn new(interner: I, kind: TyKind<I>) -> Self;

fn new_anon_bound(interner: I, debruijn: DebruijnIndex, var: BoundVar) -> Self;
}

pub trait Region<I: Interner<Region = Self>> {
fn new(interner: I, kind: RegionKind<I>) -> Self;

fn new_anon_bound(interner: I, debruijn: DebruijnIndex, var: BoundVar) -> Self;
}

pub trait Const<I: Interner<Const = Self>> {
fn new(interner: I, kind: ConstKind<I>, ty: I::Ty) -> Self;

fn new_anon_bound(interner: I, debruijn: DebruijnIndex, var: BoundVar, ty: I::Ty) -> Self;
}

0 comments on commit 04cff47

Please sign in to comment.