about summary refs log tree commit diff
path: root/src/librustdoc
diff options
context:
space:
mode:
authorJoshua Nelson <jyn514@gmail.com>2021-04-14 16:59:41 -0400
committerJoshua Nelson <jyn514@gmail.com>2021-04-17 16:03:03 -0400
commit59546efaa3bbbad5fdcd2a95346c87f5bb2b9511 (patch)
treea660e0b6a94af49ab2677f9fbbd97ce1867ec8c5 /src/librustdoc
parent9c3b66cff74f3a21dc735294f3df319a38bc2114 (diff)
downloadrust-59546efaa3bbbad5fdcd2a95346c87f5bb2b9511.tar.gz
rust-59546efaa3bbbad5fdcd2a95346c87f5bb2b9511.zip
rustdoc: Give a more accurate span for anchor failures
Diffstat (limited to 'src/librustdoc')
-rw-r--r--src/librustdoc/passes/collect_intra_doc_links.rs24
1 files changed, 16 insertions, 8 deletions
diff --git a/src/librustdoc/passes/collect_intra_doc_links.rs b/src/librustdoc/passes/collect_intra_doc_links.rs
index 4ce7c70d4b5..837cd034b65 100644
--- a/src/librustdoc/passes/collect_intra_doc_links.rs
+++ b/src/librustdoc/passes/collect_intra_doc_links.rs
@@ -1957,20 +1957,28 @@ fn resolution_failure(
 
 /// Report an anchor failure.
 fn anchor_failure(cx: &DocContext<'_>, diag_info: DiagnosticInfo<'_>, failure: AnchorFailure) {
-    let msg = match failure {
+    let (msg, anchor_idx) = match failure {
         AnchorFailure::MultipleAnchors => {
-            format!("`{}` contains multiple anchors", diag_info.ori_link)
+            (format!("`{}` contains multiple anchors", diag_info.ori_link), 1)
         }
-        AnchorFailure::RustdocAnchorConflict(res) => format!(
-            "`{}` contains an anchor, but links to {kind}s are already anchored",
-            diag_info.ori_link,
-            kind = res.descr(),
+        AnchorFailure::RustdocAnchorConflict(res) => (
+            format!(
+                "`{}` contains an anchor, but links to {kind}s are already anchored",
+                diag_info.ori_link,
+                kind = res.descr(),
+            ),
+            0,
         ),
     };
 
     report_diagnostic(cx.tcx, BROKEN_INTRA_DOC_LINKS, &msg, &diag_info, |diag, sp| {
-        if let Some(sp) = sp {
-            diag.span_label(sp, "contains invalid anchor");
+        if let Some(mut sp) = sp {
+            if let Some((fragment_offset, _)) =
+                diag_info.ori_link.char_indices().filter(|(_, x)| *x == '#').nth(anchor_idx)
+            {
+                sp = sp.with_lo(sp.lo() + rustc_span::BytePos(fragment_offset as _));
+            }
+            diag.span_label(sp, "invalid anchor");
         }
         if let AnchorFailure::RustdocAnchorConflict(Res::Primitive(_)) = failure {
             diag.note("this restriction may be lifted in a future release");