Skip to content

Commit ed32347

Browse files
committed
Add Generator to SMIR
1 parent c5c38cd commit ed32347

File tree

3 files changed

+44
-2
lines changed

3 files changed

+44
-2
lines changed

compiler/rustc_smir/src/rustc_internal/mod.rs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,10 @@ pub fn closure_def(did: DefId) -> stable_mir::ty::ClosureDef {
4343
with_tables(|t| t.closure_def(did))
4444
}
4545

46+
pub fn generator_def(did: DefId) -> stable_mir::ty::GeneratorDef {
47+
with_tables(|t| t.generator_def(did))
48+
}
49+
4650
impl<'tcx> Tables<'tcx> {
4751
pub fn item_def_id(&self, item: &stable_mir::CrateItem) -> DefId {
4852
self.def_ids[item.0]
@@ -68,6 +72,10 @@ impl<'tcx> Tables<'tcx> {
6872
stable_mir::ty::ClosureDef(self.create_def_id(did))
6973
}
7074

75+
pub fn generator_def(&mut self, did: DefId) -> stable_mir::ty::GeneratorDef {
76+
stable_mir::ty::GeneratorDef(self.create_def_id(did))
77+
}
78+
7179
fn create_def_id(&mut self, did: DefId) -> stable_mir::DefId {
7280
// FIXME: this becomes inefficient when we have too many ids
7381
for (i, &d) in self.def_ids.iter().enumerate() {

compiler/rustc_smir/src/rustc_smir/mod.rs

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,9 @@
88
//! For now, we are developing everything inside `rustc`, thus, we keep this module private.
99
1010
use crate::rustc_internal::{self, opaque};
11-
use crate::stable_mir::ty::{FloatTy, GenericArgKind, GenericArgs, IntTy, RigidTy, TyKind, UintTy};
11+
use crate::stable_mir::ty::{FloatTy, GenericArgKind, GenericArgs, IntTy, Movability, RigidTy, TyKind, UintTy};
1212
use crate::stable_mir::{self, Context};
13+
use rustc_hir as hir;
1314
use rustc_middle::mir;
1415
use rustc_middle::ty::{self, Ty, TyCtxt};
1516
use rustc_span::def_id::{CrateNum, DefId, LOCAL_CRATE};
@@ -167,7 +168,30 @@ impl<'tcx> Tables<'tcx> {
167168
.collect(),
168169
),
169170
)),
170-
ty::Generator(_, _, _) => todo!(),
171+
ty::Generator(def_id, generic_args, movability) => TyKind::RigidTy(RigidTy::Generator(
172+
rustc_internal::generator_def(*def_id),
173+
GenericArgs(
174+
generic_args
175+
.iter()
176+
.map(|arg| match arg.unpack() {
177+
ty::GenericArgKind::Lifetime(region) => {
178+
GenericArgKind::Lifetime(opaque(&region))
179+
}
180+
ty::GenericArgKind::Type(ty) => {
181+
GenericArgKind::Type(self.intern_ty(ty))
182+
}
183+
ty::GenericArgKind::Const(const_) => {
184+
GenericArgKind::Const(opaque(&const_))
185+
}
186+
})
187+
.collect(),
188+
),
189+
match movability {
190+
hir::Movability::Static => Movability::Static,
191+
hir::Movability::Movable => Movability::Movable,
192+
193+
}
194+
)),
171195
ty::Never => TyKind::RigidTy(RigidTy::Never),
172196
ty::Tuple(fields) => TyKind::RigidTy(RigidTy::Tuple(
173197
fields.iter().map(|ty| self.intern_ty(ty)).collect(),

compiler/rustc_smir/src/stable_mir/ty.rs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ pub enum RigidTy {
3434
Ref(Region, Ty, Mutability),
3535
FnDef(FnDef, GenericArgs),
3636
Closure(ClosureDef, GenericArgs),
37+
Generator(GeneratorDef, GenericArgs, Movability),
3738
Never,
3839
Tuple(Vec<Ty>),
3940
}
@@ -64,6 +65,12 @@ pub enum FloatTy {
6465
F64,
6566
}
6667

68+
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
69+
pub enum Movability {
70+
Static,
71+
Movable,
72+
}
73+
6774
#[derive(Clone, PartialEq, Eq, Debug)]
6875
pub struct ForeignDef(pub(crate) DefId);
6976

@@ -73,6 +80,9 @@ pub struct FnDef(pub(crate) DefId);
7380
#[derive(Clone, PartialEq, Eq, Debug)]
7481
pub struct ClosureDef(pub(crate) DefId);
7582

83+
#[derive(Clone, PartialEq, Eq, Debug)]
84+
pub struct GeneratorDef(pub(crate) DefId);
85+
7686
#[derive(Clone, PartialEq, Eq, Debug)]
7787
pub struct AdtDef(pub(crate) DefId);
7888

0 commit comments

Comments
 (0)