66// Prefer importing stable_mir over internal rustc constructs to make this file more readable.
77use crate :: rustc_smir:: Tables ;
88use rustc_middle:: ty:: { self as rustc_ty, Ty as InternalTy } ;
9- use stable_mir:: ty:: { Const , GenericArgKind , GenericArgs , Region , Ty } ;
10- use stable_mir:: DefId ;
9+ use rustc_span:: Symbol ;
10+ use stable_mir:: mir:: mono:: { Instance , MonoItem , StaticDef } ;
11+ use stable_mir:: ty:: {
12+ Binder , BoundRegionKind , BoundTyKind , BoundVariableKind , ClosureKind , Const , GenericArgKind ,
13+ GenericArgs , Region , TraitRef , Ty ,
14+ } ;
15+ use stable_mir:: { AllocId , CrateItem , DefId } ;
1116
1217use super :: RustcInternal ;
1318
19+ impl < ' tcx > RustcInternal < ' tcx > for CrateItem {
20+ type T = rustc_span:: def_id:: DefId ;
21+ fn internal ( & self , tables : & mut Tables < ' tcx > ) -> Self :: T {
22+ self . 0 . internal ( tables)
23+ }
24+ }
25+
1426impl < ' tcx > RustcInternal < ' tcx > for DefId {
1527 type T = rustc_span:: def_id:: DefId ;
1628 fn internal ( & self , tables : & mut Tables < ' tcx > ) -> Self :: T {
@@ -38,8 +50,9 @@ impl<'tcx> RustcInternal<'tcx> for GenericArgKind {
3850
3951impl < ' tcx > RustcInternal < ' tcx > for Region {
4052 type T = rustc_ty:: Region < ' tcx > ;
41- fn internal ( & self , _tables : & mut Tables < ' tcx > ) -> Self :: T {
42- todo ! ( )
53+ fn internal ( & self , tables : & mut Tables < ' tcx > ) -> Self :: T {
54+ // Cannot recover region. Use erased instead.
55+ tables. tcx . lifetimes . re_erased
4356 }
4457}
4558
@@ -65,3 +78,118 @@ impl<'tcx> RustcInternal<'tcx> for Const {
6578 tables. constants [ self . id ]
6679 }
6780}
81+
82+ impl < ' tcx > RustcInternal < ' tcx > for MonoItem {
83+ type T = rustc_middle:: mir:: mono:: MonoItem < ' tcx > ;
84+
85+ fn internal ( & self , tables : & mut Tables < ' tcx > ) -> Self :: T {
86+ use rustc_middle:: mir:: mono as rustc_mono;
87+ match self {
88+ MonoItem :: Fn ( instance) => rustc_mono:: MonoItem :: Fn ( instance. internal ( tables) ) ,
89+ MonoItem :: Static ( def) => rustc_mono:: MonoItem :: Static ( def. internal ( tables) ) ,
90+ MonoItem :: GlobalAsm ( _) => {
91+ unimplemented ! ( )
92+ }
93+ }
94+ }
95+ }
96+
97+ impl < ' tcx > RustcInternal < ' tcx > for Instance {
98+ type T = rustc_ty:: Instance < ' tcx > ;
99+
100+ fn internal ( & self , tables : & mut Tables < ' tcx > ) -> Self :: T {
101+ tables. instances [ self . def ]
102+ }
103+ }
104+
105+ impl < ' tcx > RustcInternal < ' tcx > for StaticDef {
106+ type T = rustc_span:: def_id:: DefId ;
107+
108+ fn internal ( & self , tables : & mut Tables < ' tcx > ) -> Self :: T {
109+ self . 0 . internal ( tables)
110+ }
111+ }
112+
113+ #[ allow( rustc:: usage_of_qualified_ty) ]
114+ impl < ' tcx , T > RustcInternal < ' tcx > for Binder < T >
115+ where
116+ T : RustcInternal < ' tcx > ,
117+ T :: T : rustc_ty:: TypeVisitable < rustc_ty:: TyCtxt < ' tcx > > ,
118+ {
119+ type T = rustc_ty:: Binder < ' tcx , T :: T > ;
120+
121+ fn internal ( & self , tables : & mut Tables < ' tcx > ) -> Self :: T {
122+ rustc_ty:: Binder :: bind_with_vars (
123+ self . value . internal ( tables) ,
124+ tables. tcx . mk_bound_variable_kinds_from_iter (
125+ self . bound_vars . iter ( ) . map ( |bound| bound. internal ( tables) ) ,
126+ ) ,
127+ )
128+ }
129+ }
130+
131+ impl < ' tcx > RustcInternal < ' tcx > for BoundVariableKind {
132+ type T = rustc_ty:: BoundVariableKind ;
133+
134+ fn internal ( & self , tables : & mut Tables < ' tcx > ) -> Self :: T {
135+ match self {
136+ BoundVariableKind :: Ty ( kind) => rustc_ty:: BoundVariableKind :: Ty ( match kind {
137+ BoundTyKind :: Anon => rustc_ty:: BoundTyKind :: Anon ,
138+ BoundTyKind :: Param ( def, symbol) => {
139+ rustc_ty:: BoundTyKind :: Param ( def. 0 . internal ( tables) , Symbol :: intern ( & symbol) )
140+ }
141+ } ) ,
142+ BoundVariableKind :: Region ( kind) => rustc_ty:: BoundVariableKind :: Region ( match kind {
143+ BoundRegionKind :: BrAnon => rustc_ty:: BoundRegionKind :: BrAnon ,
144+ BoundRegionKind :: BrNamed ( def, symbol) => rustc_ty:: BoundRegionKind :: BrNamed (
145+ def. 0 . internal ( tables) ,
146+ Symbol :: intern ( & symbol) ,
147+ ) ,
148+ BoundRegionKind :: BrEnv => rustc_ty:: BoundRegionKind :: BrEnv ,
149+ } ) ,
150+ BoundVariableKind :: Const => rustc_ty:: BoundVariableKind :: Const ,
151+ }
152+ }
153+ }
154+
155+ impl < ' tcx > RustcInternal < ' tcx > for TraitRef {
156+ type T = rustc_ty:: TraitRef < ' tcx > ;
157+
158+ fn internal ( & self , tables : & mut Tables < ' tcx > ) -> Self :: T {
159+ rustc_ty:: TraitRef :: new (
160+ tables. tcx ,
161+ self . def_id . 0 . internal ( tables) ,
162+ self . args ( ) . internal ( tables) ,
163+ )
164+ }
165+ }
166+
167+ impl < ' tcx > RustcInternal < ' tcx > for AllocId {
168+ type T = rustc_middle:: mir:: interpret:: AllocId ;
169+ fn internal ( & self , tables : & mut Tables < ' tcx > ) -> Self :: T {
170+ tables. alloc_ids [ * self ]
171+ }
172+ }
173+
174+ impl < ' tcx > RustcInternal < ' tcx > for ClosureKind {
175+ type T = rustc_ty:: ClosureKind ;
176+
177+ fn internal ( & self , _tables : & mut Tables < ' tcx > ) -> Self :: T {
178+ match self {
179+ ClosureKind :: Fn => rustc_ty:: ClosureKind :: Fn ,
180+ ClosureKind :: FnMut => rustc_ty:: ClosureKind :: FnMut ,
181+ ClosureKind :: FnOnce => rustc_ty:: ClosureKind :: FnOnce ,
182+ }
183+ }
184+ }
185+
186+ impl < ' tcx , T > RustcInternal < ' tcx > for & T
187+ where
188+ T : RustcInternal < ' tcx > ,
189+ {
190+ type T = T :: T ;
191+
192+ fn internal ( & self , tables : & mut Tables < ' tcx > ) -> Self :: T {
193+ ( * self ) . internal ( tables)
194+ }
195+ }
0 commit comments