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
|
@ -1986,27 +1986,25 @@ impl<'tcx> TyCtxt<'tcx> {
|
|||
.filter(|item| item.kind == AssocKind::Fn && item.defaultness.has_value())
|
||||
}
|
||||
|
||||
fn item_name_from_hir(self, def_id: DefId) -> Option<Ident> {
|
||||
self.hir().get_if_local(def_id).and_then(|node| node.ident())
|
||||
}
|
||||
|
||||
fn item_name_from_def_id(self, def_id: DefId) -> Option<Symbol> {
|
||||
fn opt_item_name(self, def_id: DefId) -> Option<Symbol> {
|
||||
if def_id.index == CRATE_DEF_INDEX {
|
||||
Some(self.crate_name(def_id.krate))
|
||||
} else {
|
||||
let def_key = self.def_key(def_id);
|
||||
match def_key.disambiguated_data.data {
|
||||
// The name of a constructor is that of its parent.
|
||||
rustc_hir::definitions::DefPathData::Ctor => self.item_name_from_def_id(DefId {
|
||||
krate: def_id.krate,
|
||||
index: def_key.parent.unwrap(),
|
||||
}),
|
||||
_ => def_key.disambiguated_data.data.get_opt_name(),
|
||||
rustc_hir::definitions::DefPathData::Ctor => self
|
||||
.opt_item_name(DefId { krate: def_id.krate, index: def_key.parent.unwrap() }),
|
||||
// The name of opaque types only exists in HIR.
|
||||
rustc_hir::definitions::DefPathData::ImplTrait
|
||||
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
|
||||
/// [`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 {
|
||||
// Look at cross-crate items first to avoid invalidating the incremental cache
|
||||
// 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));
|
||||
})
|
||||
}
|
||||
|
||||
/// 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.
|
||||
pub fn opt_item_name(self, def_id: DefId) -> Option<Ident> {
|
||||
// Look at the HIR first so the span will be correct if this is a local item.
|
||||
self.item_name_from_hir(def_id)
|
||||
.or_else(|| self.item_name_from_def_id(def_id).map(Ident::with_dummy_span))
|
||||
pub fn opt_item_ident(self, def_id: DefId) -> Option<Ident> {
|
||||
let def = self.opt_item_name(def_id)?;
|
||||
let span = def_id
|
||||
.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> {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue