rustdoc: use shorter paths as preferred canonical paths

This is a solution to the `std::sync::poison` linking problem,
and, in general, makes intra-doc links shorter and clearer.
This commit is contained in:
Michael Howell 2024-12-26 15:43:43 -07:00
parent 4ed8cf4237
commit 16a4ad7d7b
2 changed files with 50 additions and 9 deletions

View file

@ -305,6 +305,7 @@ impl DocFolder for CacheBuilder<'_, '_> {
| clean::MacroItem(..)
| clean::ProcMacroItem(..)
| clean::VariantItem(..) => {
use rustc_data_structures::fx::IndexEntry as Entry;
if !self.cache.stripped_mod {
// Re-exported items mean that the same id can show up twice
// in the rustdoc ast that we're looking at. We know,
@ -313,15 +314,15 @@ impl DocFolder for CacheBuilder<'_, '_> {
// paths map if there was already an entry present and we're
// not a public item.
let item_def_id = item.item_id.expect_def_id();
if !self.cache.paths.contains_key(&item_def_id)
|| self
.cache
.effective_visibilities
.is_directly_public(self.tcx, item_def_id)
{
self.cache
.paths
.insert(item_def_id, (self.cache.stack.clone(), item.type_()));
match self.cache.paths.entry(item_def_id) {
Entry::Vacant(entry) => {
entry.insert((self.cache.stack.clone(), item.type_()));
}
Entry::Occupied(mut entry) => {
if entry.get().0.len() > self.cache.stack.len() {
entry.insert((self.cache.stack.clone(), item.type_()));
}
}
}
}
}

View file

@ -0,0 +1,40 @@
//! Test case for [134702]
//!
//! [134702]: https://github.com/rust-lang/rust/issues/134702
#![crate_name = "foo"]
pub mod inside1 {
pub use self::inner::Inside1;
mod inner {
pub struct Inside1;
impl Inside1 {
pub fn stuff(self) {}
}
}
}
pub mod inside2 {
pub use self::inner::Inside2;
mod inner {
pub struct Inside2;
impl Inside2 {
pub fn stuff(self) {}
}
}
}
pub mod nested {
//! [Inside1] [Inside2]
//@ has foo/nested/index.html '//a[@href="../struct.Inside1.html"]' 'Inside1'
//@ has foo/nested/index.html '//a[@href="../struct.Inside2.html"]' 'Inside2'
//! [Inside1::stuff] [Inside2::stuff]
//@ has foo/nested/index.html '//a[@href="../struct.Inside1.html#method.stuff"]' 'Inside1::stuff'
//@ has foo/nested/index.html '//a[@href="../struct.Inside2.html#method.stuff"]' 'Inside2::stuff'
use crate::inside1::Inside1;
use crate::inside2::Inside2;
}
#[doc(inline)]
pub use inside1::Inside1;
#[doc(inline)]
pub use inside2::Inside2;