Skip to content

Commit b7dd609

Browse files
committed
Add associated_item_for_impl_trait_in_trait query
1 parent 4e703a2 commit b7dd609

File tree

2 files changed

+26
-6
lines changed

2 files changed

+26
-6
lines changed

compiler/rustc_middle/src/query/mod.rs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -774,6 +774,14 @@ rustc_queries! {
774774
separate_provide_extern
775775
}
776776

777+
/// Given an impl trait in trait `opaque_ty_def_id`, create and return the corresponding
778+
/// associated item.
779+
query associated_item_for_impl_trait_in_trait(opaque_ty_def_id: LocalDefId) -> LocalDefId {
780+
desc { |tcx| "creates the associated item corresponding to the opaque type `{}`", tcx.def_path_str(opaque_ty_def_id.to_def_id()) }
781+
cache_on_disk_if { true }
782+
separate_provide_extern
783+
}
784+
777785
/// Given an `impl_id`, return the trait it implements.
778786
/// Return `None` if this is an inherent impl.
779787
query impl_trait_ref(impl_id: DefId) -> Option<ty::EarlyBinder<ty::TraitRef<'tcx>>> {

compiler/rustc_ty_utils/src/assoc.rs

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
use rustc_data_structures::fx::FxHashMap;
22
use rustc_hir as hir;
3+
use rustc_hir::def::DefKind;
34
use rustc_hir::def_id::{DefId, LocalDefId};
45
use rustc_hir::definitions::DefPathData;
56
use 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

Comments
 (0)