diff --git a/src/librustdoc/html/markdown.rs b/src/librustdoc/html/markdown.rs
index 0774413960501..cc6ce3115b640 100644
--- a/src/librustdoc/html/markdown.rs
+++ b/src/librustdoc/html/markdown.rs
@@ -37,7 +37,9 @@ use crate::doctest;
use crate::html::highlight;
use crate::html::toc::TocBuilder;
-use pulldown_cmark::{html, BrokenLink, CodeBlockKind, CowStr, Event, Options, Parser, Tag};
+use pulldown_cmark::{
+ html, BrokenLink, CodeBlockKind, CowStr, Event, LinkType, Options, Parser, Tag,
+};
#[cfg(test)]
mod tests;
@@ -327,8 +329,6 @@ impl<'a, I: Iterator- >> Iterator for LinkReplacer<'a, I> {
type Item = Event<'a>;
fn next(&mut self) -> Option {
- use pulldown_cmark::LinkType;
-
let mut event = self.inner.next();
// Replace intra-doc links and remove disambiguators from shortcut links (`[fn@f]`).
@@ -1123,7 +1123,13 @@ crate fn plain_text_summary(md: &str) -> String {
s
}
-crate fn markdown_links(md: &str) -> Vec<(String, Range)> {
+crate struct MarkdownLink {
+ pub kind: LinkType,
+ pub link: String,
+ pub range: Range,
+}
+
+crate fn markdown_links(md: &str) -> Vec {
if md.is_empty() {
return vec![];
}
@@ -1163,7 +1169,11 @@ crate fn markdown_links(md: &str) -> Vec<(String, Range)> {
let mut push = |link: BrokenLink<'_>| {
let span = span_for_link(&CowStr::Borrowed(link.reference), link.span);
- links.borrow_mut().push((link.reference.to_owned(), span));
+ links.borrow_mut().push(MarkdownLink {
+ kind: LinkType::ShortcutUnknown,
+ link: link.reference.to_owned(),
+ range: span,
+ });
None
};
let p = Parser::new_with_broken_link_callback(md, opts(), Some(&mut push)).into_offset_iter();
@@ -1174,10 +1184,10 @@ crate fn markdown_links(md: &str) -> Vec<(String, Range)> {
let iter = Footnotes::new(HeadingLinks::new(p, None, &mut ids));
for ev in iter {
- if let Event::Start(Tag::Link(_, dest, _)) = ev.0 {
+ if let Event::Start(Tag::Link(kind, dest, _)) = ev.0 {
debug!("found link: {}", dest);
let span = span_for_link(&dest, ev.1);
- links.borrow_mut().push((dest.into_string(), span));
+ links.borrow_mut().push(MarkdownLink { kind, link: dest.into_string(), range: span });
}
}
diff --git a/src/librustdoc/passes/collect_intra_doc_links.rs b/src/librustdoc/passes/collect_intra_doc_links.rs
index 6fcec6946ae79..0cefbb34791b2 100644
--- a/src/librustdoc/passes/collect_intra_doc_links.rs
+++ b/src/librustdoc/passes/collect_intra_doc_links.rs
@@ -25,6 +25,8 @@ use rustc_span::symbol::Symbol;
use rustc_span::DUMMY_SP;
use smallvec::{smallvec, SmallVec};
+use pulldown_cmark::LinkType;
+
use std::borrow::Cow;
use std::cell::Cell;
use std::convert::{TryFrom, TryInto};
@@ -34,7 +36,7 @@ use std::ops::Range;
use crate::clean::{self, utils::find_nearest_parent_module, Crate, Item, ItemLink, PrimitiveType};
use crate::core::DocContext;
use crate::fold::DocFolder;
-use crate::html::markdown::markdown_links;
+use crate::html::markdown::{markdown_links, MarkdownLink};
use crate::passes::Pass;
use super::span_of_attrs;
@@ -265,8 +267,9 @@ struct LinkCollector<'a, 'tcx> {
/// because `clean` and the disambiguator code expect them to be different.
/// See the code for associated items on inherent impls for details.
kind_side_channel: Cell