@@ -300,16 +300,27 @@ impl<'a> Parser<'a> {
300300 fn next_tok ( & mut self ) -> TokenAndSpan {
301301 loop {
302302 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 )
312318 }
319+ } else {
320+ ( tts. get_tt ( i) , i + 1 == tts. len ( ) )
321+ } ;
322+ if !is_last {
323+ self . tts . push ( ( tts, i + 1 ) ) ;
313324 }
314325 match tt {
315326 TokenTree :: Token ( sp, tok) => TokenAndSpan { tok : tok, sp : sp } ,
0 commit comments