diff --git a/src/librustdoc/html/highlight.rs b/src/librustdoc/html/highlight.rs index c37736f137df9..feabf39ba907d 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, + write_line_number: fn(u32) -> LineNumber, line: u32, max_lines: u32, } @@ -355,7 +355,7 @@ 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)); @@ -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,27 @@ 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}") +/// Represents line numbers to be generated as HTML. +enum LineNumber { + /// Used for scraped code examples. + Scraped(u32), + /// Used for non-scraped code examples, ie source code pages and code examples in documentation. + Normal(u32), + /// Code examples without line numbers. + #[allow(dead_code)] + Empty(u32), } -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}") -} - -fn empty_line_number(_: u32) -> String { - String::new() +impl Display for LineNumber { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + 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(line) => write!(f, "{line}"), + Self::Normal(line) => write!(f, "{line}"), + Self::Empty(_) => Ok(()), + } + } } fn get_next_expansion( @@ -537,12 +543,12 @@ pub(super) fn write_code( write_line_number: match line_info { Some(line_info) => { if line_info.is_scraped_example { - scraped_line_number + LineNumber::Scraped } else { - line_number + LineNumber::Normal } } - None => empty_line_number, + None => LineNumber::Empty, }, line: 0, max_lines: u32::MAX, @@ -552,8 +558,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, + ); } }