@@ -80,11 +80,6 @@ impl<'i> ParserInput<'i> {
80
80
cached_token : None ,
81
81
}
82
82
}
83
-
84
- #[ inline]
85
- fn cached_token_ref ( & self ) -> & Token < ' i > {
86
- & self . cached_token . as_ref ( ) . unwrap ( ) . token
87
- }
88
83
}
89
84
90
85
/// A CSS parser that borrows its `&str` input,
@@ -332,27 +327,15 @@ impl<'i: 't, 't> Parser<'i, 't> {
332
327
/// See the `Parser::parse_nested_block` method to parse the content of functions or blocks.
333
328
///
334
329
/// This only returns a closing token when it is unmatched (and therefore an error).
330
+ #[ inline]
335
331
pub fn next ( & mut self ) -> Result < & Token < ' i > , BasicParseError < ' i > > {
336
- loop {
337
- match self . next_including_whitespace_and_comments ( ) {
338
- Err ( e) => return Err ( e) ,
339
- Ok ( & Token :: WhiteSpace ( _) ) | Ok ( & Token :: Comment ( _) ) => { } ,
340
- _ => break
341
- }
342
- }
343
- Ok ( self . input . cached_token_ref ( ) )
332
+ self . next_common ( true , true )
344
333
}
345
334
346
335
/// Same as `Parser::next`, but does not skip whitespace tokens.
336
+ #[ inline]
347
337
pub fn next_including_whitespace ( & mut self ) -> Result < & Token < ' i > , BasicParseError < ' i > > {
348
- loop {
349
- match self . next_including_whitespace_and_comments ( ) {
350
- Err ( e) => return Err ( e) ,
351
- Ok ( & Token :: Comment ( _) ) => { } ,
352
- _ => break
353
- }
354
- }
355
- Ok ( self . input . cached_token_ref ( ) )
338
+ self . next_common ( false , true )
356
339
}
357
340
358
341
/// Same as `Parser::next`, but does not skip whitespace or comment tokens.
@@ -361,37 +344,59 @@ impl<'i: 't, 't> Parser<'i, 't> {
361
344
/// where comments are preserved.
362
345
/// When parsing higher-level values, per the CSS Syntax specification,
363
346
/// comments should always be ignored between tokens.
347
+ #[ inline]
364
348
pub fn next_including_whitespace_and_comments ( & mut self ) -> Result < & Token < ' i > , BasicParseError < ' i > > {
349
+ self . next_common ( false , false )
350
+ }
351
+
352
+ fn next_common ( & mut self , skip_whitespace : bool , skip_comments : bool )
353
+ -> Result < & Token < ' i > , BasicParseError < ' i > > {
354
+ let return_this_token = |token : & Token | {
355
+ match * token {
356
+ Token :: WhiteSpace ( _) if skip_whitespace => false ,
357
+ Token :: Comment ( _) if skip_comments => false ,
358
+ _ => true
359
+ }
360
+ } ;
361
+
365
362
if let Some ( block_type) = self . at_start_of . take ( ) {
366
363
consume_until_end_of_block ( block_type, & mut self . input . tokenizer ) ;
367
364
}
368
365
369
- let byte = self . input . tokenizer . next_byte ( ) ;
370
- if self . stop_before . contains ( Delimiters :: from_byte ( byte) ) {
371
- return Err ( BasicParseError :: EndOfInput )
372
- }
373
-
374
- let token_start_position = self . input . tokenizer . position ( ) ;
375
- let token;
376
- match self . input . cached_token {
377
- Some ( ref cached_token) if cached_token. start_position == token_start_position => {
378
- self . input . tokenizer . reset ( cached_token. end_position ) ;
379
- token = & cached_token. token
366
+ loop {
367
+ let byte = self . input . tokenizer . next_byte ( ) ;
368
+ if self . stop_before . contains ( Delimiters :: from_byte ( byte) ) {
369
+ return Err ( BasicParseError :: EndOfInput )
380
370
}
381
- _ => {
382
- let new_token = self . input . tokenizer . next ( ) . map_err ( |( ) | BasicParseError :: EndOfInput ) ?;
383
- self . input . cached_token = Some ( CachedToken {
384
- token : new_token,
385
- start_position : token_start_position,
386
- end_position : self . input . tokenizer . position ( ) ,
387
- } ) ;
388
- token = self . input . cached_token_ref ( )
371
+
372
+ let token_start_position = self . input . tokenizer . position ( ) ;
373
+ match self . input . cached_token {
374
+ Some ( ref cached_token) if cached_token. start_position == token_start_position => {
375
+ self . input . tokenizer . reset ( cached_token. end_position ) ;
376
+ if return_this_token ( & cached_token. token ) {
377
+ break
378
+ }
379
+ }
380
+ _ => {
381
+ let new_token = self . input . tokenizer . next ( ) . map_err ( |( ) | BasicParseError :: EndOfInput ) ?;
382
+ if return_this_token ( & new_token) {
383
+ self . input . cached_token = Some ( CachedToken {
384
+ token : new_token,
385
+ start_position : token_start_position,
386
+ end_position : self . input . tokenizer . position ( ) ,
387
+ } ) ;
388
+ break
389
+ }
390
+ }
389
391
}
390
392
}
391
393
394
+ let token = & self . input . cached_token . as_ref ( ) . unwrap ( ) . token ;
395
+
392
396
if let Some ( block_type) = BlockType :: opening ( token) {
393
397
self . at_start_of = Some ( block_type) ;
394
398
}
399
+
395
400
Ok ( token)
396
401
}
397
402
0 commit comments