diff options
| author | Joshua Nelson <jyn514@gmail.com> | 2021-04-14 16:59:41 -0400 |
|---|---|---|
| committer | Joshua Nelson <jyn514@gmail.com> | 2021-04-17 16:03:03 -0400 |
| commit | 59546efaa3bbbad5fdcd2a95346c87f5bb2b9511 (patch) | |
| tree | a660e0b6a94af49ab2677f9fbbd97ce1867ec8c5 /src/librustdoc | |
| parent | 9c3b66cff74f3a21dc735294f3df319a38bc2114 (diff) | |
| download | rust-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.rs | 24 |
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"); |
