about summary refs log tree commit diff
diff options
context:
space:
mode:
authorVadim Petrochenkov <vadim.petrochenkov@gmail.com>2022-02-13 22:59:05 +0800
committerVadim Petrochenkov <vadim.petrochenkov@gmail.com>2022-02-13 23:11:38 +0800
commit25c5e39bb14976a969664d450086b6e8dc09e318 (patch)
treef55dcc09d33b9317c63427da435d6f497fb063c2
parent863216eb1f57eac3d16347c15a83a183d5975577 (diff)
downloadrust-25c5e39bb14976a969664d450086b6e8dc09e318.tar.gz
rust-25c5e39bb14976a969664d450086b6e8dc09e318.zip
rustdoc: Clean up `fn resolve_self_ty`
-rw-r--r--src/librustdoc/passes/collect_intra_doc_links.rs53
1 files changed, 23 insertions, 30 deletions
diff --git a/src/librustdoc/passes/collect_intra_doc_links.rs b/src/librustdoc/passes/collect_intra_doc_links.rs
index 9707b0bba13..414f7199692 100644
--- a/src/librustdoc/passes/collect_intra_doc_links.rs
+++ b/src/librustdoc/passes/collect_intra_doc_links.rs
@@ -515,36 +515,29 @@ impl<'a, 'tcx> LinkCollector<'a, 'tcx> {
             return None;
         }
 
-        let self_id = match item_id.as_def_id() {
-            None => None,
-            Some(did)
-                if (matches!(self.cx.tcx.def_kind(did), DefKind::Field)
-                    && matches!(
-                        self.cx.tcx.def_kind(self.cx.tcx.parent(did).unwrap()),
-                        DefKind::Variant
-                    )) =>
-            {
-                self.cx.tcx.parent(did).and_then(|item_id| self.cx.tcx.parent(item_id))
-            }
-            Some(did)
-                if matches!(
-                    self.cx.tcx.def_kind(did),
-                    DefKind::AssocConst
-                        | DefKind::AssocFn
-                        | DefKind::AssocTy
-                        | DefKind::Variant
-                        | DefKind::Field
-                ) =>
-            {
-                self.cx.tcx.parent(did)
-            }
-            Some(did) => Some(did),
-        };
-
-        self_id.and_then(|self_id| match self.cx.tcx.def_kind(self_id) {
-            DefKind::Impl => self.def_id_to_res(self_id),
-            def_kind => Some(Res::Def(def_kind, self_id)),
-        })
+        let tcx = self.cx.tcx;
+        item_id
+            .as_def_id()
+            .map(|def_id| match tcx.def_kind(def_id) {
+                def_kind @ (DefKind::AssocFn
+                | DefKind::AssocConst
+                | DefKind::AssocTy
+                | DefKind::Variant
+                | DefKind::Field) => {
+                    let parent_def_id = tcx.parent(def_id).expect("nested item has no parent");
+                    if def_kind == DefKind::Field && tcx.def_kind(parent_def_id) == DefKind::Variant
+                    {
+                        tcx.parent(parent_def_id).expect("variant has no parent")
+                    } else {
+                        parent_def_id
+                    }
+                }
+                _ => def_id,
+            })
+            .and_then(|self_id| match tcx.def_kind(self_id) {
+                DefKind::Impl => self.def_id_to_res(self_id),
+                def_kind => Some(Res::Def(def_kind, self_id)),
+            })
     }
 
     /// Convenience wrapper around `resolve_str_path_error`.