1
1
use rustc_data_structures:: fx:: FxHashMap ;
2
2
use rustc_hir as hir;
3
+ use rustc_hir:: def:: DefKind ;
3
4
use rustc_hir:: def_id:: { DefId , LocalDefId } ;
4
5
use rustc_hir:: definitions:: DefPathData ;
5
6
use rustc_hir:: intravisit:: { self , Visitor } ;
@@ -11,6 +12,7 @@ pub fn provide(providers: &mut ty::query::Providers) {
11
12
associated_item_def_ids,
12
13
associated_items,
13
14
associated_items_for_impl_trait_in_trait,
15
+ associated_item_for_impl_trait_in_trait,
14
16
impl_item_implementor_ids,
15
17
..* providers
16
18
} ;
@@ -135,14 +137,24 @@ fn associated_items_for_impl_trait_in_trait(tcx: TyCtxt<'_>, fn_def_id: DefId) -
135
137
if let Some ( output) = tcx. hir ( ) . get_fn_output ( fn_def_id. expect_local ( ) ) {
136
138
visitor. visit_fn_ret_ty ( output) ;
137
139
138
- let trait_def_id = tcx. parent ( fn_def_id) . expect_local ( ) ;
139
-
140
- tcx. arena . alloc_from_iter ( visitor. rpits . iter ( ) . map ( |_opaque_ty_def_id| {
141
- let trait_assoc_ty =
142
- tcx. at ( output. span ( ) ) . create_def ( trait_def_id, DefPathData :: ImplTraitAssocTy ) ;
143
- trait_assoc_ty. def_id ( ) . to_def_id ( )
140
+ tcx. arena . alloc_from_iter ( visitor. rpits . iter ( ) . map ( |opaque_ty_def_id| {
141
+ tcx. associated_item_for_impl_trait_in_trait ( opaque_ty_def_id) . to_def_id ( )
144
142
} ) )
145
143
} else {
146
144
& [ ]
147
145
}
148
146
}
147
+
148
+ fn associated_item_for_impl_trait_in_trait (
149
+ tcx : TyCtxt < ' _ > ,
150
+ opaque_ty_def_id : LocalDefId ,
151
+ ) -> LocalDefId {
152
+ let fn_def_id = tcx. impl_trait_in_trait_parent ( opaque_ty_def_id. to_def_id ( ) ) ;
153
+ let trait_def_id = tcx. parent ( fn_def_id) ;
154
+ assert_eq ! ( tcx. def_kind( trait_def_id) , DefKind :: Trait ) ;
155
+
156
+ let span = tcx. def_span ( opaque_ty_def_id) ;
157
+ let trait_assoc_ty =
158
+ tcx. at ( span) . create_def ( trait_def_id. expect_local ( ) , DefPathData :: ImplTraitAssocTy ) ;
159
+ trait_assoc_ty. def_id ( )
160
+ }
0 commit comments