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,
+ );
}
}