@@ -556,17 +556,13 @@ fn lockstep_iter_size(
556
556
}
557
557
}
558
558
TokenTree :: MetaVarExpr ( _, expr) => {
559
- let default_rslt = LockstepIterSize :: Unconstrained ;
560
- let Some ( ident) = expr. ident ( ) else {
561
- return default_rslt;
562
- } ;
563
- let name = MacroRulesNormalizedIdent :: new ( ident) ;
564
- match lookup_cur_matched ( name, interpolations, repeats) {
565
- Some ( MatchedSeq ( ads) ) => {
566
- default_rslt. with ( LockstepIterSize :: Constraint ( ads. len ( ) , name) )
567
- }
568
- _ => default_rslt,
569
- }
559
+ expr. metavars ( LockstepIterSize :: Unconstrained , |lis, ident| {
560
+ lis. with ( lockstep_iter_size (
561
+ & TokenTree :: MetaVar ( ident. span , * ident) ,
562
+ interpolations,
563
+ repeats,
564
+ ) )
565
+ } )
570
566
}
571
567
TokenTree :: Token ( ..) => LockstepIterSize :: Unconstrained ,
572
568
}
@@ -694,7 +690,20 @@ fn transcribe_metavar_expr<'a>(
694
690
let string = match element {
695
691
MetaVarExprConcatElem :: Ident ( elem) => elem. to_string ( ) ,
696
692
MetaVarExprConcatElem :: Literal ( elem) => elem. as_str ( ) . into ( ) ,
697
- MetaVarExprConcatElem :: Var ( elem) => extract_ident ( dcx, * elem, interp) ?,
693
+ MetaVarExprConcatElem :: Var ( ident) => {
694
+ match matched_from_ident ( dcx, * ident, interp) ? {
695
+ NamedMatch :: MatchedSeq ( named_matches) => {
696
+ let curr_idx = repeats. last ( ) . unwrap ( ) . 0 ;
697
+ match & named_matches[ curr_idx] {
698
+ MatchedSeq ( _) => unimplemented ! ( ) ,
699
+ MatchedSingle ( pnr) => extract_ident_from_pnr ( dcx, ident, pnr) ?,
700
+ }
701
+ }
702
+ NamedMatch :: MatchedSingle ( pnr) => {
703
+ extract_ident_from_pnr ( dcx, ident, pnr) ?
704
+ }
705
+ }
706
+ }
698
707
} ;
699
708
concatenated. push_str ( & string) ;
700
709
}
@@ -751,28 +760,26 @@ fn transcribe_metavar_expr<'a>(
751
760
}
752
761
753
762
/// Extracts an identifier that can be originated from a `$var:ident` variable or from a token tree.
754
- fn extract_ident < ' a > (
763
+ fn extract_ident_from_pnr < ' a > (
755
764
dcx : DiagCtxtHandle < ' a > ,
756
- ident : Ident ,
757
- interp : & FxHashMap < MacroRulesNormalizedIdent , NamedMatch > ,
765
+ ident : & Ident ,
766
+ pnr : & ParseNtResult ,
758
767
) -> PResult < ' a , String > {
759
- if let NamedMatch :: MatchedSingle ( pnr) = matched_from_ident ( dcx, ident, interp) ? {
760
- if let ParseNtResult :: Ident ( nt_ident, is_raw) = pnr {
761
- if let IdentIsRaw :: Yes = is_raw {
762
- return Err ( dcx. struct_span_err ( ident. span , RAW_IDENT_ERR ) ) ;
763
- }
764
- return Ok ( nt_ident. to_string ( ) ) ;
768
+ if let ParseNtResult :: Ident ( nt_ident, is_raw) = pnr {
769
+ if let IdentIsRaw :: Yes = is_raw {
770
+ return Err ( dcx. struct_span_err ( ident. span , RAW_IDENT_ERR ) ) ;
765
771
}
766
- if let ParseNtResult :: Tt ( TokenTree :: Token (
767
- Token { kind : TokenKind :: Ident ( token_ident , is_raw ) , .. } ,
768
- _ ,
769
- ) ) = pnr
770
- {
771
- if let IdentIsRaw :: Yes = is_raw {
772
- return Err ( dcx . struct_span_err ( ident . span , RAW_IDENT_ERR ) ) ;
773
- }
774
- return Ok ( token_ident . to_string ( ) ) ;
772
+ return Ok ( nt_ident . to_string ( ) ) ;
773
+ }
774
+ if let ParseNtResult :: Tt ( TokenTree :: Token (
775
+ Token { kind : TokenKind :: Ident ( token_ident , is_raw ) , .. } ,
776
+ _ ,
777
+ ) ) = pnr
778
+ {
779
+ if let IdentIsRaw :: Yes = is_raw {
780
+ return Err ( dcx . struct_span_err ( ident . span , RAW_IDENT_ERR ) ) ;
775
781
}
782
+ return Ok ( token_ident. to_string ( ) ) ;
776
783
}
777
784
Err ( dcx. struct_span_err (
778
785
ident. span ,
0 commit comments