summary refs log tree commit diff
path: root/compiler/rustc_ty_utils/src
diff options
context:
space:
mode:
authorSantiago Pastorino <spastorino@gmail.com>2022-12-16 17:15:34 -0300
committerSantiago Pastorino <spastorino@gmail.com>2023-02-19 11:49:02 -0300
commitb7dd609d9c3a6a336091e502caee8a10948cc2c3 (patch)
tree16ec38e36751bd56c276e5dba18058fa068d25c7 /compiler/rustc_ty_utils/src
parent4e703a277220a3f52b4772f298535df232b6cb7c (diff)
downloadrust-b7dd609d9c3a6a336091e502caee8a10948cc2c3.tar.gz
rust-b7dd609d9c3a6a336091e502caee8a10948cc2c3.zip
Add associated_item_for_impl_trait_in_trait query
Diffstat (limited to 'compiler/rustc_ty_utils/src')
-rw-r--r--compiler/rustc_ty_utils/src/assoc.rs24
1 files changed, 18 insertions, 6 deletions
diff --git a/compiler/rustc_ty_utils/src/assoc.rs b/compiler/rustc_ty_utils/src/assoc.rs
index a6c137d2f3e..ef725c48da6 100644
--- a/compiler/rustc_ty_utils/src/assoc.rs
+++ b/compiler/rustc_ty_utils/src/assoc.rs
@@ -1,5 +1,6 @@
 use rustc_data_structures::fx::FxHashMap;
 use rustc_hir as hir;
+use rustc_hir::def::DefKind;
 use rustc_hir::def_id::{DefId, LocalDefId};
 use rustc_hir::definitions::DefPathData;
 use rustc_hir::intravisit::{self, Visitor};
@@ -11,6 +12,7 @@ pub fn provide(providers: &mut ty::query::Providers) {
         associated_item_def_ids,
         associated_items,
         associated_items_for_impl_trait_in_trait,
+        associated_item_for_impl_trait_in_trait,
         impl_item_implementor_ids,
         ..*providers
     };
@@ -135,14 +137,24 @@ fn associated_items_for_impl_trait_in_trait(tcx: TyCtxt<'_>, fn_def_id: DefId) -
     if let Some(output) = tcx.hir().get_fn_output(fn_def_id.expect_local()) {
         visitor.visit_fn_ret_ty(output);
 
-        let trait_def_id = tcx.parent(fn_def_id).expect_local();
-
-        tcx.arena.alloc_from_iter(visitor.rpits.iter().map(|_opaque_ty_def_id| {
-            let trait_assoc_ty =
-                tcx.at(output.span()).create_def(trait_def_id, DefPathData::ImplTraitAssocTy);
-            trait_assoc_ty.def_id().to_def_id()
+        tcx.arena.alloc_from_iter(visitor.rpits.iter().map(|opaque_ty_def_id| {
+            tcx.associated_item_for_impl_trait_in_trait(opaque_ty_def_id).to_def_id()
         }))
     } else {
         &[]
     }
 }
+
+fn associated_item_for_impl_trait_in_trait(
+    tcx: TyCtxt<'_>,
+    opaque_ty_def_id: LocalDefId,
+) -> LocalDefId {
+    let fn_def_id = tcx.impl_trait_in_trait_parent(opaque_ty_def_id.to_def_id());
+    let trait_def_id = tcx.parent(fn_def_id);
+    assert_eq!(tcx.def_kind(trait_def_id), DefKind::Trait);
+
+    let span = tcx.def_span(opaque_ty_def_id);
+    let trait_assoc_ty =
+        tcx.at(span).create_def(trait_def_id.expect_local(), DefPathData::ImplTraitAssocTy);
+    trait_assoc_ty.def_id()
+}