@@ -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