Skip to content

Commit

Permalink
rustdoc: use unicode-aware checks for redundant explicit link fastpath
Browse files Browse the repository at this point in the history
Fixes rust-lang#115064

(cherry picked from commit 3df9b4d)
  • Loading branch information
notriddle authored and cuviper committed Sep 1, 2023
1 parent 5e8dc07 commit 20ddd45
Show file tree
Hide file tree
Showing 3 changed files with 22 additions and 14 deletions.
11 changes: 3 additions & 8 deletions src/librustdoc/passes/collect_intra_doc_links.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1430,20 +1430,15 @@ impl LinkCollector<'_, '_> {
// Otherwise, check if 2 links are same, if so, skip the resolve process.
//
// Notice that this algorithm is passive, might possibly miss actual redudant cases.
let explicit_link = &explicit_link.to_string();
let explicit_link = explicit_link.to_string();
let display_text = ori_link.display_text.as_ref().unwrap();
let display_len = display_text.len();
let explicit_len = explicit_link.len();

if display_len == explicit_len {
if display_text.len() == explicit_link.len() {
// Whether they are same or not, skip the resolve process.
return;
}

if (explicit_len >= display_len
&& &explicit_link[(explicit_len - display_len)..] == display_text)
|| (display_len >= explicit_len
&& &display_text[(display_len - explicit_len)..] == explicit_link)
if explicit_link.ends_with(&display_text[..]) || display_text.ends_with(&explicit_link[..])
{
self.resolve_with_disambiguator_cached(
display_res_info,
Expand Down
7 changes: 1 addition & 6 deletions src/librustdoc/passes/lint/redundant_explicit_links.rs
Original file line number Diff line number Diff line change
Expand Up @@ -98,13 +98,8 @@ fn check_redundant_explicit_link<'md>(

let explicit_link = dest.to_string();
let display_link = link_data.resolvable_link.clone()?;
let explicit_len = explicit_link.len();
let display_len = display_link.len();

if (explicit_len >= display_len
&& &explicit_link[(explicit_len - display_len)..] == display_link)
|| (display_len >= explicit_len
&& &display_link[(display_len - explicit_len)..] == explicit_link)
if explicit_link.ends_with(&display_link) || display_link.ends_with(&explicit_link)
{
match link_type {
LinkType::Inline | LinkType::ReferenceUnknown => {
Expand Down
18 changes: 18 additions & 0 deletions tests/rustdoc-ui/lints/redundant_explicit_links-utf8.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
// check-pass

/// [`…foo`] [`…bar`] [`Err`]
pub struct Broken {}

/// [`…`] [`…`] [`Err`]
pub struct Broken2 {}

/// [`…`][…] [`…`][…] [`Err`]
pub struct Broken3 {}

/// […………………………][Broken3]
pub struct Broken4 {}

/// [Broken3][…………………………]
pub struct Broken5 {}

pub struct Err;

0 comments on commit 20ddd45

Please sign in to comment.