diff --git a/src/librustdoc/html/highlight.rs b/src/librustdoc/html/highlight.rs index c37736f137df9..0363418f91647 100644 --- a/src/librustdoc/html/highlight.rs +++ b/src/librustdoc/html/highlight.rs @@ -343,7 +343,7 @@ struct TokenHandler<'a, 'tcx, F: Write> { /// We need to keep the `Class` for each element because it could contain a `Span` which is /// used to generate links. href_context: Option>, - write_line_number: fn(u32) -> String, + line_number_kind: LineNumberKind, line: u32, max_lines: u32, } @@ -355,10 +355,10 @@ impl std::fmt::Debug for TokenHandler<'_, '_, F> { } impl<'a, F: Write> TokenHandler<'a, '_, F> { - fn handle_backline(&mut self) -> Option { + fn handle_backline(&mut self) -> Option> { self.line += 1; if self.line < self.max_lines { - return Some((self.write_line_number)(self.line)); + return Some(self.line_number_kind.render(self.line)); } None } @@ -376,8 +376,7 @@ impl<'a, F: Write> TokenHandler<'a, '_, F> { if text == "\n" && let Some(backline) = self.handle_backline() { - self.out.write_str(&text).unwrap(); - self.out.write_str(&backline).unwrap(); + write!(self.out, "{text}{backline}").unwrap(); } else { self.push_token_without_backline_check(class, text, true); } @@ -437,20 +436,29 @@ impl Drop for TokenHandler<'_, '_, F> { } } -fn scraped_line_number(line: u32) -> String { - // https://developers.google.com/search/docs/crawling-indexing/robots-meta-tag#data-nosnippet-attr - // Do not show "1 2 3 4 5 ..." in web search results. - format!("{line}") -} - -fn line_number(line: u32) -> String { - // https://developers.google.com/search/docs/crawling-indexing/robots-meta-tag#data-nosnippet-attr - // Do not show "1 2 3 4 5 ..." in web search results. - format!("{line}") +/// Represents the type of line number to be generated as HTML. +#[derive(Clone, Copy)] +enum LineNumberKind { + /// Used for scraped code examples. + Scraped, + /// Used for source code pages. + Normal, + /// Code examples in documentation don't have line number generated by rustdoc. + Empty, } -fn empty_line_number(_: u32) -> String { - String::new() +impl LineNumberKind { + fn render(self, line: u32) -> impl Display { + fmt::from_fn(move |f| { + match self { + // https://developers.google.com/search/docs/crawling-indexing/robots-meta-tag#data-nosnippet-attr + // Do not show "1 2 3 4 5 ..." in web search results. + Self::Scraped => write!(f, "{line}"), + Self::Normal => write!(f, "{line}"), + Self::Empty => Ok(()), + } + }) + } } fn get_next_expansion( @@ -534,15 +542,15 @@ pub(super) fn write_code( let mut token_handler = TokenHandler { out, href_context, - write_line_number: match line_info { + line_number_kind: match line_info { Some(line_info) => { if line_info.is_scraped_example { - scraped_line_number + LineNumberKind::Scraped } else { - line_number + LineNumberKind::Normal } } - None => empty_line_number, + None => LineNumberKind::Empty, }, line: 0, max_lines: u32::MAX, @@ -552,8 +560,12 @@ pub(super) fn write_code( if let Some(line_info) = line_info { token_handler.line = line_info.start_line - 1; token_handler.max_lines = line_info.max_lines; - if let Some(text) = token_handler.handle_backline() { - token_handler.push_token_without_backline_check(None, Cow::Owned(text), false); + if let Some(backline) = token_handler.handle_backline() { + token_handler.push_token_without_backline_check( + None, + Cow::Owned(backline.to_string()), + false, + ); } }