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