@@ -300,16 +300,27 @@ impl<'a> Parser<'a> {
300
300
fn next_tok ( & mut self ) -> TokenAndSpan {
301
301
loop {
302
302
let tok = if let Some ( ( tts, i) ) = self . tts . pop ( ) {
303
- let tt = tts. get_tt ( i) ;
304
- if i + 1 < tts. len ( ) {
305
- self . tts . push ( ( tts, i + 1 ) ) ;
306
- }
307
- // FIXME(jseyfried): remove after fixing #39390 in #39419.
308
- if self . quote_depth > 0 {
309
- if let TokenTree :: Sequence ( sp, _) = tt {
310
- self . span_err ( sp, "attempted to repeat an expression containing no \
311
- syntax variables matched as repeating at this depth") ;
303
+ let ( tt, is_last) = if let & TokenTree :: Sequence ( span, ref seq) = & tts {
304
+ if i == 0 {
305
+ ( TokenTree :: Token ( span, token:: Dollar ) , false )
306
+ } else if i == 1 {
307
+ ( TokenTree :: Token ( span, token:: OpenDelim ( token:: Paren ) ) , false )
308
+ } else if i < tts. len ( ) + 2 {
309
+ ( tts. get_tt ( i - 2 ) , false )
310
+ } else if i == tts. len ( ) + 2 {
311
+ ( TokenTree :: Token ( span, token:: CloseDelim ( token:: Paren ) ) , false )
312
+ } else if i == tts. len ( ) + 3 && seq. separator . is_some ( ) {
313
+ ( TokenTree :: Token ( span, seq. separator . clone ( ) . unwrap ( ) ) , false )
314
+ } else if seq. op == tokenstream:: KleeneOp :: ZeroOrMore {
315
+ ( TokenTree :: Token ( span, token:: BinOp ( token:: Star ) ) , true )
316
+ } else {
317
+ ( TokenTree :: Token ( span, token:: BinOp ( token:: Plus ) ) , true )
312
318
}
319
+ } else {
320
+ ( tts. get_tt ( i) , i + 1 == tts. len ( ) )
321
+ } ;
322
+ if !is_last {
323
+ self . tts . push ( ( tts, i + 1 ) ) ;
313
324
}
314
325
match tt {
315
326
TokenTree :: Token ( sp, tok) => TokenAndSpan { tok : tok, sp : sp } ,
0 commit comments