@@ -557,17 +557,13 @@ fn lockstep_iter_size(
557557 }
558558 }
559559 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+ } )
571567 }
572568 TokenTree :: Token ( ..) => LockstepIterSize :: Unconstrained ,
573569 }
@@ -695,7 +691,22 @@ fn transcribe_metavar_expr<'a>(
695691 let symbol = match element {
696692 MetaVarExprConcatElem :: Ident ( elem) => elem. name ,
697693 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+ }
699710 } ;
700711 concatenated. push_str ( symbol. as_str ( ) ) ;
701712 }
@@ -752,39 +763,37 @@ fn transcribe_metavar_expr<'a>(
752763}
753764
754765/// 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 > (
756767 dcx : DiagCtxtHandle < ' a > ,
757768 ident : Ident ,
758- interp : & FxHashMap < MacroRulesNormalizedIdent , NamedMatch > ,
769+ pnr : & ParseNtResult ,
759770) -> 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 ) ) ;
766774 }
775+ return Ok ( nt_ident. name ) ;
776+ }
767777
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 ) ) ;
778782 }
783+ return Ok ( * symbol) ;
779784 }
780785
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 {
785787 return Ok ( * symbol) ;
786788 }
787789 }
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+ }
788797 Err ( dcx
789798 . struct_err ( "metavariables of `${concat(..)}` must be of type `ident`, `literal` or `tt`" )
790799 . with_note ( "currently only string literals are supported" )
0 commit comments