@@ -557,17 +557,13 @@ fn lockstep_iter_size(
557
557
}
558
558
}
559
559
TokenTree :: MetaVarExpr ( _, expr) => {
560
- let default_rslt = LockstepIterSize :: Unconstrained ;
561
- let Some ( ident) = expr. ident ( ) else {
562
- return default_rslt;
563
- } ;
564
- let name = MacroRulesNormalizedIdent :: new ( ident) ;
565
- match lookup_cur_matched ( name, interpolations, repeats) {
566
- Some ( MatchedSeq ( ads) ) => {
567
- default_rslt. with ( LockstepIterSize :: Constraint ( ads. len ( ) , name) )
568
- }
569
- _ => default_rslt,
570
- }
560
+ expr. metavars ( LockstepIterSize :: Unconstrained , |lis, ident| {
561
+ lis. with ( lockstep_iter_size (
562
+ & TokenTree :: MetaVar ( ident. span , * ident) ,
563
+ interpolations,
564
+ repeats,
565
+ ) )
566
+ } )
571
567
}
572
568
TokenTree :: Token ( ..) => LockstepIterSize :: Unconstrained ,
573
569
}
@@ -695,7 +691,22 @@ fn transcribe_metavar_expr<'a>(
695
691
let symbol = match element {
696
692
MetaVarExprConcatElem :: Ident ( elem) => elem. name ,
697
693
MetaVarExprConcatElem :: Literal ( elem) => * elem,
698
- MetaVarExprConcatElem :: Var ( elem) => extract_var_symbol ( dcx, * elem, interp) ?,
694
+ MetaVarExprConcatElem :: Var ( ident) => {
695
+ match matched_from_ident ( dcx, * ident, interp) ? {
696
+ NamedMatch :: MatchedSeq ( named_matches) => {
697
+ let curr_idx = repeats. last ( ) . unwrap ( ) . 0 ;
698
+ match & named_matches[ curr_idx] {
699
+ MatchedSeq ( _) => unimplemented ! ( ) ,
700
+ MatchedSingle ( pnr) => {
701
+ extract_symbol_from_pnr ( dcx, * ident, pnr) ?
702
+ }
703
+ }
704
+ }
705
+ NamedMatch :: MatchedSingle ( pnr) => {
706
+ extract_symbol_from_pnr ( dcx, * ident, pnr) ?
707
+ }
708
+ }
709
+ }
699
710
} ;
700
711
concatenated. push_str ( symbol. as_str ( ) ) ;
701
712
}
@@ -752,39 +763,37 @@ fn transcribe_metavar_expr<'a>(
752
763
}
753
764
754
765
/// Extracts an metavariable symbol that can be an identifier, a token tree or a literal.
755
- fn extract_var_symbol < ' a > (
766
+ fn extract_symbol_from_pnr < ' a > (
756
767
dcx : DiagCtxtHandle < ' a > ,
757
768
ident : Ident ,
758
- interp : & FxHashMap < MacroRulesNormalizedIdent , NamedMatch > ,
769
+ pnr : & ParseNtResult ,
759
770
) -> PResult < ' a , Symbol > {
760
- if let NamedMatch :: MatchedSingle ( pnr) = matched_from_ident ( dcx, ident, interp) ? {
761
- if let ParseNtResult :: Ident ( nt_ident, is_raw) = pnr {
762
- if let IdentIsRaw :: Yes = is_raw {
763
- return Err ( dcx. struct_span_err ( ident. span , RAW_IDENT_ERR ) ) ;
764
- }
765
- return Ok ( nt_ident. name ) ;
771
+ if let ParseNtResult :: Ident ( nt_ident, is_raw) = pnr {
772
+ if let IdentIsRaw :: Yes = is_raw {
773
+ return Err ( dcx. struct_span_err ( ident. span , RAW_IDENT_ERR ) ) ;
766
774
}
775
+ return Ok ( nt_ident. name ) ;
776
+ }
767
777
768
- if let ParseNtResult :: Tt ( TokenTree :: Token ( Token { kind, .. } , _) ) = pnr {
769
- if let TokenKind :: Ident ( symbol, is_raw) = kind {
770
- if let IdentIsRaw :: Yes = is_raw {
771
- return Err ( dcx. struct_span_err ( ident. span , RAW_IDENT_ERR ) ) ;
772
- }
773
- return Ok ( * symbol) ;
774
- }
775
-
776
- if let TokenKind :: Literal ( Lit { kind : LitKind :: Str , symbol, suffix : None } ) = kind {
777
- return Ok ( * symbol) ;
778
+ if let ParseNtResult :: Tt ( TokenTree :: Token ( Token { kind, .. } , _) ) = pnr {
779
+ if let TokenKind :: Ident ( symbol, is_raw) = kind {
780
+ if let IdentIsRaw :: Yes = is_raw {
781
+ return Err ( dcx. struct_span_err ( ident. span , RAW_IDENT_ERR ) ) ;
778
782
}
783
+ return Ok ( * symbol) ;
779
784
}
780
785
781
- if let ParseNtResult :: Nt ( nt) = pnr
782
- && let Nonterminal :: NtLiteral ( expr) = & * * nt
783
- && let ExprKind :: Lit ( Lit { kind : LitKind :: Str , symbol, suffix : None } ) = & expr. kind
784
- {
786
+ if let TokenKind :: Literal ( Lit { kind : LitKind :: Str , symbol, suffix : None } ) = kind {
785
787
return Ok ( * symbol) ;
786
788
}
787
789
}
790
+
791
+ if let ParseNtResult :: Nt ( nt) = pnr
792
+ && let Nonterminal :: NtLiteral ( expr) = & * * nt
793
+ && let ExprKind :: Lit ( Lit { kind : LitKind :: Str , symbol, suffix : None } ) = & expr. kind
794
+ {
795
+ return Ok ( * symbol) ;
796
+ }
788
797
Err ( dcx
789
798
. struct_err ( "metavariables of `${concat(..)}` must be of type `ident`, `literal` or `tt`" )
790
799
. with_note ( "currently only string literals are supported" )
0 commit comments