about summary refs log tree commit diff
diff options
context:
space:
mode:
authorJoshua Nelson <jyn514@gmail.com>2021-04-05 04:56:47 -0400
committerJoshua Nelson <jyn514@gmail.com>2021-04-05 14:32:05 -0400
commitd4011e12708bc760f02ed27d6226e27317ed8629 (patch)
tree7e1717b5cea53a94e01a08fe72b6360fbf109dbb
parent6e4ef54d79fa87701d4a11712f900994846b811e (diff)
downloadrust-d4011e12708bc760f02ed27d6226e27317ed8629.tar.gz
rust-d4011e12708bc760f02ed27d6226e27317ed8629.zip
Use DiagnosticInfo for anchor failure
This gets rid of a lot of parameters, as well as fixing a diagnostic
bug.
-rw-r--r--src/librustdoc/passes/collect_intra_doc_links.rs62
-rw-r--r--src/test/rustdoc-ui/intra-doc/anchors.rs4
-rw-r--r--src/test/rustdoc-ui/intra-doc/anchors.stderr16
3 files changed, 30 insertions, 52 deletions
diff --git a/src/librustdoc/passes/collect_intra_doc_links.rs b/src/librustdoc/passes/collect_intra_doc_links.rs
index 40a93855cf2..09823d4b059 100644
--- a/src/librustdoc/passes/collect_intra_doc_links.rs
+++ b/src/librustdoc/passes/collect_intra_doc_links.rs
@@ -251,6 +251,7 @@ struct ResolutionInfo {
     extra_fragment: Option<String>,
 }
 
+#[derive(Clone)]
 struct DiagnosticInfo<'a> {
     item: &'a Item,
     dox: &'a str,
@@ -949,19 +950,19 @@ impl LinkCollector<'_, '_> {
             return None;
         }
 
