Skip to content

Commit

Permalink
rustdoc: use shorter paths as preferred canonical paths
Browse files Browse the repository at this point in the history
This is a solution to the `std::sync::poison` linking problem,
and, in general, makes intra-doc links shorter and clearer.
  • Loading branch information
notriddle committed Dec 26, 2024
1 parent 4ed8cf4 commit 16a4ad7
Show file tree
Hide file tree
Showing 2 changed files with 50 additions and 9 deletions.
19 changes: 10 additions & 9 deletions src/librustdoc/formats/cache.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand All @@ -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_()));
}
}
}
}
}
Expand Down
40 changes: 40 additions & 0 deletions tests/rustdoc/inline_local/parent-path-is-better.rs
Original file line number Diff line number Diff line change
@@ -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;

0 comments on commit 16a4ad7

Please sign in to comment.