Skip to content

Commit dda4798

Browse files
authored
Rollup merge of #79069 - jyn514:class-none, r=GuillaumeGomez
Get rid of `highlight::Class::None` This is mostly me learning the codebase for #77939, so feel free to close the PR. It does have the small benefit that we statically know rustdoc isn't generating useless `span`s, though. r? `@GuillaumeGomez` cc `@matklad`
2 parents fa45fce + 279bf29 commit dda4798

File tree

1 file changed

+16
-17
lines changed

1 file changed

+16
-17
lines changed

src/librustdoc/html/highlight.rs

+16-17
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,6 @@ fn write_footer(out: &mut String, playground_button: Option<&str>) {
6464
/// How a span of text is classified. Mostly corresponds to token kinds.
6565
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
6666
enum Class {
67-
None,
6867
Comment,
6968
DocComment,
7069
Attribute,
@@ -89,7 +88,6 @@ impl Class {
8988
/// Returns the css class expected by rustdoc for each `Class`.
9089
fn as_html(self) -> &'static str {
9190
match self {
92-
Class::None => "",
9391
Class::Comment => "comment",
9492
Class::DocComment => "doccomment",
9593
Class::Attribute => "attribute",
@@ -112,7 +110,7 @@ impl Class {
112110
}
113111

114112
enum Highlight<'a> {
115-
Token { text: &'a str, class: Class },
113+
Token { text: &'a str, class: Option<Class> },
116114
EnterSpan { class: Class },
117115
ExitSpan,
118116
}
@@ -166,8 +164,9 @@ impl<'a> Classifier<'a> {
166164
/// a couple of following ones as well.
167165
fn advance(&mut self, token: TokenKind, text: &'a str, sink: &mut dyn FnMut(Highlight<'a>)) {
168166
let lookahead = self.peek();
167+
let no_highlight = |sink: &mut dyn FnMut(_)| sink(Highlight::Token { text, class: None });
169168
let class = match token {
170-
TokenKind::Whitespace => Class::None,
169+
TokenKind::Whitespace => return no_highlight(sink),
171170
TokenKind::LineComment { doc_style } | TokenKind::BlockComment { doc_style, .. } => {
172171
if doc_style.is_some() {
173172
Class::DocComment
@@ -192,12 +191,12 @@ impl<'a> Classifier<'a> {
192191
TokenKind::And => match lookahead {
193192
Some(TokenKind::And) => {
194193
let _and = self.tokens.next();
195-
sink(Highlight::Token { text: "&&", class: Class::Op });
194+
sink(Highlight::Token { text: "&&", class: Some(Class::Op) });
196195
return;
197196
}
198197
Some(TokenKind::Eq) => {
199198
let _eq = self.tokens.next();
200-
sink(Highlight::Token { text: "&=", class: Class::Op });
199+
sink(Highlight::Token { text: "&=", class: Some(Class::Op) });
201200
return;
202201
}
203202
Some(TokenKind::Whitespace) => Class::Op,
@@ -228,7 +227,7 @@ impl<'a> Classifier<'a> {
228227
| TokenKind::At
229228
| TokenKind::Tilde
230229
| TokenKind::Colon
231-
| TokenKind::Unknown => Class::None,
230+
| TokenKind::Unknown => return no_highlight(sink),
232231

233232
TokenKind::Question => Class::QuestionMark,
234233

@@ -237,7 +236,7 @@ impl<'a> Classifier<'a> {
237236
self.in_macro_nonterminal = true;
238237
Class::MacroNonTerminal
239238
}
240-
_ => Class::None,
239+
_ => return no_highlight(sink),
241240
},
242241

243242
// This might be the start of an attribute. We're going to want to
@@ -253,8 +252,8 @@ impl<'a> Classifier<'a> {
253252
self.in_attribute = true;
254253
sink(Highlight::EnterSpan { class: Class::Attribute });
255254
}
256-
sink(Highlight::Token { text: "#", class: Class::None });
257-
sink(Highlight::Token { text: "!", class: Class::None });
255+
sink(Highlight::Token { text: "#", class: None });
256+
sink(Highlight::Token { text: "!", class: None });
258257
return;
259258
}
260259
// Case 2: #[outer_attribute]
@@ -264,16 +263,16 @@ impl<'a> Classifier<'a> {
264263
}
265264
_ => (),
266265
}
267-
Class::None
266+
return no_highlight(sink);
268267
}
269268
TokenKind::CloseBracket => {
270269
if self.in_attribute {
271270
self.in_attribute = false;
272-
sink(Highlight::Token { text: "]", class: Class::None });
271+
sink(Highlight::Token { text: "]", class: None });
273272
sink(Highlight::ExitSpan);
274273
return;
275274
}
276-
Class::None
275+
return no_highlight(sink);
277276
}
278277
TokenKind::Literal { kind, .. } => match kind {
279278
// Text literals.
@@ -309,7 +308,7 @@ impl<'a> Classifier<'a> {
309308
};
310309
// Anything that didn't return above is the simple case where we the
311310
// class just spans a single token, so we can use the `string` method.
312-
sink(Highlight::Token { text, class });
311+
sink(Highlight::Token { text, class: Some(class) });
313312
}
314313

315314
fn peek(&mut self) -> Option<TokenKind> {
@@ -339,10 +338,10 @@ fn exit_span(out: &mut String) {
339338
/// ```
340339
/// The latter can be thought of as a shorthand for the former, which is more
341340
/// flexible.
342-
fn string<T: Display>(out: &mut String, text: T, klass: Class) {
341+
fn string<T: Display>(out: &mut String, text: T, klass: Option<Class>) {
343342
match klass {
344-
Class::None => write!(out, "{}", text).unwrap(),
345-
klass => write!(out, "<span class=\"{}\">{}</span>", klass.as_html(), text).unwrap(),
343+
None => write!(out, "{}", text).unwrap(),
344+
Some(klass) => write!(out, "<span class=\"{}\">{}</span>", klass.as_html(), text).unwrap(),
346345
}
347346
}
348347

0 commit comments

Comments
 (0)