+        let diag_info = DiagnosticInfo {
+            item,
+            dox,
+            ori_link: &ori_link.link,
+            link_range: ori_link.range.clone(),
+        };
+
         let link = ori_link.link.replace("`", "");
         let no_backticks_range = range_between_backticks(&ori_link);
         let parts = link.split('#').collect::<Vec<_>>();
         let (link, extra_fragment) = if parts.len() > 2 {
             // A valid link can't have multiple #'s
-            anchor_failure(
-                self.cx,
-                &item,
-                &link,
-                dox,
-                ori_link.range,
-                AnchorFailure::MultipleAnchors,
-            );
+            anchor_failure(self.cx, diag_info, AnchorFailure::MultipleAnchors);
             return None;
         } else if parts.len() == 2 {
             if parts[0].trim().is_empty() {
@@ -1092,12 +1093,6 @@ impl LinkCollector<'_, '_> {
             return None;
         }
 
-        let diag_info = DiagnosticInfo {
-            item,
-            dox,
-            ori_link: &ori_link.link,
-            link_range: ori_link.range.clone(),
-        };
         let (mut res, mut fragment) = self.resolve_with_disambiguator_cached(
             ResolutionInfo {
                 module_id,
@@ -1105,7 +1100,7 @@ impl LinkCollector<'_, '_> {
                 path_str: path_str.to_owned(),
                 extra_fragment,
             },
-            diag_info,
+            diag_info.clone(), // this struct should really be Copy, but Range is not :(
             matches!(ori_link.kind, LinkType::Reference | LinkType::Shortcut),
         )?;
 
@@ -1123,10 +1118,7 @@ impl LinkCollector<'_, '_> {
                     if fragment.is_some() {
                         anchor_failure(
                             self.cx,
-                            &item,
-                            path_str,
-                            dox,
-                            ori_link.range,
+                            diag_info,
                             AnchorFailure::RustdocAnchorConflict(prim),
                         );
                         return None;
@@ -1360,14 +1352,7 @@ impl LinkCollector<'_, '_> {
                         None
                     }
                     Err(ErrorKind::AnchorFailure(msg)) => {
-                        anchor_failure(
-                            self.cx,
-                            diag.item,
-                            diag.ori_link,
-                            diag.dox,
-                            diag.link_range,
-                            msg,
-                        );
+                        anchor_failure(self.cx, diag, msg);
                         None
                     }
                 }
@@ -1384,14 +1369,7 @@ impl LinkCollector<'_, '_> {
                             Ok(res)
                         }
                         Err(ErrorKind::AnchorFailure(msg)) => {
-                            anchor_failure(
-                                self.cx,
-                                diag.item,
-                                diag.ori_link,
-                                diag.dox,
-                                diag.link_range,
-                                msg,
-                            );
+                            anchor_failure(self.cx, diag, msg);
                             return None;
                         }
                         Err(ErrorKind::Resolve(box kind)) => Err(kind),
@@ -1399,14 +1377,7 @@ impl LinkCollector<'_, '_> {
                     value_ns: match self.resolve(path_str, ValueNS, base_node, extra_fragment) {
                         Ok(res) => Ok(res),
                         Err(ErrorKind::AnchorFailure(msg)) => {
-                            anchor_failure(
-                                self.cx,
-                                diag.item,
-                                diag.ori_link,
-                                diag.dox,
-                                diag.link_range,
-                                msg,
-                            );
+                            anchor_failure(self.cx, diag, msg);
                             return None;
                         }
                         Err(ErrorKind::Resolve(box kind)) => Err(kind),
@@ -2004,10 +1975,7 @@ fn resolution_failure(
 /// Report an anchor failure.
 fn anchor_failure(
     cx: &DocContext<'_>,
-    item: &Item,
-    ori_link: &str,
-    dox: &str,
-    link_range: Range<usize>,
+    DiagnosticInfo { item, ori_link, dox, link_range }: DiagnosticInfo<'_>,
     failure: AnchorFailure,
 ) {
     let msg = match failure {
diff --git a/src/test/rustdoc-ui/intra-doc/anchors.rs b/src/test/rustdoc-ui/intra-doc/anchors.rs
index 009b291be1f..6785cb7abea 100644
--- a/src/test/rustdoc-ui/intra-doc/anchors.rs
+++ b/src/test/rustdoc-ui/intra-doc/anchors.rs
@@ -43,3 +43,7 @@ pub fn enum_link() {}
 /// [u32#hello]
 //~^ ERROR `u32#hello` contains an anchor
 pub fn x() {}
+
+/// [prim@usize#x]
+//~^ ERROR `prim@usize#x` contains an anchor
+pub mod usize {}
diff --git a/src/test/rustdoc-ui/intra-doc/anchors.stderr b/src/test/rustdoc-ui/intra-doc/anchors.stderr
index 97b0cea0c1e..787a68ed969 100644
--- a/src/test/rustdoc-ui/intra-doc/anchors.stderr
+++ b/src/test/rustdoc-ui/intra-doc/anchors.stderr
@@ -1,8 +1,8 @@
-error: `Foo::f#hola` contains an anchor, but links to fields are already anchored
-  --> $DIR/anchors.rs:25:15
+error: `prim@usize#x` contains an anchor, but links to builtin types are already anchored
+  --> $DIR/anchors.rs:47:6
    |
-LL | /// Or maybe [Foo::f#hola].
-   |               ^^^^^^^^^^^ contains invalid anchor
+LL | /// [prim@usize#x]
+   |      ^^^^^^^^^^^^ contains invalid anchor
    |
 note: the lint level is defined here
   --> $DIR/anchors.rs:1:9
@@ -10,6 +10,12 @@ note: the lint level is defined here
 LL | #![deny(rustdoc::broken_intra_doc_links)]
    |         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 
+error: `Foo::f#hola` contains an anchor, but links to fields are already anchored
+  --> $DIR/anchors.rs:25:15
+   |
+LL | /// Or maybe [Foo::f#hola].
+   |               ^^^^^^^^^^^ contains invalid anchor
+
 error: `hello#people#!` contains multiple anchors
   --> $DIR/anchors.rs:31:28
    |
@@ -28,5 +34,5 @@ error: `u32#hello` contains an anchor, but links to builtin types are already an
 LL | /// [u32#hello]
    |      ^^^^^^^^^ contains invalid anchor
 
-error: aborting due to 4 previous errors
+error: aborting due to 5 previous errors