Skip to content

Commit

Permalink
Rollup merge of rust-lang#92792 - mdibaiee:92662/fix-intra-doc-generi…
Browse files Browse the repository at this point in the history
…cs, r=camelid

rustdoc: fix intra-link for generic trait impls

fixes rust-lang#92662

r? ``@camelid``
  • Loading branch information
matthiaskrgr authored Jan 15, 2022
2 parents b76ce57 + ae20500 commit dfb31e2
Show file tree
Hide file tree
Showing 3 changed files with 54 additions and 3 deletions.
13 changes: 12 additions & 1 deletion src/librustdoc/passes/collect_intra_doc_links.rs
Original file line number Diff line number Diff line change
Expand Up @@ -939,7 +939,18 @@ fn traits_implemented_by<'a>(
ty
);
// Fast path: if this is a primitive simple `==` will work
let saw_impl = impl_type == ty;
// NOTE: the `match` is necessary; see #92662.
// this allows us to ignore generics because the user input
// may not include the generic placeholders
// e.g. this allows us to match Foo (user comment) with Foo<T> (actual type)
let saw_impl = impl_type == ty
|| match (impl_type.kind(), ty.kind()) {
(ty::Adt(impl_def, _), ty::Adt(ty_def, _)) => {
debug!("impl def_id: {:?}, ty def_id: {:?}", impl_def.did, ty_def.did);
impl_def.did == ty_def.did
}
_ => false,
};

if saw_impl { Some(trait_) } else { None }
})
Expand Down
24 changes: 22 additions & 2 deletions src/test/rustdoc/intra-doc/extern-type.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,14 +4,34 @@ extern {
pub type ExternType;
}

pub trait T {
fn test(&self) {}
}

pub trait G<N> {
fn g(&self, n: N) {}
}

impl ExternType {
pub fn f(&self) {
pub fn f(&self) {}
}

}
impl T for ExternType {
fn test(&self) {}
}

impl G<usize> for ExternType {
fn g(&self, n: usize) {}
}

// @has 'extern_type/foreigntype.ExternType.html'
// @has 'extern_type/fn.links_to_extern_type.html' \
// 'href="foreigntype.ExternType.html#method.f"'
// @has 'extern_type/fn.links_to_extern_type.html' \
// 'href="foreigntype.ExternType.html#method.test"'
// @has 'extern_type/fn.links_to_extern_type.html' \
// 'href="foreigntype.ExternType.html#method.g"'
/// See also [ExternType::f]
/// See also [ExternType::test]
/// See also [ExternType::g]
pub fn links_to_extern_type() {}
20 changes: 20 additions & 0 deletions src/test/rustdoc/intra-doc/generic-trait-impl.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
#![deny(rustdoc::broken_intra_doc_links)]

// Test intra-doc links on trait implementations with generics
// regression test for issue #92662

use std::marker::PhantomData;

pub trait Bar<T> {
fn bar(&self);
}

pub struct Foo<U>(PhantomData<U>);

impl<T, U> Bar<T> for Foo<U> {
fn bar(&self) {}
}

// @has generic_trait_impl/fn.main.html '//a[@href="struct.Foo.html#method.bar"]' 'Foo::bar'
/// link to [`Foo::bar`]
pub fn main() {}

0 comments on commit dfb31e2

Please sign in to comment.