@@ -64,7 +64,6 @@ fn write_footer(out: &mut String, playground_button: Option<&str>) {
64
64
/// How a span of text is classified. Mostly corresponds to token kinds.
65
65
#[ derive( Clone , Copy , Debug , Eq , PartialEq ) ]
66
66
enum Class {
67
- None ,
68
67
Comment ,
69
68
DocComment ,
70
69
Attribute ,
@@ -89,7 +88,6 @@ impl Class {
89
88
/// Returns the css class expected by rustdoc for each `Class`.
90
89
fn as_html ( self ) -> & ' static str {
91
90
match self {
92
- Class :: None => "" ,
93
91
Class :: Comment => "comment" ,
94
92
Class :: DocComment => "doccomment" ,
95
93
Class :: Attribute => "attribute" ,
@@ -112,7 +110,7 @@ impl Class {
112
110
}
113
111
114
112
enum Highlight < ' a > {
115
- Token { text : & ' a str , class : Class } ,
113
+ Token { text : & ' a str , class : Option < Class > } ,
116
114
EnterSpan { class : Class } ,
117
115
ExitSpan ,
118
116
}
@@ -166,8 +164,9 @@ impl<'a> Classifier<'a> {
166
164
/// a couple of following ones as well.
167
165
fn advance ( & mut self , token : TokenKind , text : & ' a str , sink : & mut dyn FnMut ( Highlight < ' a > ) ) {
168
166
let lookahead = self . peek ( ) ;
167
+ let no_highlight = |sink : & mut dyn FnMut ( _) | sink ( Highlight :: Token { text, class : None } ) ;
169
168
let class = match token {
170
- TokenKind :: Whitespace => Class :: None ,
169
+ TokenKind :: Whitespace => return no_highlight ( sink ) ,
171
170
TokenKind :: LineComment { doc_style } | TokenKind :: BlockComment { doc_style, .. } => {
172
171
if doc_style. is_some ( ) {
173
172
Class :: DocComment
@@ -192,12 +191,12 @@ impl<'a> Classifier<'a> {
192
191
TokenKind :: And => match lookahead {
193
192
Some ( TokenKind :: And ) => {
194
193
let _and = self . tokens . next ( ) ;
195
- sink ( Highlight :: Token { text : "&&" , class : Class :: Op } ) ;
194
+ sink ( Highlight :: Token { text : "&&" , class : Some ( Class :: Op ) } ) ;
196
195
return ;
197
196
}
198
197
Some ( TokenKind :: Eq ) => {
199
198
let _eq = self . tokens . next ( ) ;
200
- sink ( Highlight :: Token { text : "&=" , class : Class :: Op } ) ;
199
+ sink ( Highlight :: Token { text : "&=" , class : Some ( Class :: Op ) } ) ;
201
200
return ;
202
201
}
203
202
Some ( TokenKind :: Whitespace ) => Class :: Op ,
@@ -228,7 +227,7 @@ impl<'a> Classifier<'a> {
228
227
| TokenKind :: At
229
228
| TokenKind :: Tilde
230
229
| TokenKind :: Colon
231
- | TokenKind :: Unknown => Class :: None ,
230
+ | TokenKind :: Unknown => return no_highlight ( sink ) ,
232
231
233
232
TokenKind :: Question => Class :: QuestionMark ,
234
233
@@ -237,7 +236,7 @@ impl<'a> Classifier<'a> {
237
236
self . in_macro_nonterminal = true ;
238
237
Class :: MacroNonTerminal
239
238
}
240
- _ => Class :: None ,
239
+ _ => return no_highlight ( sink ) ,
241
240
} ,
242
241
243
242
// This might be the start of an attribute. We're going to want to
@@ -253,8 +252,8 @@ impl<'a> Classifier<'a> {
253
252
self . in_attribute = true ;
254
253
sink ( Highlight :: EnterSpan { class : Class :: Attribute } ) ;
255
254
}
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 } ) ;
258
257
return ;
259
258
}
260
259
// Case 2: #[outer_attribute]
@@ -264,16 +263,16 @@ impl<'a> Classifier<'a> {
264
263
}
265
264
_ => ( ) ,
266
265
}
267
- Class :: None
266
+ return no_highlight ( sink ) ;
268
267
}
269
268
TokenKind :: CloseBracket => {
270
269
if self . in_attribute {
271
270
self . in_attribute = false ;
272
- sink ( Highlight :: Token { text : "]" , class : Class :: None } ) ;
271
+ sink ( Highlight :: Token { text : "]" , class : None } ) ;
273
272
sink ( Highlight :: ExitSpan ) ;
274
273
return ;
275
274
}
276
- Class :: None
275
+ return no_highlight ( sink ) ;
277
276
}
278
277
TokenKind :: Literal { kind, .. } => match kind {
279
278
// Text literals.
@@ -309,7 +308,7 @@ impl<'a> Classifier<'a> {
309
308
} ;
310
309
// Anything that didn't return above is the simple case where we the
311
310
// 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 ) } ) ;
313
312
}
314
313
315
314
fn peek ( & mut self ) -> Option < TokenKind > {
@@ -339,10 +338,10 @@ fn exit_span(out: &mut String) {
339
338
/// ```
340
339
/// The latter can be thought of as a shorthand for the former, which is more
341
340
/// 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 > ) {
343
342
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 ( ) ,
346
345
}
347
346
}
348
347
0 commit comments