mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-27 01:04:03 +00:00
Rollup merge of #92032 - petrochenkov:extblockpath, r=oli-obk
hir: Do not introduce dummy type names for `extern` blocks in def paths Use a separate nameless `DefPathData` variant instead. Extracted from https://github.com/rust-lang/rust/pull/91795.
This commit is contained in:
commit
5e8f934149
@ -267,6 +267,8 @@ pub enum DefPathData {
|
||||
// Different kinds of items and item-like things:
|
||||
/// An impl.
|
||||
Impl,
|
||||
/// An `extern` block.
|
||||
ForeignMod,
|
||||
/// Something in the type namespace.
|
||||
TypeNs(Symbol),
|
||||
/// Something in the value namespace.
|
||||
@ -469,7 +471,9 @@ impl DefPathData {
|
||||
match *self {
|
||||
TypeNs(name) | ValueNs(name) | MacroNs(name) | LifetimeNs(name) => Some(name),
|
||||
|
||||
Impl | CrateRoot | Misc | ClosureExpr | Ctor | AnonConst | ImplTrait => None,
|
||||
Impl | ForeignMod | CrateRoot | Misc | ClosureExpr | Ctor | AnonConst | ImplTrait => {
|
||||
None
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -482,6 +486,7 @@ impl DefPathData {
|
||||
// Note that this does not show up in user print-outs.
|
||||
CrateRoot => DefPathDataName::Anon { namespace: kw::Crate },
|
||||
Impl => DefPathDataName::Anon { namespace: kw::Impl },
|
||||
ForeignMod => DefPathDataName::Anon { namespace: kw::Extern },
|
||||
Misc => DefPathDataName::Anon { namespace: sym::misc },
|
||||
ClosureExpr => DefPathDataName::Anon { namespace: sym::closure },
|
||||
Ctor => DefPathDataName::Anon { namespace: sym::constructor },
|
||||
|
@ -1030,8 +1030,8 @@ impl<'tcx> LateContext<'tcx> {
|
||||
) -> Result<Self::Path, Self::Error> {
|
||||
let mut path = print_prefix(self)?;
|
||||
|
||||
// Skip `::{{constructor}}` on tuple/unit structs.
|
||||
if let DefPathData::Ctor = disambiguated_data.data {
|
||||
// Skip `::{{extern}}` blocks and `::{{constructor}}` on tuple/unit structs.
|
||||
if let DefPathData::ForeignMod | DefPathData::Ctor = disambiguated_data.data {
|
||||
return Ok(path);
|
||||
}
|
||||
|
||||
|
@ -1740,31 +1740,27 @@ impl<F: fmt::Write> Printer<'tcx> for FmtPrinter<'_, 'tcx, F> {
|
||||
) -> Result<Self::Path, Self::Error> {
|
||||
self = print_prefix(self)?;
|
||||
|
||||
// Skip `::{{constructor}}` on tuple/unit structs.
|
||||
if let DefPathData::Ctor = disambiguated_data.data {
|
||||
// Skip `::{{extern}}` blocks and `::{{constructor}}` on tuple/unit structs.
|
||||
if let DefPathData::ForeignMod | DefPathData::Ctor = disambiguated_data.data {
|
||||
return Ok(self);
|
||||
}
|
||||
|
||||
// FIXME(eddyb) `name` should never be empty, but it
|
||||
// currently is for `extern { ... }` "foreign modules".
|
||||
let name = disambiguated_data.data.name();
|
||||
if name != DefPathDataName::Named(kw::Empty) {
|
||||
if !self.empty_path {
|
||||
write!(self, "::")?;
|
||||
}
|
||||
|
||||
if let DefPathDataName::Named(name) = name {
|
||||
if Ident::with_dummy_span(name).is_raw_guess() {
|
||||
write!(self, "r#")?;
|
||||
}
|
||||
}
|
||||
|
||||
let verbose = self.tcx.sess.verbose();
|
||||
disambiguated_data.fmt_maybe_verbose(&mut self, verbose)?;
|
||||
|
||||
self.empty_path = false;
|
||||
if !self.empty_path {
|
||||
write!(self, "::")?;
|
||||
}
|
||||
|
||||
if let DefPathDataName::Named(name) = name {
|
||||
if Ident::with_dummy_span(name).is_raw_guess() {
|
||||
write!(self, "r#")?;
|
||||
}
|
||||
}
|
||||
|
||||
let verbose = self.tcx.sess.verbose();
|
||||
disambiguated_data.fmt_maybe_verbose(&mut self, verbose)?;
|
||||
|
||||
self.empty_path = false;
|
||||
|
||||
Ok(self)
|
||||
}
|
||||
|
||||
|
@ -92,6 +92,7 @@ impl<'a, 'b> visit::Visitor<'a> for DefCollector<'a, 'b> {
|
||||
// information we encapsulate into, the better
|
||||
let def_data = match &i.kind {
|
||||
ItemKind::Impl { .. } => DefPathData::Impl,
|
||||
ItemKind::ForeignMod(..) => DefPathData::ForeignMod,
|
||||
ItemKind::Mod(..)
|
||||
| ItemKind::Trait(..)
|
||||
| ItemKind::TraitAlias(..)
|
||||
@ -99,7 +100,6 @@ impl<'a, 'b> visit::Visitor<'a> for DefCollector<'a, 'b> {
|
||||
| ItemKind::Struct(..)
|
||||
| ItemKind::Union(..)
|
||||
| ItemKind::ExternCrate(..)
|
||||
| ItemKind::ForeignMod(..)
|
||||
| ItemKind::TyAlias(..) => DefPathData::TypeNs(i.ident.name),
|
||||
ItemKind::Static(..) | ItemKind::Const(..) | ItemKind::Fn(..) => {
|
||||
DefPathData::ValueNs(i.ident.name)
|
||||
|
@ -311,8 +311,8 @@ impl<'tcx> Printer<'tcx> for &mut SymbolPrinter<'tcx> {
|
||||
) -> Result<Self::Path, Self::Error> {
|
||||
self = print_prefix(self)?;
|
||||
|
||||
// Skip `::{{constructor}}` on tuple/unit structs.
|
||||
if let DefPathData::Ctor = disambiguated_data.data {
|
||||
// Skip `::{{extern}}` blocks and `::{{constructor}}` on tuple/unit structs.
|
||||
if let DefPathData::ForeignMod | DefPathData::Ctor = disambiguated_data.data {
|
||||
return Ok(self);
|
||||
}
|
||||
|
||||
|
@ -771,6 +771,10 @@ impl<'tcx> Printer<'tcx> for &mut SymbolMangler<'tcx> {
|
||||
disambiguated_data: &DisambiguatedDefPathData,
|
||||
) -> Result<Self::Path, Self::Error> {
|
||||
let ns = match disambiguated_data.data {
|
||||
// FIXME: It shouldn't be necessary to add anything for extern block segments,
|
||||
// but we add 't' for backward compatibility.
|
||||
DefPathData::ForeignMod => 't',
|
||||
|
||||
// Uppercase categories are more stable than lowercase ones.
|
||||
DefPathData::TypeNs(_) => 't',
|
||||
DefPathData::ValueNs(_) => 'v',
|
||||
|
@ -8,6 +8,7 @@ use rustc_data_structures::fx::FxHashSet;
|
||||
use rustc_hir as hir;
|
||||
use rustc_hir::def::{DefKind, Res};
|
||||
use rustc_hir::def_id::DefId;
|
||||
use rustc_hir::definitions::DefPathData;
|
||||
use rustc_hir::Mutability;
|
||||
use rustc_metadata::creader::{CStore, LoadedMacro};
|
||||
use rustc_middle::ty::{self, TyCtxt};
|
||||
@ -165,9 +166,8 @@ crate fn record_extern_fqn(cx: &mut DocContext<'_>, did: DefId, kind: ItemType)
|
||||
let crate_name = cx.tcx.crate_name(did.krate).to_string();
|
||||
|
||||
let relative = cx.tcx.def_path(did).data.into_iter().filter_map(|elem| {
|
||||
// extern blocks have an empty name
|
||||
let s = elem.data.to_string();
|
||||
if !s.is_empty() { Some(s) } else { None }
|
||||
// Filter out extern blocks
|
||||
(elem.data != DefPathData::ForeignMod).then(|| elem.data.to_string())
|
||||
});
|
||||
let fqn = if let ItemType::Macro = kind {
|
||||
// Check to see if it is a macro 2.0 or built-in macro
|
||||
|
@ -5,6 +5,7 @@ use rustc_data_structures::fx::{FxHashMap, FxHashSet};
|
||||
use rustc_hir as hir;
|
||||
use rustc_hir::def::{DefKind, Res};
|
||||
use rustc_hir::def_id::DefId;
|
||||
use rustc_hir::definitions::DefPathData;
|
||||
use rustc_hir::Node;
|
||||
use rustc_hir::CRATE_HIR_ID;
|
||||
use rustc_middle::middle::privacy::AccessLevel;
|
||||
@ -45,9 +46,8 @@ impl Module<'hir> {
|
||||
fn def_id_to_path(tcx: TyCtxt<'_>, did: DefId) -> Vec<String> {
|
||||
let crate_name = tcx.crate_name(did.krate).to_string();
|
||||
let relative = tcx.def_path(did).data.into_iter().filter_map(|elem| {
|
||||
// extern blocks have an empty name
|
||||
let s = elem.data.to_string();
|
||||
if !s.is_empty() { Some(s) } else { None }
|
||||
// Filter out extern blocks
|
||||
(elem.data != DefPathData::ForeignMod).then(|| elem.data.to_string())
|
||||
});
|
||||
std::iter::once(crate_name).chain(relative).collect()
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user