@@ -38,17 +38,17 @@ pub fn render_with_highlighting(
38
38
FileName :: Custom ( String :: from ( "rustdoc-highlighting" ) ) ,
39
39
src. to_owned ( ) ,
40
40
) ;
41
- let highlight_result =
42
- lexer:: StringReader :: new_or_buffered_errs ( & sess, fm, None ) . and_then ( |lexer| {
43
- let mut classifier = Classifier :: new ( lexer, sess. source_map ( ) ) ;
44
-
45
- let mut highlighted_source = vec ! [ ] ;
46
- if classifier. write_source ( & mut highlighted_source) . is_err ( ) {
47
- Err ( classifier. lexer . buffer_fatal_errors ( ) )
48
- } else {
49
- Ok ( String :: from_utf8_lossy ( & highlighted_source) . into_owned ( ) )
50
- }
51
- } ) ;
41
+ let highlight_result = {
42
+ let lexer = lexer :: StringReader :: new ( & sess, fm, None ) ;
43
+ let mut classifier = Classifier :: new ( lexer, sess. source_map ( ) ) ;
44
+
45
+ let mut highlighted_source = vec ! [ ] ;
46
+ if classifier. write_source ( & mut highlighted_source) . is_err ( ) {
47
+ Err ( classifier. lexer . buffer_fatal_errors ( ) )
48
+ } else {
49
+ Ok ( String :: from_utf8_lossy ( & highlighted_source) . into_owned ( ) )
50
+ }
51
+ } ;
52
52
53
53
match highlight_result {
54
54
Ok ( highlighted_source) => {
@@ -79,6 +79,7 @@ pub fn render_with_highlighting(
79
79
/// each span of text in sequence.
80
80
struct Classifier < ' a > {
81
81
lexer : lexer:: StringReader < ' a > ,
82
+ peek_token : Option < Token > ,
82
83
source_map : & ' a SourceMap ,
83
84
84
85
// State of the classifier.
@@ -178,6 +179,7 @@ impl<'a> Classifier<'a> {
178
179
fn new ( lexer : lexer:: StringReader < ' a > , source_map : & ' a SourceMap ) -> Classifier < ' a > {
179
180
Classifier {
180
181
lexer,
182
+ peek_token : None ,
181
183
source_map,
182
184
in_attribute : false ,
183
185
in_macro : false ,
@@ -187,10 +189,19 @@ impl<'a> Classifier<'a> {
187
189
188
190
/// Gets the next token out of the lexer.
189
191
fn try_next_token ( & mut self ) -> Result < Token , HighlightError > {
190
- match self . lexer . try_next_token ( ) {
191
- Ok ( token) => Ok ( token) ,
192
- Err ( _) => Err ( HighlightError :: LexError ) ,
192
+ if let Some ( token) = self . peek_token . take ( ) {
193
+ return Ok ( token) ;
194
+ }
195
+ self . lexer . try_next_token ( ) . map_err ( |( ) | HighlightError :: LexError )
196
+ }
197
+
198
+ fn peek ( & mut self ) -> Result < & Token , HighlightError > {
199
+ if self . peek_token . is_none ( ) {
200
+ self . peek_token = Some (
201
+ self . lexer . try_next_token ( ) . map_err ( |( ) | HighlightError :: LexError ) ?
202
+ ) ;
193
203
}
204
+ Ok ( self . peek_token . as_ref ( ) . unwrap ( ) )
194
205
}
195
206
196
207
/// Exhausts the `lexer` writing the output into `out`.
@@ -234,7 +245,7 @@ impl<'a> Classifier<'a> {
234
245
// reference or dereference operator or a reference or pointer type, instead of the
235
246
// bit-and or multiplication operator.
236
247
token:: BinOp ( token:: And ) | token:: BinOp ( token:: Star )
237
- if self . lexer . peek ( ) != & token:: Whitespace => Class :: RefKeyWord ,
248
+ if self . peek ( ) ? != & token:: Whitespace => Class :: RefKeyWord ,
238
249
239
250
// Consider this as part of a macro invocation if there was a
240
251
// leading identifier.
@@ -257,7 +268,7 @@ impl<'a> Classifier<'a> {
257
268
token:: Question => Class :: QuestionMark ,
258
269
259
270
token:: Dollar => {
260
- if self . lexer . peek ( ) . is_ident ( ) {
271
+ if self . peek ( ) ? . is_ident ( ) {
261
272
self . in_macro_nonterminal = true ;
262
273
Class :: MacroNonTerminal
263
274
} else {
@@ -280,9 +291,9 @@ impl<'a> Classifier<'a> {
280
291
// as an attribute.
281
292
282
293
// Case 1: #![inner_attribute]
283
- if self . lexer . peek ( ) == & token:: Not {
294
+ if self . peek ( ) ? == & token:: Not {
284
295
self . try_next_token ( ) ?; // NOTE: consumes `!` token!
285
- if self . lexer . peek ( ) == & token:: OpenDelim ( token:: Bracket ) {
296
+ if self . peek ( ) ? == & token:: OpenDelim ( token:: Bracket ) {
286
297
self . in_attribute = true ;
287
298
out. enter_span ( Class :: Attribute ) ?;
288
299
}
@@ -292,7 +303,7 @@ impl<'a> Classifier<'a> {
292
303
}
293
304
294
305
// Case 2: #[outer_attribute]
295
- if self . lexer . peek ( ) == & token:: OpenDelim ( token:: Bracket ) {
306
+ if self . peek ( ) ? == & token:: OpenDelim ( token:: Bracket ) {
296
307
self . in_attribute = true ;
297
308
out. enter_span ( Class :: Attribute ) ?;
298
309
}
@@ -341,7 +352,7 @@ impl<'a> Classifier<'a> {
341
352
if self . in_macro_nonterminal {
342
353
self . in_macro_nonterminal = false ;
343
354
Class :: MacroNonTerminal
344
- } else if self . lexer . peek ( ) == & token:: Not {
355
+ } else if self . peek ( ) ? == & token:: Not {
345
356
self . in_macro = true ;
346
357
Class :: Macro
347
358
} else {
0 commit comments