diff options
| author | Vadim Petrochenkov <vadim.petrochenkov@gmail.com> | 2022-02-07 18:46:08 +0800 |
|---|---|---|
| committer | Vadim Petrochenkov <vadim.petrochenkov@gmail.com> | 2022-02-13 22:59:16 +0800 |
| commit | 482b753d66bed635dcd14c86950850e91beefd8d (patch) | |
| tree | 27e2b9c27a35ba335cf6af59a108b6cdeeaee6c4 /src | |
| parent | 1f4681ad7a132755452c32a987ad0f0d075aa6aa (diff) | |
| download | rust-482b753d66bed635dcd14c86950850e91beefd8d.tar.gz rust-482b753d66bed635dcd14c86950850e91beefd8d.zip | |
rustdoc: Consider enum variants when resolving assoc items in doc links
Diffstat (limited to 'src')
| -rw-r--r-- | src/librustdoc/passes/collect_intra_doc_links.rs | 21 | ||||
| -rw-r--r-- | src/test/rustdoc/intra-doc/associated-items.rs | 8 |
2 files changed, 27 insertions, 2 deletions
diff --git a/src/librustdoc/passes/collect_intra_doc_links.rs b/src/librustdoc/passes/collect_intra_doc_links.rs index 8621fe6ba1b..ae891b96ce3 100644 --- a/src/librustdoc/passes/collect_intra_doc_links.rs +++ b/src/librustdoc/passes/collect_intra_doc_links.rs @@ -10,7 +10,7 @@ use rustc_hir::def::{ PerNS, }; use rustc_hir::def_id::{CrateNum, DefId, CRATE_DEF_ID}; -use rustc_middle::ty::{DefIdTree, Ty, TyCtxt}; +use rustc_middle::ty::{DefIdTree, Ty, TyCtxt, TyKind}; use rustc_middle::{bug, span_bug, ty}; use rustc_session::lint::Lint; use rustc_span::hygiene::MacroKind; @@ -723,10 +723,27 @@ impl<'a, 'tcx> LinkCollector<'a, 'tcx> { self.resolve_associated_item(res, item_name, ns, module_id) } Res::Def( - DefKind::Struct | DefKind::Union | DefKind::Enum | DefKind::ForeignTy, + def_kind @ (DefKind::Struct | DefKind::Union | DefKind::Enum | DefKind::ForeignTy), did, ) => { debug!("looking for associated item named {} for item {:?}", item_name, did); + // Checks if item_name is a variant of the `SomeItem` enum + if ns == TypeNS && def_kind == DefKind::Enum { + match tcx.type_of(did).kind() { + TyKind::Adt(adt_def, _) => { + for variant in &adt_def.variants { + if variant.name == item_name { + return Some(( + root_res, + ItemFragment(FragmentKind::Variant, variant.def_id), + )); + } + } + } + _ => unreachable!(), + } + } + // Checks if item_name belongs to `impl SomeItem` let assoc_item = tcx .inherent_impls(did) diff --git a/src/test/rustdoc/intra-doc/associated-items.rs b/src/test/rustdoc/intra-doc/associated-items.rs index 9b70ea054ad..0b958eb8eac 100644 --- a/src/test/rustdoc/intra-doc/associated-items.rs +++ b/src/test/rustdoc/intra-doc/associated-items.rs @@ -57,4 +57,12 @@ impl T2 for S { fn ambiguous_method() {} } +// @has associated_items/enum.MyEnum.html '//a/@href' 'enum.MyEnum.html#variant.MyVariant' +/// Link to [MyEnumAlias::MyVariant] +pub enum MyEnum { + MyVariant, +} + +pub type MyEnumAlias = MyEnum; + fn main() {} |
