Skip to content

Commit 9968f3c

Browse files
rustdoc: Fix LinkReplacer link matching
1 parent 26c9868 commit 9968f3c

File tree

3 files changed

+48
-6
lines changed

3 files changed

+48
-6
lines changed

src/librustdoc/html/markdown.rs

+10-5
Original file line numberDiff line numberDiff line change
@@ -382,7 +382,6 @@ impl<'a, I: Iterator<Item = Event<'a>>> Iterator for LinkReplacer<'a, I> {
382382
Some(Event::Code(text)) => {
383383
trace!("saw code {}", text);
384384
if let Some(link) = self.shortcut_link {
385-
trace!("original text was {}", link.original_text);
386385
// NOTE: this only replaces if the code block is the *entire* text.
387386
// If only part of the link has code highlighting, the disambiguator will not be removed.
388387
// e.g. [fn@`f`]
@@ -391,8 +390,11 @@ impl<'a, I: Iterator<Item = Event<'a>>> Iterator for LinkReplacer<'a, I> {
391390
// So we could never be sure we weren't replacing too much:
392391
// [fn@my_`f`unc] is treated the same as [my_func()] in that pass.
393392
//
394-
// NOTE: &[1..len() - 1] is to strip the backticks
395-
if **text == link.original_text[1..link.original_text.len() - 1] {
393+
// NOTE: .get(1..len() - 1) is to strip the backticks
394+
if let Some(link) = self.links.iter().find(|l| {
395+
l.href == link.href
396+
&& Some(&**text) == l.original_text.get(1..l.original_text.len() - 1)
397+
}) {
396398
debug!("replacing {} with {}", text, link.new_text);
397399
*text = CowStr::Borrowed(&link.new_text);
398400
}
@@ -403,9 +405,12 @@ impl<'a, I: Iterator<Item = Event<'a>>> Iterator for LinkReplacer<'a, I> {
403405
Some(Event::Text(text)) => {
404406
trace!("saw text {}", text);
405407
if let Some(link) = self.shortcut_link {
406-
trace!("original text was {}", link.original_text);
407408
// NOTE: same limitations as `Event::Code`
408-
if **text == *link.original_text {
409+
if let Some(link) = self
410+
.links
411+
.iter()
412+
.find(|l| l.href == link.href && **text == *l.original_text)
413+
{
409414
debug!("replacing {} with {}", text, link.new_text);
410415
*text = CowStr::Borrowed(&link.new_text);
411416
}
+37
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
#![deny(rustdoc::broken_intra_doc_links)]
2+
3+
pub struct S;
4+
pub mod char {}
5+
6+
// Ensure this doesn't ICE due to trying to slice off non-existent backticks from "S"
7+
8+
/// See [S] and [`S`]
9+
pub struct MyStruct1;
10+
11+
// Ensure that link texts are replaced correctly even if there are multiple links with
12+
// the same target but different text
13+
14+
/// See also [crate::char] and [mod@char] and [prim@char]
15+
// @has issue_108459/struct.MyStruct2.html '//*[@href="char/index.html"]' 'crate::char'
16+
// @has - '//*[@href="char/index.html"]' 'char'
17+
// @has - '//*[@href="{{channel}}/std/primitive.char.html"]' 'char'
18+
pub struct MyStruct2;
19+
20+
/// See also [mod@char] and [prim@char] and [crate::char]
21+
// @has issue_108459/struct.MyStruct3.html '//*[@href="char/index.html"]' 'crate::char'
22+
// @has - '//*[@href="char/index.html"]' 'char'
23+
// @has - '//*[@href="{{channel}}/std/primitive.char.html"]' 'char'
24+
pub struct MyStruct3;
25+
26+
// Ensure that links are correct even if there are multiple links with the same text but
27+
// different targets
28+
29+
/// See also [char][mod@char] and [char][prim@char]
30+
// @has issue_108459/struct.MyStruct4.html '//*[@href="char/index.html"]' 'char'
31+
// @has - '//*[@href="{{channel}}/std/primitive.char.html"]' 'char'
32+
pub struct MyStruct4;
33+
34+
/// See also [char][prim@char] and [char][crate::char]
35+
// @has issue_108459/struct.MyStruct5.html '//*[@href="char/index.html"]' 'char'
36+
// @has - '//*[@href="{{channel}}/std/primitive.char.html"]' 'char'
37+
pub struct MyStruct5;

tests/rustdoc/intra-doc/prim-precedence.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -12,5 +12,5 @@ pub struct MyString;
1212

1313
/// See also [crate::char] and [mod@char]
1414
// @has prim_precedence/struct.MyString2.html '//*[@href="char/index.html"]' 'crate::char'
15-
// @has - '//*[@href="char/index.html"]' 'mod@char'
15+
// @has - '//*[@href="char/index.html"]' 'char'
1616
pub struct MyString2;

0 commit comments

Comments
 (0)