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:
parent
4ed8cf4237
commit
16a4ad7d7b
2 changed files with 50 additions and 9 deletions
|
@ -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_()));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
40
tests/rustdoc/inline_local/parent-path-is-better.rs
Normal file
40
tests/rustdoc/inline_local/parent-path-is-better.rs
Normal 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;
|
Loading…
Add table
Add a link
Reference in a new issue