@@ -556,17 +556,13 @@ fn lockstep_iter_size(
556556 }
557557 }
558558 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+ } )
570566 }
571567 TokenTree :: Token ( ..) => LockstepIterSize :: Unconstrained ,
572568 }
@@ -694,7 +690,20 @@ fn transcribe_metavar_expr<'a>(
694690 let string = match element {
695691 MetaVarExprConcatElem :: Ident ( elem) => elem. to_string ( ) ,
696692 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+ }
698707 } ;
699708 concatenated. push_str ( & string) ;
700709 }
@@ -751,28 +760,26 @@ fn transcribe_metavar_expr<'a>(
751760}
752761
753762/// 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 > (
755764 dcx : DiagCtxtHandle < ' a > ,
756- ident : Ident ,
757- interp : & FxHashMap < MacroRulesNormalizedIdent , NamedMatch > ,
765+ ident : & Ident ,
766+ pnr : & ParseNtResult ,
758767) -> 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 ) ) ;
765771 }
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 ) ) ;
775781 }
782+ return Ok ( token_ident. to_string ( ) ) ;
776783 }
777784 Err ( dcx. struct_span_err (
778785 ident. span ,
0 commit comments