From 482b753d66bed635dcd14c86950850e91beefd8d Mon Sep 17 00:00:00 2001 From: Vadim Petrochenkov Date: Mon, 7 Feb 2022 18:46:08 +0800 Subject: [PATCH] rustdoc: Consider enum variants when resolving assoc items in doc links --- .../passes/collect_intra_doc_links.rs | 21 +++++++++++++++++-- .../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 8621fe6ba1b9..ae891b96ce3e 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 9b70ea054ad7..0b958eb8eac1 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() {}