All generated associated types for opaque types in traits/impls have the same parent

This commit is contained in:
Oli Scherer
2026-04-24 12:50:21 +02:00
parent e90878b9f2
commit bfb085da9f
+11 -13
View File
@@ -1,8 +1,6 @@
use rustc_hir::def::DefKind; use rustc_hir::def::DefKind;
use rustc_hir::def_id::{DefId, DefIdMap, LocalDefId, LocalDefIdMap}; use rustc_hir::def_id::{DefId, DefIdMap, LocalDefId};
use rustc_hir::definitions::{ use rustc_hir::definitions::{DefPathData, PerParentDisambiguatorState};
DefPathData, PerParentDisambiguatorState, PerParentDisambiguatorsMap,
};
use rustc_hir::intravisit::{self, Visitor}; use rustc_hir::intravisit::{self, Visitor};
use rustc_hir::{self as hir, ConstItemRhs, ImplItemImplKind, ItemKind}; use rustc_hir::{self as hir, ConstItemRhs, ImplItemImplKind, ItemKind};
use rustc_middle::query::Providers; use rustc_middle::query::Providers;
@@ -131,7 +129,7 @@ struct RPITVisitor<'a, 'tcx> {
tcx: TyCtxt<'tcx>, tcx: TyCtxt<'tcx>,
synthetics: Vec<LocalDefId>, synthetics: Vec<LocalDefId>,
data: DefPathData, data: DefPathData,
disambiguators: &'a mut LocalDefIdMap<PerParentDisambiguatorState>, disambiguator: &'a mut PerParentDisambiguatorState,
} }
impl<'tcx> Visitor<'tcx> for RPITVisitor<'_, 'tcx> { impl<'tcx> Visitor<'tcx> for RPITVisitor<'_, 'tcx> {
@@ -140,7 +138,7 @@ fn visit_opaque_ty(&mut self, opaque: &'tcx hir::OpaqueTy<'tcx>) -> Self::Result
self.tcx, self.tcx,
opaque.def_id, opaque.def_id,
self.data, self.data,
&mut self.disambiguators, &mut self.disambiguator,
)); ));
intravisit::walk_opaque_ty(self, opaque) intravisit::walk_opaque_ty(self, opaque)
} }
@@ -151,7 +149,7 @@ fn associated_types_for_impl_traits_in_trait_or_impl<'tcx>(
def_id: LocalDefId, def_id: LocalDefId,
) -> DefIdMap<Vec<DefId>> { ) -> DefIdMap<Vec<DefId>> {
let item = tcx.hir_expect_item(def_id); let item = tcx.hir_expect_item(def_id);
let disambiguators = &mut Default::default(); let disambiguator = &mut PerParentDisambiguatorState::new(def_id);
match item.kind { match item.kind {
ItemKind::Trait(.., trait_item_refs) => trait_item_refs ItemKind::Trait(.., trait_item_refs) => trait_item_refs
.iter() .iter()
@@ -165,7 +163,7 @@ fn associated_types_for_impl_traits_in_trait_or_impl<'tcx>(
}; };
let def_name = tcx.item_name(fn_def_id.to_def_id()); let def_name = tcx.item_name(fn_def_id.to_def_id());
let data = DefPathData::AnonAssocTy(def_name); let data = DefPathData::AnonAssocTy(def_name);
let mut visitor = RPITVisitor { tcx, synthetics: vec![], data, disambiguators }; let mut visitor = RPITVisitor { tcx, synthetics: vec![], data, disambiguator };
visitor.visit_fn_ret_ty(output); visitor.visit_fn_ret_ty(output);
let defs = visitor let defs = visitor
.synthetics .synthetics
@@ -199,7 +197,7 @@ fn associated_types_for_impl_traits_in_trait_or_impl<'tcx>(
return Some((did, vec![])); return Some((did, vec![]));
}; };
let iter = in_trait_def[&trait_item_def_id].iter().map(|&id| { let iter = in_trait_def[&trait_item_def_id].iter().map(|&id| {
associated_type_for_impl_trait_in_impl(tcx, id, item, disambiguators) associated_type_for_impl_trait_in_impl(tcx, id, item, disambiguator)
.to_def_id() .to_def_id()
}); });
Some((did, iter.collect())) Some((did, iter.collect()))
@@ -223,7 +221,7 @@ fn associated_type_for_impl_trait_in_trait(
tcx: TyCtxt<'_>, tcx: TyCtxt<'_>,
opaque_ty_def_id: LocalDefId, opaque_ty_def_id: LocalDefId,
data: DefPathData, data: DefPathData,
disambiguators: &mut LocalDefIdMap<PerParentDisambiguatorState>, disambiguator: &mut PerParentDisambiguatorState,
) -> LocalDefId { ) -> LocalDefId {
let (hir::OpaqueTyOrigin::FnReturn { parent: fn_def_id, .. } let (hir::OpaqueTyOrigin::FnReturn { parent: fn_def_id, .. }
| hir::OpaqueTyOrigin::AsyncFn { parent: fn_def_id, .. }) = | hir::OpaqueTyOrigin::AsyncFn { parent: fn_def_id, .. }) =
@@ -242,7 +240,7 @@ fn associated_type_for_impl_trait_in_trait(
None, None,
DefKind::AssocTy, DefKind::AssocTy,
Some(data), Some(data),
disambiguators.get_or_create(trait_def_id), disambiguator,
); );
let local_def_id = trait_assoc_ty.def_id(); let local_def_id = trait_assoc_ty.def_id();
@@ -285,7 +283,7 @@ fn associated_type_for_impl_trait_in_impl(
tcx: TyCtxt<'_>, tcx: TyCtxt<'_>,
trait_assoc_def_id: DefId, trait_assoc_def_id: DefId,
impl_fn: &hir::ImplItem<'_>, impl_fn: &hir::ImplItem<'_>,
disambiguators: &mut LocalDefIdMap<PerParentDisambiguatorState>, disambiguator: &mut PerParentDisambiguatorState,
) -> LocalDefId { ) -> LocalDefId {
let impl_local_def_id = tcx.local_parent(impl_fn.owner_id.def_id); let impl_local_def_id = tcx.local_parent(impl_fn.owner_id.def_id);
@@ -308,7 +306,7 @@ fn associated_type_for_impl_trait_in_impl(
None, None,
DefKind::AssocTy, DefKind::AssocTy,
Some(data), Some(data),
disambiguators.get_or_create(impl_local_def_id), disambiguator,
); );
let local_def_id = impl_assoc_ty.def_id(); let local_def_id = impl_assoc_ty.def_id();