diff options
| author | Mahdi Dibaiee <mdibaiee@pm.me> | 2022-01-11 22:20:01 +0000 |
|---|---|---|
| committer | Mahdi Dibaiee <mdibaiee@pm.me> | 2022-01-13 20:23:24 +0000 |
| commit | 9ff8ae097e88937a4aa6cf62d73471e479bac1df (patch) | |
| tree | 9f08f8138e867666d8489efb66718c3d6972411a | |
| parent | 1409c015b44a4d4d38bef2250b2a37c17b8b7463 (diff) | |
| download | rust-9ff8ae097e88937a4aa6cf62d73471e479bac1df.tar.gz rust-9ff8ae097e88937a4aa6cf62d73471e479bac1df.zip | |
rustdoc: fix intra-link for generic trait impls
| -rw-r--r-- | src/librustdoc/passes/collect_intra_doc_links.rs | 13 | ||||
| -rw-r--r-- | src/test/rustdoc/intra-doc/generic-trait-impl.rs | 19 |
2 files changed, 31 insertions, 1 deletions
diff --git a/src/librustdoc/passes/collect_intra_doc_links.rs b/src/librustdoc/passes/collect_intra_doc_links.rs index 9d1a8b3f80f..0bc10404dc0 100644 --- a/src/librustdoc/passes/collect_intra_doc_links.rs +++ b/src/librustdoc/passes/collect_intra_doc_links.rs @@ -903,7 +903,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 } }) diff --git a/src/test/rustdoc/intra-doc/generic-trait-impl.rs b/src/test/rustdoc/intra-doc/generic-trait-impl.rs new file mode 100644 index 00000000000..c3d3f8b3866 --- /dev/null +++ b/src/test/rustdoc/intra-doc/generic-trait-impl.rs @@ -0,0 +1,19 @@ +#![deny(rustdoc::broken_intra_doc_links)] + +// Test intra-doc links on trait implementations with generics + +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() {} |
