RustDoc: Fix bounds linking trait.Foo instead of traitalias.Foo
This commit is contained in:
parent
4ae0a8e413
commit
fe540ae1bb
5 changed files with 50 additions and 16 deletions
|
@ -188,7 +188,7 @@ crate fn record_extern_fqn(cx: &mut DocContext<'_>, did: DefId, kind: ItemType)
|
||||||
if did.is_local() {
|
if did.is_local() {
|
||||||
cx.cache.exact_paths.insert(did, fqn);
|
cx.cache.exact_paths.insert(did, fqn);
|
||||||
} else {
|
} else {
|
||||||
cx.cache.external_paths.insert(did, (fqn, ItemType::from(kind)));
|
cx.cache.external_paths.insert(did, (fqn, kind));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -157,7 +157,12 @@ impl Clean<GenericBound> for hir::GenericBound<'_> {
|
||||||
impl Clean<Type> for (ty::TraitRef<'_>, &[TypeBinding]) {
|
impl Clean<Type> for (ty::TraitRef<'_>, &[TypeBinding]) {
|
||||||
fn clean(&self, cx: &mut DocContext<'_>) -> Type {
|
fn clean(&self, cx: &mut DocContext<'_>) -> Type {
|
||||||
let (trait_ref, bounds) = *self;
|
let (trait_ref, bounds) = *self;
|
||||||
inline::record_extern_fqn(cx, trait_ref.def_id, ItemType::Trait);
|
let kind = match cx.tcx.def_kind(trait_ref.def_id) {
|
||||||
|
DefKind::Trait => ItemType::Trait,
|
||||||
|
DefKind::TraitAlias => ItemType::TraitAlias,
|
||||||
|
other => bug!("`TraitRef` had unexpected kind {:?}", other),
|
||||||
|
};
|
||||||
|
inline::record_extern_fqn(cx, trait_ref.def_id, kind);
|
||||||
let path = external_path(
|
let path = external_path(
|
||||||
cx,
|
cx,
|
||||||
cx.tcx.item_name(trait_ref.def_id),
|
cx.tcx.item_name(trait_ref.def_id),
|
||||||
|
|
|
@ -340,6 +340,7 @@ impl<'a, 'tcx> DocFolder for CacheBuilder<'a, 'tcx> {
|
||||||
| clean::EnumItem(..)
|
| clean::EnumItem(..)
|
||||||
| clean::TypedefItem(..)
|
| clean::TypedefItem(..)
|
||||||
| clean::TraitItem(..)
|
| clean::TraitItem(..)
|
||||||
|
| clean::TraitAliasItem(..)
|
||||||
| clean::FunctionItem(..)
|
| clean::FunctionItem(..)
|
||||||
| clean::ModuleItem(..)
|
| clean::ModuleItem(..)
|
||||||
| clean::ForeignFunctionItem(..)
|
| clean::ForeignFunctionItem(..)
|
||||||
|
@ -350,26 +351,43 @@ impl<'a, 'tcx> DocFolder for CacheBuilder<'a, 'tcx> {
|
||||||
| clean::ForeignTypeItem
|
| clean::ForeignTypeItem
|
||||||
| clean::MacroItem(..)
|
| clean::MacroItem(..)
|
||||||
| clean::ProcMacroItem(..)
|
| clean::ProcMacroItem(..)
|
||||||
| clean::VariantItem(..)
|
| clean::VariantItem(..) => {
|
||||||
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,
|
// however, that a re-exported item doesn't show up in the
|
||||||
// however, that a re-exported item doesn't show up in the
|
// `public_items` map, so we can skip inserting into the
|
||||||
// `public_items` map, so we can skip inserting into the
|
// 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.
|
if !self.cache.paths.contains_key(&item.def_id)
|
||||||
if !self.cache.paths.contains_key(&item.def_id)
|
|| self.cache.access_levels.is_public(item.def_id)
|
||||||
|| self.cache.access_levels.is_public(item.def_id)
|
{
|
||||||
{
|
self.cache
|
||||||
self.cache.paths.insert(item.def_id, (self.cache.stack.clone(), item.type_()));
|
.paths
|
||||||
|
.insert(item.def_id, (self.cache.stack.clone(), item.type_()));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
clean::PrimitiveItem(..) => {
|
clean::PrimitiveItem(..) => {
|
||||||
self.cache.paths.insert(item.def_id, (self.cache.stack.clone(), item.type_()));
|
self.cache.paths.insert(item.def_id, (self.cache.stack.clone(), item.type_()));
|
||||||
}
|
}
|
||||||
|
|
||||||
_ => {}
|
clean::ExternCrateItem { .. }
|
||||||
|
| clean::ImportItem(..)
|
||||||
|
| clean::OpaqueTyItem(..)
|
||||||
|
| clean::ImplItem(..)
|
||||||
|
| clean::TyMethodItem(..)
|
||||||
|
| clean::MethodItem(..)
|
||||||
|
| clean::StructFieldItem(..)
|
||||||
|
| clean::AssocConstItem(..)
|
||||||
|
| clean::AssocTypeItem(..)
|
||||||
|
| clean::StrippedItem(..)
|
||||||
|
| clean::KeywordItem(..) => {
|
||||||
|
// FIXME: Do these need handling?
|
||||||
|
// The person writing this comment doesn't know.
|
||||||
|
// So would rather leave them to an expert,
|
||||||
|
// as at least the list is better than `_ => {}`.
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Maintain the parent stack
|
// Maintain the parent stack
|
||||||
|
|
9
src/test/rustdoc/trait-alias-mention.rs
Normal file
9
src/test/rustdoc/trait-alias-mention.rs
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
#![feature(trait_alias)]
|
||||||
|
#![feature(ptr_metadata)]
|
||||||
|
|
||||||
|
#![crate_name = "foo"]
|
||||||
|
|
||||||
|
// @has foo/fn.this_never_panics.html '//a[@title="traitalias core::ptr::metadata::Thin"]' 'Thin'
|
||||||
|
pub fn this_never_panics<T: std::ptr::Thin>() {
|
||||||
|
assert_eq!(std::mem::size_of::<&T>(), std::mem::size_of::<usize>())
|
||||||
|
}
|
|
@ -19,3 +19,5 @@ pub trait CopyAlias = Copy;
|
||||||
pub trait Alias2 = Copy + Debug;
|
pub trait Alias2 = Copy + Debug;
|
||||||
// @has foo/traitalias.Foo.html '//section[@id="main"]/pre' 'trait Foo<T> = Into<T> + Debug;'
|
// @has foo/traitalias.Foo.html '//section[@id="main"]/pre' 'trait Foo<T> = Into<T> + Debug;'
|
||||||
pub trait Foo<T> = Into<T> + Debug;
|
pub trait Foo<T> = Into<T> + Debug;
|
||||||
|
// @has foo/fn.bar.html '//a[@href="traitalias.Alias2.html"]' 'Alias2'
|
||||||
|
pub fn bar<T>() where T: Alias2 {}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue