@@ -62,7 +62,6 @@ fn write_footer(out: &mut String, playground_button: Option<&str>) {
62
62
/// How a span of text is classified. Mostly corresponds to token kinds.
63
63
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
64
64
enum Class {
65
- None,
66
65
Comment,
67
66
DocComment,
68
67
Attribute,
@@ -87,7 +86,6 @@ impl Class {
87
86
/// Returns the css class expected by rustdoc for each `Class`.
88
87
fn as_html(self) -> &'static str {
89
88
match self {
90
- Class::None => "",
91
89
Class::Comment => "comment",
92
90
Class::DocComment => "doccomment",
93
91
Class::Attribute => "attribute",
@@ -110,7 +108,7 @@ impl Class {
110
108
}
111
109
112
110
enum Highlight<'a> {
113
- Token { text: &'a str, class: Class },
111
+ Token { text: &'a str, class: Option< Class> },
114
112
EnterSpan { class: Class },
115
113
ExitSpan,
116
114
}
@@ -164,8 +162,9 @@ impl<'a> Classifier<'a> {
164
162
/// a couple of following ones as well.
165
163
fn advance(&mut self, token: TokenKind, text: &'a str, sink: &mut dyn FnMut(Highlight<'a>)) {
166
164
let lookahead = self.peek();
165
+ let no_highlight = |sink: &mut dyn FnMut(_)| sink(Highlight::Token { text, class: None });
167
166
let class = match token {
168
- TokenKind::Whitespace => Class::None ,
167
+ TokenKind::Whitespace => return no_highlight(sink) ,
169
168
TokenKind::LineComment { doc_style } | TokenKind::BlockComment { doc_style, .. } => {
170
169
if doc_style.is_some() {
171
170
Class::DocComment
@@ -190,12 +189,12 @@ impl<'a> Classifier<'a> {
190
189
TokenKind::And => match lookahead {
191
190
Some(TokenKind::And) => {
192
191
let _and = self.tokens.next();
193
- sink(Highlight::Token { text: "&&", class: Class::Op });
192
+ sink(Highlight::Token { text: "&&", class: Some( Class::Op) });
194
193
return;
195
194
}
196
195
Some(TokenKind::Eq) => {
197
196
let _eq = self.tokens.next();
198
- sink(Highlight::Token { text: "&=", class: Class::Op });
197
+ sink(Highlight::Token { text: "&=", class: Some( Class::Op) });
199
198
return;
200
199
}
201
200
Some(TokenKind::Whitespace) => Class::Op,
@@ -226,7 +225,7 @@ impl<'a> Classifier<'a> {
226
225
| TokenKind::At
227
226
| TokenKind::Tilde
228
227
| TokenKind::Colon
229
- | TokenKind::Unknown => Class::None ,
228
+ | TokenKind::Unknown => return no_highlight(sink) ,
230
229
231
230
TokenKind::Question => Class::QuestionMark,
232
231
@@ -235,7 +234,7 @@ impl<'a> Classifier<'a> {
235
234
self.in_macro_nonterminal = true;
236
235
Class::MacroNonTerminal
237
236
}
238
- _ => Class::None ,
237
+ _ => return no_highlight(sink) ,
239
238
},
240
239
241
240
// This might be the start of an attribute. We're going to want to
@@ -251,8 +250,8 @@ impl<'a> Classifier<'a> {
251
250
self.in_attribute = true;
252
251
sink(Highlight::EnterSpan { class: Class::Attribute });
253
252
}
254
- sink(Highlight::Token { text: "#", class: Class:: None });
255
- sink(Highlight::Token { text: "!", class: Class:: None });
253
+ sink(Highlight::Token { text: "#", class: None });
254
+ sink(Highlight::Token { text: "!", class: None });
256
255
return;
257
256
}
258
257
// Case 2: #[outer_attribute]
@@ -262,16 +261,16 @@ impl<'a> Classifier<'a> {
262
261
}
263
262
_ => (),
264
263
}
265
- Class::None
264
+ return no_highlight(sink);
266
265
}
267
266
TokenKind::CloseBracket => {
268
267
if self.in_attribute {
269
268
self.in_attribute = false;
270
- sink(Highlight::Token { text: "]", class: Class:: None });
269
+ sink(Highlight::Token { text: "]", class: None });
271
270
sink(Highlight::ExitSpan);
272
271
return;
273
272
}
274
- Class::None
273
+ return no_highlight(sink);
275
274
}
276
275
TokenKind::Literal { kind, .. } => match kind {
277
276
// Text literals.
@@ -307,7 +306,7 @@ impl<'a> Classifier<'a> {
307
306
};
308
307
// Anything that didn't return above is the simple case where we the
309
308
// class just spans a single token, so we can use the `string` method.
310
- sink(Highlight::Token { text, class });
309
+ sink(Highlight::Token { text, class: Some(class) });
311
310
}
312
311
313
312
fn peek(&mut self) -> Option<TokenKind> {
@@ -337,10 +336,10 @@ fn exit_span(out: &mut String) {
337
336
/// ```
338
337
/// The latter can be thought of as a shorthand for the former, which is more
339
338
/// flexible.
340
- fn string<T: Display>(out: &mut String, text: T, klass: Class) {
339
+ fn string<T: Display>(out: &mut String, text: T, klass: Option< Class> ) {
341
340
match klass {
342
- Class:: None => write!(out, "{}", text).unwrap(),
343
- klass => write!(out, "<span class=\"{}\">{}</span>", klass.as_html(), text).unwrap(),
341
+ None => write!(out, "{}", text).unwrap(),
342
+ Some( klass) => write!(out, "<span class=\"{}\">{}</span>", klass.as_html(), text).unwrap(),
344
343
}
345
344
}
346
345
0 commit comments