11use rustc_data_structures:: fx:: FxHashMap ;
22use rustc_hir as hir;
3+ use rustc_hir:: def:: DefKind ;
34use rustc_hir:: def_id:: { DefId , LocalDefId } ;
45use rustc_hir:: definitions:: DefPathData ;
56use rustc_hir:: intravisit:: { self , Visitor } ;
@@ -11,6 +12,7 @@ pub fn provide(providers: &mut ty::query::Providers) {
1112 associated_item_def_ids,
1213 associated_items,
1314 associated_items_for_impl_trait_in_trait,
15+ associated_item_for_impl_trait_in_trait,
1416 impl_item_implementor_ids,
1517 ..* providers
1618 } ;
@@ -135,14 +137,24 @@ fn associated_items_for_impl_trait_in_trait(tcx: TyCtxt<'_>, fn_def_id: DefId) -
135137 if let Some ( output) = tcx. hir ( ) . get_fn_output ( fn_def_id. expect_local ( ) ) {
136138 visitor. visit_fn_ret_ty ( output) ;
137139
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 ( )
144142 } ) )
145143 } else {
146144 & [ ]
147145 }
148146}
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