about summary refs log tree commit diff
diff options
context:
space:
mode:
authorVadim Petrochenkov <vadim.petrochenkov@gmail.com>2022-04-26 21:33:17 +0300
committerVadim Petrochenkov <vadim.petrochenkov@gmail.com>2022-04-26 21:36:46 +0300
commit6d590ba9426f60459c66d19f73b52f774e23e308 (patch)
tree1bc65e4777cecd80799926120020acb5ff70c2ae
parent3d237ab52920924694f6fc3e47ee8588514bfa70 (diff)
downloadrust-6d590ba9426f60459c66d19f73b52f774e23e308.tar.gz
rust-6d590ba9426f60459c66d19f73b52f774e23e308.zip
rustdoc: Resolve doc links on fields during early resolution
-rw-r--r--src/librustdoc/passes/collect_intra_doc_links/early.rs14
-rw-r--r--src/test/rustdoc-ui/intra-doc/assoc-field.rs26
-rw-r--r--src/test/rustdoc-ui/intra-doc/auxiliary/assoc-field-dep.rs18
3 files changed, 57 insertions, 1 deletions
diff --git a/src/librustdoc/passes/collect_intra_doc_links/early.rs b/src/librustdoc/passes/collect_intra_doc_links/early.rs
index 68e10e3a18c..1b80f6b93dc 100644
--- a/src/librustdoc/passes/collect_intra_doc_links/early.rs
+++ b/src/librustdoc/passes/collect_intra_doc_links/early.rs
@@ -260,10 +260,22 @@ impl EarlyDocLinkResolver<'_, '_> {
                     if let Res::Def(DefKind::Mod, ..) = child.res {
                         self.resolve_doc_links_extern_inner(def_id); // Inner attribute scope
                     }
-                    // Traits are processed in `add_extern_traits_in_scope`.
+                    // `DefKind::Trait`s are processed in `process_extern_impls`.
                     if let Res::Def(DefKind::Mod | DefKind::Enum, ..) = child.res {
                         self.process_module_children_or_reexports(def_id);
                     }
+                    if let Res::Def(DefKind::Struct | DefKind::Union | DefKind::Variant, _) =
+                        child.res
+                    {
+                        let field_def_ids = Vec::from_iter(
+                            self.resolver
+                                .cstore()
+                                .associated_item_def_ids_untracked(def_id, self.sess),
+                        );
+                        for field_def_id in field_def_ids {
+                            self.resolve_doc_links_extern_outer(field_def_id, scope_id);
+                        }
+                    }
                 }
             }
         }
diff --git a/src/test/rustdoc-ui/intra-doc/assoc-field.rs b/src/test/rustdoc-ui/intra-doc/assoc-field.rs
new file mode 100644
index 00000000000..e18404e4430
--- /dev/null
+++ b/src/test/rustdoc-ui/intra-doc/assoc-field.rs
@@ -0,0 +1,26 @@
+// Traits in scope are collected for doc links in field attributes.
+
+// check-pass
+// aux-build: assoc-field-dep.rs
+
+extern crate assoc_field_dep;
+pub use assoc_field_dep::*;
+
+#[derive(Clone)]
+pub struct Struct;
+
+pub mod mod1 {
+    pub struct Fields {
+        /// [crate::Struct::clone]
+        pub field: u8,
+    }
+}
+
+pub mod mod2 {
+    pub enum Fields {
+        V {
+            /// [crate::Struct::clone]
+            field: u8,
+        },
+    }
+}
diff --git a/src/test/rustdoc-ui/intra-doc/auxiliary/assoc-field-dep.rs b/src/test/rustdoc-ui/intra-doc/auxiliary/assoc-field-dep.rs
new file mode 100644
index 00000000000..cfb24fc2c66
--- /dev/null
+++ b/src/test/rustdoc-ui/intra-doc/auxiliary/assoc-field-dep.rs
@@ -0,0 +1,18 @@
+#[derive(Clone)]
+pub struct Struct;
+
+pub mod dep_mod1 {
+    pub struct Fields {
+        /// [crate::Struct::clone]
+        pub field: u8,
+    }
+}
+
+pub mod dep_mod2 {
+    pub enum Fields {
+        V {
+            /// [crate::Struct::clone]
+            field: u8,
+        },
+    }
+}