@@ -375,6 +375,19 @@ fn transcribe_metavar<'tx>(
375
375
return Ok ( ( ) ) ;
376
376
} ;
377
377
378
+ let MatchedSingle ( pnr) = cur_matched else {
379
+ // We were unable to descend far enough. This is an error.
380
+ return Err ( dcx. create_err ( MacroVarStillRepeating { span : sp, ident } ) ) ;
381
+ } ;
382
+
383
+ transcribe_pnr ( tscx, sp, pnr)
384
+ }
385
+
386
+ fn transcribe_pnr < ' tx > (
387
+ tscx : & mut TranscrCtx < ' tx , ' _ > ,
388
+ mut sp : Span ,
389
+ pnr : & ParseNtResult ,
390
+ ) -> PResult < ' tx , ( ) > {
378
391
// We wrap the tokens in invisible delimiters, unless they are already wrapped
379
392
// in invisible delimiters with the same `MetaVarKind`. Because some proc
380
393
// macros can't handle multiple layers of invisible delimiters of the same
@@ -404,33 +417,33 @@ fn transcribe_metavar<'tx>(
404
417
)
405
418
} ;
406
419
407
- let tt = match cur_matched {
408
- MatchedSingle ( ParseNtResult :: Tt ( tt) ) => {
420
+ let tt = match pnr {
421
+ ParseNtResult :: Tt ( tt) => {
409
422
// `tt`s are emitted into the output stream directly as "raw tokens",
410
423
// without wrapping them into groups. Other variables are emitted into
411
424
// the output stream as groups with `Delimiter::Invisible` to maintain
412
425
// parsing priorities.
413
426
maybe_use_metavar_location ( tscx. psess , & tscx. stack , sp, tt, & mut tscx. marker )
414
427
}
415
- MatchedSingle ( ParseNtResult :: Ident ( ident, is_raw) ) => {
428
+ ParseNtResult :: Ident ( ident, is_raw) => {
416
429
tscx. marker . mark_span ( & mut sp) ;
417
430
with_metavar_spans ( |mspans| mspans. insert ( ident. span , sp) ) ;
418
431
let kind = token:: NtIdent ( * ident, * is_raw) ;
419
432
TokenTree :: token_alone ( kind, sp)
420
433
}
421
- MatchedSingle ( ParseNtResult :: Lifetime ( ident, is_raw) ) => {
434
+ ParseNtResult :: Lifetime ( ident, is_raw) => {
422
435
tscx. marker . mark_span ( & mut sp) ;
423
436
with_metavar_spans ( |mspans| mspans. insert ( ident. span , sp) ) ;
424
437
let kind = token:: NtLifetime ( * ident, * is_raw) ;
425
438
TokenTree :: token_alone ( kind, sp)
426
439
}
427
- MatchedSingle ( ParseNtResult :: Item ( item) ) => {
440
+ ParseNtResult :: Item ( item) => {
428
441
mk_delimited ( item. span , MetaVarKind :: Item , TokenStream :: from_ast ( item) )
429
442
}
430
- MatchedSingle ( ParseNtResult :: Block ( block) ) => {
443
+ ParseNtResult :: Block ( block) => {
431
444
mk_delimited ( block. span , MetaVarKind :: Block , TokenStream :: from_ast ( block) )
432
445
}
433
- MatchedSingle ( ParseNtResult :: Stmt ( stmt) ) => {
446
+ ParseNtResult :: Stmt ( stmt) => {
434
447
let stream = if let StmtKind :: Empty = stmt. kind {
435
448
// FIXME: Properly collect tokens for empty statements.
436
449
TokenStream :: token_alone ( token:: Semi , stmt. span )
@@ -439,10 +452,10 @@ fn transcribe_metavar<'tx>(
439
452
} ;
440
453
mk_delimited ( stmt. span , MetaVarKind :: Stmt , stream)
441
454
}
442
- MatchedSingle ( ParseNtResult :: Pat ( pat, pat_kind) ) => {
455
+ ParseNtResult :: Pat ( pat, pat_kind) => {
443
456
mk_delimited ( pat. span , MetaVarKind :: Pat ( * pat_kind) , TokenStream :: from_ast ( pat) )
444
457
}
445
- MatchedSingle ( ParseNtResult :: Expr ( expr, kind) ) => {
458
+ ParseNtResult :: Expr ( expr, kind) => {
446
459
let ( can_begin_literal_maybe_minus, can_begin_string_literal) = match & expr. kind {
447
460
ExprKind :: Lit ( _) => ( true , true ) ,
448
461
ExprKind :: Unary ( UnOp :: Neg , e) if matches ! ( & e. kind, ExprKind :: Lit ( _) ) => {
@@ -460,31 +473,27 @@ fn transcribe_metavar<'tx>(
460
473
TokenStream :: from_ast ( expr) ,
461
474
)
462
475
}
463
- MatchedSingle ( ParseNtResult :: Literal ( lit) ) => {
476
+ ParseNtResult :: Literal ( lit) => {
464
477
mk_delimited ( lit. span , MetaVarKind :: Literal , TokenStream :: from_ast ( lit) )
465
478
}
466
- MatchedSingle ( ParseNtResult :: Ty ( ty) ) => {
479
+ ParseNtResult :: Ty ( ty) => {
467
480
let is_path = matches ! ( & ty. kind, TyKind :: Path ( None , _path) ) ;
468
481
mk_delimited ( ty. span , MetaVarKind :: Ty { is_path } , TokenStream :: from_ast ( ty) )
469
482
}
470
- MatchedSingle ( ParseNtResult :: Meta ( attr_item) ) => {
483
+ ParseNtResult :: Meta ( attr_item) => {
471
484
let has_meta_form = attr_item. meta_kind ( ) . is_some ( ) ;
472
485
mk_delimited (
473
486
attr_item. span ( ) ,
474
487
MetaVarKind :: Meta { has_meta_form } ,
475
488
TokenStream :: from_ast ( attr_item) ,
476
489
)
477
490
}
478
- MatchedSingle ( ParseNtResult :: Path ( path) ) => {
491
+ ParseNtResult :: Path ( path) => {
479
492
mk_delimited ( path. span , MetaVarKind :: Path , TokenStream :: from_ast ( path) )
480
493
}
481
- MatchedSingle ( ParseNtResult :: Vis ( vis) ) => {
494
+ ParseNtResult :: Vis ( vis) => {
482
495
mk_delimited ( vis. span , MetaVarKind :: Vis , TokenStream :: from_ast ( vis) )
483
496
}
484
- MatchedSeq ( ..) => {
485
- // We were unable to descend far enough. This is an error.
486
- return Err ( dcx. create_err ( MacroVarStillRepeating { span : sp, ident } ) ) ;
487
- }
488
497
} ;
489
498
490
499
tscx. result . push ( tt) ;
0 commit comments