mirror of
https://github.com/rust-lang/rust.git
synced 2026-04-26 13:01:27 +03:00
All generated associated types for opaque types in traits/impls have the same parent
This commit is contained in:
@@ -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();
|
||||||
|
|||||||
Reference in New Issue
Block a user