diff --git a/src/librustdoc/html/highlight.rs b/src/librustdoc/html/highlight.rs
index 48518ef0dd8cf..1cbfbf50dd745 100644
--- a/src/librustdoc/html/highlight.rs
+++ b/src/librustdoc/html/highlight.rs
@@ -64,7 +64,6 @@ fn write_footer(out: &mut String, playground_button: Option<&str>) {
/// How a span of text is classified. Mostly corresponds to token kinds.
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
enum Class {
- None,
Comment,
DocComment,
Attribute,
@@ -89,7 +88,6 @@ impl Class {
/// Returns the css class expected by rustdoc for each `Class`.
fn as_html(self) -> &'static str {
match self {
- Class::None => "",
Class::Comment => "comment",
Class::DocComment => "doccomment",
Class::Attribute => "attribute",
@@ -112,7 +110,7 @@ impl Class {
}
enum Highlight<'a> {
- Token { text: &'a str, class: Class },
+ Token { text: &'a str, class: Option },
EnterSpan { class: Class },
ExitSpan,
}
@@ -166,8 +164,9 @@ impl<'a> Classifier<'a> {
/// a couple of following ones as well.
fn advance(&mut self, token: TokenKind, text: &'a str, sink: &mut dyn FnMut(Highlight<'a>)) {
let lookahead = self.peek();
+ let no_highlight = |sink: &mut dyn FnMut(_)| sink(Highlight::Token { text, class: None });
let class = match token {
- TokenKind::Whitespace => Class::None,
+ TokenKind::Whitespace => return no_highlight(sink),
TokenKind::LineComment { doc_style } | TokenKind::BlockComment { doc_style, .. } => {
if doc_style.is_some() {
Class::DocComment
@@ -192,12 +191,12 @@ impl<'a> Classifier<'a> {
TokenKind::And => match lookahead {
Some(TokenKind::And) => {
let _and = self.tokens.next();
- sink(Highlight::Token { text: "&&", class: Class::Op });
+ sink(Highlight::Token { text: "&&", class: Some(Class::Op) });
return;
}
Some(TokenKind::Eq) => {
let _eq = self.tokens.next();
- sink(Highlight::Token { text: "&=", class: Class::Op });
+ sink(Highlight::Token { text: "&=", class: Some(Class::Op) });
return;
}
Some(TokenKind::Whitespace) => Class::Op,
@@ -228,7 +227,7 @@ impl<'a> Classifier<'a> {
| TokenKind::At
| TokenKind::Tilde
| TokenKind::Colon
- | TokenKind::Unknown => Class::None,
+ | TokenKind::Unknown => return no_highlight(sink),
TokenKind::Question => Class::QuestionMark,
@@ -237,7 +236,7 @@ impl<'a> Classifier<'a> {
self.in_macro_nonterminal = true;
Class::MacroNonTerminal
}
- _ => Class::None,
+ _ => return no_highlight(sink),
},
// This might be the start of an attribute. We're going to want to
@@ -253,8 +252,8 @@ impl<'a> Classifier<'a> {
self.in_attribute = true;
sink(Highlight::EnterSpan { class: Class::Attribute });
}
- sink(Highlight::Token { text: "#", class: Class::None });
- sink(Highlight::Token { text: "!", class: Class::None });
+ sink(Highlight::Token { text: "#", class: None });
+ sink(Highlight::Token { text: "!", class: None });
return;
}
// Case 2: #[outer_attribute]
@@ -264,16 +263,16 @@ impl<'a> Classifier<'a> {
}
_ => (),
}
- Class::None
+ return no_highlight(sink);
}
TokenKind::CloseBracket => {
if self.in_attribute {
self.in_attribute = false;
- sink(Highlight::Token { text: "]", class: Class::None });
+ sink(Highlight::Token { text: "]", class: None });
sink(Highlight::ExitSpan);
return;
}
- Class::None
+ return no_highlight(sink);
}
TokenKind::Literal { kind, .. } => match kind {
// Text literals.
@@ -309,7 +308,7 @@ impl<'a> Classifier<'a> {
};
// Anything that didn't return above is the simple case where we the
// class just spans a single token, so we can use the `string` method.
- sink(Highlight::Token { text, class });
+ sink(Highlight::Token { text, class: Some(class) });
}
fn peek(&mut self) -> Option {
@@ -339,10 +338,10 @@ fn exit_span(out: &mut String) {
/// ```
/// The latter can be thought of as a shorthand for the former, which is more
/// flexible.
-fn string(out: &mut String, text: T, klass: Class) {
+fn string(out: &mut String, text: T, klass: Option) {
match klass {
- Class::None => write!(out, "{}", text).unwrap(),
- klass => write!(out, "{}", klass.as_html(), text).unwrap(),
+ None => write!(out, "{}", text).unwrap(),
+ Some(klass) => write!(out, "{}", klass.as_html(), text).unwrap(),
}
}