Use def_key in tcx.item_name
when possible.
This commit is contained in:
parent
b5dfa6a78d
commit
f89d64d7aa
10 changed files with 41 additions and 42 deletions
|
@ -147,6 +147,11 @@ impl DefKey {
|
||||||
// DefPathHashes in this DefPathTable.
|
// DefPathHashes in this DefPathTable.
|
||||||
DefPathHash::new(parent.stable_crate_id(), local_hash)
|
DefPathHash::new(parent.stable_crate_id(), local_hash)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[inline]
|
||||||
|
pub fn get_opt_name(&self) -> Option<Symbol> {
|
||||||
|
self.disambiguated_data.data.get_opt_name()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// A pair of `DefPathData` and an integer disambiguator. The integer is
|
/// A pair of `DefPathData` and an integer disambiguator. The integer is
|
||||||
|
|
|
@ -554,13 +554,12 @@ impl<'hir> Map<'hir> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn ty_param_name(self, id: HirId) -> Symbol {
|
pub fn ty_param_name(self, def_id: LocalDefId) -> Symbol {
|
||||||
match self.get(id) {
|
let def_kind = self.tcx.def_kind(def_id);
|
||||||
Node::Item(&Item { kind: ItemKind::Trait(..) | ItemKind::TraitAlias(..), .. }) => {
|
match def_kind {
|
||||||
kw::SelfUpper
|
DefKind::Trait | DefKind::TraitAlias => kw::SelfUpper,
|
||||||
}
|
DefKind::TyParam | DefKind::ConstParam => self.tcx.item_name(def_id.to_def_id()),
|
||||||
Node::GenericParam(param) => param.name.ident().name,
|
_ => bug!("ty_param_name: {:?} is a {:?} not a type parameter", def_id, def_kind),
|
||||||
_ => bug!("ty_param_name: {} not a type parameter", self.node_to_string(id)),
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -517,10 +517,7 @@ rustc_queries! {
|
||||||
/// To avoid cycles within the predicates of a single item we compute
|
/// To avoid cycles within the predicates of a single item we compute
|
||||||
/// per-type-parameter predicates for resolving `T::AssocTy`.
|
/// per-type-parameter predicates for resolving `T::AssocTy`.
|
||||||
query type_param_predicates(key: (DefId, LocalDefId, rustc_span::symbol::Ident)) -> ty::GenericPredicates<'tcx> {
|
query type_param_predicates(key: (DefId, LocalDefId, rustc_span::symbol::Ident)) -> ty::GenericPredicates<'tcx> {
|
||||||
desc { |tcx| "computing the bounds for type parameter `{}`", {
|
desc { |tcx| "computing the bounds for type parameter `{}`", tcx.hir().ty_param_name(key.1) }
|
||||||
let id = tcx.hir().local_def_id_to_hir_id(key.1);
|
|
||||||
tcx.hir().ty_param_name(id)
|
|
||||||
}}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
query trait_def(key: DefId) -> ty::TraitDef {
|
query trait_def(key: DefId) -> ty::TraitDef {
|
||||||
|
|
|
@ -1986,27 +1986,25 @@ impl<'tcx> TyCtxt<'tcx> {
|
||||||
.filter(|item| item.kind == AssocKind::Fn && item.defaultness.has_value())
|
.filter(|item| item.kind == AssocKind::Fn && item.defaultness.has_value())
|
||||||
}
|
}
|
||||||
|
|
||||||
fn item_name_from_hir(self, def_id: DefId) -> Option<Ident> {
|
fn opt_item_name(self, def_id: DefId) -> Option<Symbol> {
|
||||||
self.hir().get_if_local(def_id).and_then(|node| node.ident())
|
|
||||||
}
|
|
||||||
|
|
||||||
fn item_name_from_def_id(self, def_id: DefId) -> Option<Symbol> {
|
|
||||||
if def_id.index == CRATE_DEF_INDEX {
|
if def_id.index == CRATE_DEF_INDEX {
|
||||||
Some(self.crate_name(def_id.krate))
|
Some(self.crate_name(def_id.krate))
|
||||||
} else {
|
} else {
|
||||||
let def_key = self.def_key(def_id);
|
let def_key = self.def_key(def_id);
|
||||||
match def_key.disambiguated_data.data {
|
match def_key.disambiguated_data.data {
|
||||||
// The name of a constructor is that of its parent.
|
// The name of a constructor is that of its parent.
|
||||||
rustc_hir::definitions::DefPathData::Ctor => self.item_name_from_def_id(DefId {
|
rustc_hir::definitions::DefPathData::Ctor => self
|
||||||
krate: def_id.krate,
|
.opt_item_name(DefId { krate: def_id.krate, index: def_key.parent.unwrap() }),
|
||||||
index: def_key.parent.unwrap(),
|
// The name of opaque types only exists in HIR.
|
||||||
}),
|
rustc_hir::definitions::DefPathData::ImplTrait
|
||||||
_ => def_key.disambiguated_data.data.get_opt_name(),
|
if let Some(def_id) = def_id.as_local() =>
|
||||||
|
self.hir().opt_name(self.hir().local_def_id_to_hir_id(def_id)),
|
||||||
|
_ => def_key.get_opt_name(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Look up the name of an item across crates. This does not look at HIR.
|
/// Look up the name of a definition across crates. This does not look at HIR.
|
||||||
///
|
///
|
||||||
/// When possible, this function should be used for cross-crate lookups over
|
/// When possible, this function should be used for cross-crate lookups over
|
||||||
/// [`opt_item_name`] to avoid invalidating the incremental cache. If you
|
/// [`opt_item_name`] to avoid invalidating the incremental cache. If you
|
||||||
|
@ -2018,18 +2016,21 @@ impl<'tcx> TyCtxt<'tcx> {
|
||||||
pub fn item_name(self, id: DefId) -> Symbol {
|
pub fn item_name(self, id: DefId) -> Symbol {
|
||||||
// Look at cross-crate items first to avoid invalidating the incremental cache
|
// Look at cross-crate items first to avoid invalidating the incremental cache
|
||||||
// unless we have to.
|
// unless we have to.
|
||||||
self.item_name_from_def_id(id).unwrap_or_else(|| {
|
self.opt_item_name(id).unwrap_or_else(|| {
|
||||||
bug!("item_name: no name for {:?}", self.def_path(id));
|
bug!("item_name: no name for {:?}", self.def_path(id));
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Look up the name and span of an item or [`Node`].
|
/// Look up the name and span of a definition.
|
||||||
///
|
///
|
||||||
/// See [`item_name`][Self::item_name] for more information.
|
/// See [`item_name`][Self::item_name] for more information.
|
||||||
pub fn opt_item_name(self, def_id: DefId) -> Option<Ident> {
|
pub fn opt_item_ident(self, def_id: DefId) -> Option<Ident> {
|
||||||
// Look at the HIR first so the span will be correct if this is a local item.
|
let def = self.opt_item_name(def_id)?;
|
||||||
self.item_name_from_hir(def_id)
|
let span = def_id
|
||||||
.or_else(|| self.item_name_from_def_id(def_id).map(Ident::with_dummy_span))
|
.as_local()
|
||||||
|
.and_then(|id| self.def_ident_span(id))
|
||||||
|
.unwrap_or(rustc_span::DUMMY_SP);
|
||||||
|
Some(Ident::new(def, span))
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn opt_associated_item(self, def_id: DefId) -> Option<&'tcx AssocItem> {
|
pub fn opt_associated_item(self, def_id: DefId) -> Option<&'tcx AssocItem> {
|
||||||
|
|
|
@ -201,7 +201,7 @@ fn emit_unused_generic_params_error<'tcx>(
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
let fn_span = match tcx.opt_item_name(def_id) {
|
let fn_span = match tcx.opt_item_ident(def_id) {
|
||||||
Some(ident) => ident.span,
|
Some(ident) => ident.span,
|
||||||
_ => tcx.def_span(def_id),
|
_ => tcx.def_span(def_id),
|
||||||
};
|
};
|
||||||
|
|
|
@ -2064,7 +2064,7 @@ impl<'a, 'tcx> InferCtxtExt<'tcx> for InferCtxt<'a, 'tcx> {
|
||||||
ObligationCauseCode::BindingObligation(item_def_id, span) => {
|
ObligationCauseCode::BindingObligation(item_def_id, span) => {
|
||||||
let item_name = tcx.def_path_str(item_def_id);
|
let item_name = tcx.def_path_str(item_def_id);
|
||||||
let mut multispan = MultiSpan::from(span);
|
let mut multispan = MultiSpan::from(span);
|
||||||
if let Some(ident) = tcx.opt_item_name(item_def_id) {
|
if let Some(ident) = tcx.opt_item_ident(item_def_id) {
|
||||||
let sm = tcx.sess.source_map();
|
let sm = tcx.sess.source_map();
|
||||||
let same_line =
|
let same_line =
|
||||||
match (sm.lookup_line(ident.span.hi()), sm.lookup_line(span.lo())) {
|
match (sm.lookup_line(ident.span.hi()), sm.lookup_line(span.lo())) {
|
||||||
|
@ -2267,7 +2267,7 @@ impl<'a, 'tcx> InferCtxtExt<'tcx> for InferCtxt<'a, 'tcx> {
|
||||||
if !is_upvar_tys_infer_tuple {
|
if !is_upvar_tys_infer_tuple {
|
||||||
let msg = format!("required because it appears within the type `{}`", ty);
|
let msg = format!("required because it appears within the type `{}`", ty);
|
||||||
match ty.kind() {
|
match ty.kind() {
|
||||||
ty::Adt(def, _) => match self.tcx.opt_item_name(def.did()) {
|
ty::Adt(def, _) => match self.tcx.opt_item_ident(def.did()) {
|
||||||
Some(ident) => err.span_note(ident.span, &msg),
|
Some(ident) => err.span_note(ident.span, &msg),
|
||||||
None => err.note(&msg),
|
None => err.note(&msg),
|
||||||
},
|
},
|
||||||
|
@ -2475,7 +2475,7 @@ impl<'a, 'tcx> InferCtxtExt<'tcx> for InferCtxt<'a, 'tcx> {
|
||||||
);
|
);
|
||||||
let sp = self
|
let sp = self
|
||||||
.tcx
|
.tcx
|
||||||
.opt_item_name(trait_item_def_id)
|
.opt_item_ident(trait_item_def_id)
|
||||||
.map(|i| i.span)
|
.map(|i| i.span)
|
||||||
.unwrap_or_else(|| self.tcx.def_span(trait_item_def_id));
|
.unwrap_or_else(|| self.tcx.def_span(trait_item_def_id));
|
||||||
let mut assoc_span: MultiSpan = sp.into();
|
let mut assoc_span: MultiSpan = sp.into();
|
||||||
|
@ -2486,7 +2486,7 @@ impl<'a, 'tcx> InferCtxtExt<'tcx> for InferCtxt<'a, 'tcx> {
|
||||||
if let Some(ident) = self
|
if let Some(ident) = self
|
||||||
.tcx
|
.tcx
|
||||||
.opt_associated_item(trait_item_def_id)
|
.opt_associated_item(trait_item_def_id)
|
||||||
.and_then(|i| self.tcx.opt_item_name(i.container.id()))
|
.and_then(|i| self.tcx.opt_item_ident(i.container.id()))
|
||||||
{
|
{
|
||||||
assoc_span.push_span_label(ident.span, "in this trait");
|
assoc_span.push_span_label(ident.span, "in this trait");
|
||||||
}
|
}
|
||||||
|
@ -2511,7 +2511,7 @@ impl<'a, 'tcx> InferCtxtExt<'tcx> for InferCtxt<'a, 'tcx> {
|
||||||
if let Some(ident) = self
|
if let Some(ident) = self
|
||||||
.tcx
|
.tcx
|
||||||
.opt_associated_item(trait_item_def_id)
|
.opt_associated_item(trait_item_def_id)
|
||||||
.and_then(|i| self.tcx.opt_item_name(i.container.id()))
|
.and_then(|i| self.tcx.opt_item_ident(i.container.id()))
|
||||||
{
|
{
|
||||||
assoc_span.push_span_label(ident.span, "in this trait");
|
assoc_span.push_span_label(ident.span, "in this trait");
|
||||||
}
|
}
|
||||||
|
|
|
@ -82,8 +82,7 @@ impl<'o, 'tcx> dyn AstConv<'tcx> + 'o {
|
||||||
}
|
}
|
||||||
Res::Def(DefKind::TyParam, src_def_id) => {
|
Res::Def(DefKind::TyParam, src_def_id) => {
|
||||||
if let Some(param_local_id) = param.def_id.as_local() {
|
if let Some(param_local_id) = param.def_id.as_local() {
|
||||||
let param_hir_id = tcx.hir().local_def_id_to_hir_id(param_local_id);
|
let param_name = tcx.hir().ty_param_name(param_local_id);
|
||||||
let param_name = tcx.hir().ty_param_name(param_hir_id);
|
|
||||||
let param_type = tcx.infer_ctxt().enter(|infcx| {
|
let param_type = tcx.infer_ctxt().enter(|infcx| {
|
||||||
infcx.resolve_numeric_literals_with_default(tcx.type_of(param.def_id))
|
infcx.resolve_numeric_literals_with_default(tcx.type_of(param.def_id))
|
||||||
});
|
});
|
||||||
|
|
|
@ -1620,8 +1620,7 @@ impl<'o, 'tcx> dyn AstConv<'tcx> + 'o {
|
||||||
|
|
||||||
debug!("find_bound_for_assoc_item: predicates={:#?}", predicates);
|
debug!("find_bound_for_assoc_item: predicates={:#?}", predicates);
|
||||||
|
|
||||||
let param_hir_id = tcx.hir().local_def_id_to_hir_id(ty_param_def_id);
|
let param_name = tcx.hir().ty_param_name(ty_param_def_id);
|
||||||
let param_name = tcx.hir().ty_param_name(param_hir_id);
|
|
||||||
self.one_bound_for_assoc_type(
|
self.one_bound_for_assoc_type(
|
||||||
|| {
|
|| {
|
||||||
traits::transitive_bounds_that_define_assoc_type(
|
traits::transitive_bounds_that_define_assoc_type(
|
||||||
|
@ -2266,11 +2265,10 @@ impl<'o, 'tcx> dyn AstConv<'tcx> + 'o {
|
||||||
self.prohibit_generics(path.segments);
|
self.prohibit_generics(path.segments);
|
||||||
|
|
||||||
let def_id = def_id.expect_local();
|
let def_id = def_id.expect_local();
|
||||||
let hir_id = tcx.hir().local_def_id_to_hir_id(def_id);
|
|
||||||
let item_def_id = tcx.hir().ty_param_owner(def_id);
|
let item_def_id = tcx.hir().ty_param_owner(def_id);
|
||||||
let generics = tcx.generics_of(item_def_id);
|
let generics = tcx.generics_of(item_def_id);
|
||||||
let index = generics.param_def_id_to_index[&def_id.to_def_id()];
|
let index = generics.param_def_id_to_index[&def_id.to_def_id()];
|
||||||
tcx.mk_ty_param(index, tcx.hir().name(hir_id))
|
tcx.mk_ty_param(index, tcx.hir().ty_param_name(def_id))
|
||||||
}
|
}
|
||||||
Res::SelfTy { trait_: Some(_), alias_to: None } => {
|
Res::SelfTy { trait_: Some(_), alias_to: None } => {
|
||||||
// `Self` in trait or type alias.
|
// `Self` in trait or type alias.
|
||||||
|
|
|
@ -2195,7 +2195,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
||||||
None => return,
|
None => return,
|
||||||
};
|
};
|
||||||
let param_span = self.tcx.hir().span(param_hir_id);
|
let param_span = self.tcx.hir().span(param_hir_id);
|
||||||
let param_name = self.tcx.hir().ty_param_name(param_hir_id);
|
let param_name = self.tcx.hir().ty_param_name(param_def_id.expect_local());
|
||||||
|
|
||||||
err.span_label(param_span, &format!("type parameter '{}' declared here", param_name));
|
err.span_label(param_span, &format!("type parameter '{}' declared here", param_name));
|
||||||
}
|
}
|
||||||
|
|
|
@ -561,7 +561,7 @@ fn type_param_predicates(
|
||||||
let param_owner = tcx.hir().ty_param_owner(def_id);
|
let param_owner = tcx.hir().ty_param_owner(def_id);
|
||||||
let generics = tcx.generics_of(param_owner);
|
let generics = tcx.generics_of(param_owner);
|
||||||
let index = generics.param_def_id_to_index[&def_id.to_def_id()];
|
let index = generics.param_def_id_to_index[&def_id.to_def_id()];
|
||||||
let ty = tcx.mk_ty_param(index, tcx.hir().ty_param_name(param_id));
|
let ty = tcx.mk_ty_param(index, tcx.hir().ty_param_name(def_id));
|
||||||
|
|
||||||
// Don't look for bounds where the type parameter isn't in scope.
|
// Don't look for bounds where the type parameter isn't in scope.
|
||||||
let parent = if item_def_id == param_owner.to_def_id() {
|
let parent = if item_def_id == param_owner.to_def_id() {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue