mirror of
https://github.com/rust-lang/rust.git
synced 2026-04-26 13:01:27 +03:00
rustdoc: fix issues with redundant_explicit_links
This commit is contained in:
@@ -90,12 +90,23 @@ fn check_redundant_explicit_link<'md>(
|
|||||||
.into_offset_iter();
|
.into_offset_iter();
|
||||||
|
|
||||||
while let Some((event, link_range)) = offset_iter.next() {
|
while let Some((event, link_range)) = offset_iter.next() {
|
||||||
if let Event::Start(Tag::Link { link_type, dest_url, .. }) = event {
|
if let Event::Start(Tag::Link { link_type, dest_url, title, .. }) = event {
|
||||||
|
if !title.is_empty() {
|
||||||
|
// Skips if the link specifies a title, e.g. `[Option](Option "title")`,
|
||||||
|
// in which case the explicit link cannot be removed without also
|
||||||
|
// removing the title.
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
let link_data = collect_link_data(&mut offset_iter);
|
let link_data = collect_link_data(&mut offset_iter);
|
||||||
|
|
||||||
if let Some(resolvable_link) = link_data.resolvable_link.as_ref()
|
let Some(resolvable_link) = link_data.resolvable_link.as_ref() else {
|
||||||
&& &link_data.display_link.replace('`', "") != resolvable_link
|
// collect_link_data didn't return a resolvable_link
|
||||||
{
|
// most likely due to the displayed link containing inline markup
|
||||||
|
continue;
|
||||||
|
};
|
||||||
|
|
||||||
|
if &link_data.display_link.replace('`', "") != resolvable_link {
|
||||||
// Skips if display link does not match to actual
|
// Skips if display link does not match to actual
|
||||||
// resolvable link, usually happens if display link
|
// resolvable link, usually happens if display link
|
||||||
// has several segments, e.g.
|
// has several segments, e.g.
|
||||||
@@ -103,10 +114,7 @@ fn check_redundant_explicit_link<'md>(
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
let explicit_link = dest_url.to_string();
|
if dest_url.ends_with(resolvable_link) || resolvable_link.ends_with(&*dest_url) {
|
||||||
let display_link = link_data.resolvable_link.clone()?;
|
|
||||||
|
|
||||||
if explicit_link.ends_with(&display_link) || display_link.ends_with(&explicit_link) {
|
|
||||||
match link_type {
|
match link_type {
|
||||||
LinkType::Inline | LinkType::ReferenceUnknown => {
|
LinkType::Inline | LinkType::ReferenceUnknown => {
|
||||||
check_inline_or_reference_unknown_redundancy(
|
check_inline_or_reference_unknown_redundancy(
|
||||||
|
|||||||
@@ -0,0 +1,17 @@
|
|||||||
|
//@ run-rustfix
|
||||||
|
|
||||||
|
// There was a logic error in `redundant_explicit_links` that caused the lint
|
||||||
|
// to skip all remaining links once it skipped a link containing inline markups.
|
||||||
|
// This test asserts that the lint continues after skipping such links.
|
||||||
|
|
||||||
|
#![deny(rustdoc::redundant_explicit_links)]
|
||||||
|
|
||||||
|
/// [Option]
|
||||||
|
///~^ ERROR redundant explicit link target
|
||||||
|
///
|
||||||
|
/// [**u8**](u8)
|
||||||
|
/// This link should not lint.
|
||||||
|
///
|
||||||
|
/// [Result]
|
||||||
|
///~^ ERROR redundant explicit link target
|
||||||
|
pub fn func() {}
|
||||||
@@ -0,0 +1,17 @@
|
|||||||
|
//@ run-rustfix
|
||||||
|
|
||||||
|
// There was a logic error in `redundant_explicit_links` that caused the lint
|
||||||
|
// to skip all remaining links once it skipped a link containing inline markups.
|
||||||
|
// This test asserts that the lint continues after skipping such links.
|
||||||
|
|
||||||
|
#![deny(rustdoc::redundant_explicit_links)]
|
||||||
|
|
||||||
|
/// [Option][Option]
|
||||||
|
///~^ ERROR redundant explicit link target
|
||||||
|
///
|
||||||
|
/// [**u8**](u8)
|
||||||
|
/// This link should not lint.
|
||||||
|
///
|
||||||
|
/// [Result][Result]
|
||||||
|
///~^ ERROR redundant explicit link target
|
||||||
|
pub fn func() {}
|
||||||
@@ -0,0 +1,39 @@
|
|||||||
|
error: redundant explicit link target
|
||||||
|
--> $DIR/redundant_explicit_links-some-skipped.rs:9:14
|
||||||
|
|
|
||||||
|
LL | /// [Option][Option]
|
||||||
|
| ------ ^^^^^^ explicit target is redundant
|
||||||
|
| |
|
||||||
|
| because label contains path that resolves to same destination
|
||||||
|
|
|
||||||
|
= note: when a link's destination is not specified,
|
||||||
|
the label is used to resolve intra-doc links
|
||||||
|
note: the lint level is defined here
|
||||||
|
--> $DIR/redundant_explicit_links-some-skipped.rs:7:9
|
||||||
|
|
|
||||||
|
LL | #![deny(rustdoc::redundant_explicit_links)]
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
help: remove explicit link target
|
||||||
|
|
|
||||||
|
LL - /// [Option][Option]
|
||||||
|
LL + /// [Option]
|
||||||
|
|
|
||||||
|
|
||||||
|
error: redundant explicit link target
|
||||||
|
--> $DIR/redundant_explicit_links-some-skipped.rs:15:14
|
||||||
|
|
|
||||||
|
LL | /// [Result][Result]
|
||||||
|
| ------ ^^^^^^ explicit target is redundant
|
||||||
|
| |
|
||||||
|
| because label contains path that resolves to same destination
|
||||||
|
|
|
||||||
|
= note: when a link's destination is not specified,
|
||||||
|
the label is used to resolve intra-doc links
|
||||||
|
help: remove explicit link target
|
||||||
|
|
|
||||||
|
LL - /// [Result][Result]
|
||||||
|
LL + /// [Result]
|
||||||
|
|
|
||||||
|
|
||||||
|
error: aborting due to 2 previous errors
|
||||||
|
|
||||||
@@ -0,0 +1,15 @@
|
|||||||
|
//@ check-pass
|
||||||
|
|
||||||
|
#![deny(rustdoc::redundant_explicit_links)]
|
||||||
|
|
||||||
|
/// [drop](drop "This function is not magic")
|
||||||
|
///
|
||||||
|
/// This link should not lint, because it specifies a link title, and it is
|
||||||
|
/// not possible to remove the explicit link without also removing the title.
|
||||||
|
///
|
||||||
|
/// [Vec][vec]
|
||||||
|
///
|
||||||
|
/// [vec]: std::vec::Vec "A contiguous growable array type"
|
||||||
|
///
|
||||||
|
/// This also applies to reference-style links.
|
||||||
|
pub fn func() {}
|
||||||
Reference in New Issue
Block a user