@@ -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 ) ]
6666enum 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
114112enum 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