about summary refs log tree commit diff
path: root/src/librustdoc/html
diff options
context:
space:
mode:
authorVadim Petrochenkov <vadim.petrochenkov@gmail.com>2023-02-18 14:10:38 +0400
committerVadim Petrochenkov <vadim.petrochenkov@gmail.com>2023-02-18 14:45:01 +0400
commitccdb598d1b495952bdb09122dc53c39b40f23758 (patch)
treea21f00dcb8eae10686b34051bf36fb1a816547c1 /src/librustdoc/html
parent34ba77d26064f9038fddd5349ceede088f8557f9 (diff)
downloadrust-ccdb598d1b495952bdb09122dc53c39b40f23758.tar.gz
rust-ccdb598d1b495952bdb09122dc53c39b40f23758.zip
rustdoc: Cleanup broken link callbacks
Diffstat (limited to 'src/librustdoc/html')
-rw-r--r--src/librustdoc/html/markdown.rs46
1 files changed, 17 insertions, 29 deletions
diff --git a/src/librustdoc/html/markdown.rs b/src/librustdoc/html/markdown.rs
index 394bea3caee..a34628991b2 100644
--- a/src/librustdoc/html/markdown.rs
+++ b/src/librustdoc/html/markdown.rs
@@ -34,7 +34,6 @@ use rustc_span::{Span, Symbol};
 
 use once_cell::sync::Lazy;
 use std::borrow::Cow;
-use std::cell::RefCell;
 use std::collections::VecDeque;
 use std::default::Default;
 use std::fmt::Write;
@@ -1226,14 +1225,12 @@ pub(crate) struct MarkdownLink {
 
 pub(crate) fn markdown_links<R>(
     md: &str,
-    filter_map: impl Fn(MarkdownLink) -> Option<R>,
+    preprocess_link: impl Fn(MarkdownLink) -> Option<R>,
 ) -> Vec<R> {
     if md.is_empty() {
         return vec![];
     }
 
-    let links = RefCell::new(vec![]);
-
     // FIXME: remove this function once pulldown_cmark can provide spans for link definitions.
     let locate = |s: &str, fallback: Range<usize>| unsafe {
         let s_start = s.as_ptr();
@@ -1265,21 +1262,14 @@ pub(crate) fn markdown_links<R>(
         }
     };
 
-    let mut push = |link: BrokenLink<'_>| {
-        let span = span_for_link(&link.reference, link.span);
-        filter_map(MarkdownLink {
-            kind: LinkType::ShortcutUnknown,
-            link: link.reference.to_string(),
-            range: span,
-        })
-        .map(|link| links.borrow_mut().push(link));
-        None
-    };
-
-    for ev in Parser::new_with_broken_link_callback(md, main_body_opts(), Some(&mut push))
-        .into_offset_iter()
-    {
-        if let Event::Start(Tag::Link(
+    Parser::new_with_broken_link_callback(
+        md,
+        main_body_opts(),
+        Some(&mut |link: BrokenLink<'_>| Some((link.reference, "".into()))),
+    )
+    .into_offset_iter()
+    .filter_map(|(event, span)| match event {
+        Event::Start(Tag::Link(
             // `<>` links cannot be intra-doc links so we skip them.
             kind @ (LinkType::Inline
             | LinkType::Reference
@@ -1290,16 +1280,14 @@ pub(crate) fn markdown_links<R>(
             | LinkType::ShortcutUnknown),
             dest,
             _,
-        )) = ev.0
-        {
-            debug!("found link: {dest}");
-            let span = span_for_link(&dest, ev.1);
-            filter_map(MarkdownLink { kind, link: dest.into_string(), range: span })
-                .map(|link| links.borrow_mut().push(link));
-        }
-    }
-
-    links.into_inner()
+        )) => preprocess_link(MarkdownLink {
+            kind,
+            range: span_for_link(&dest, span),
+            link: dest.into_string(),
+        }),
+        _ => None,
+    })
+    .collect()
 }
 
 #[derive(Debug)]