@@ -6,9 +6,10 @@ use crate::mbe::macro_parser::{NamedMatch, NamedMatch::*};
6
6
use crate :: mbe:: metavar_expr:: { MetaVarExprConcatElem , RAW_IDENT_ERR } ;
7
7
use crate :: mbe:: { self , KleeneOp , MetaVarExpr } ;
8
8
use rustc_ast:: mut_visit:: { self , MutVisitor } ;
9
- use rustc_ast:: token:: IdentIsRaw ;
10
- use rustc_ast:: token:: { self , Delimiter , Token , TokenKind } ;
9
+ use rustc_ast:: token:: { self , Delimiter , Nonterminal , Token , TokenKind } ;
10
+ use rustc_ast:: token:: { IdentIsRaw , Lit , LitKind } ;
11
11
use rustc_ast:: tokenstream:: { DelimSpacing , DelimSpan , Spacing , TokenStream , TokenTree } ;
12
+ use rustc_ast:: ExprKind ;
12
13
use rustc_data_structures:: fx:: FxHashMap ;
13
14
use rustc_errors:: { pluralize, Diag , DiagCtxtHandle , PResult } ;
14
15
use rustc_parse:: lexer:: nfc_normalize;
@@ -750,7 +751,7 @@ fn transcribe_metavar_expr<'a>(
750
751
Ok ( ( ) )
751
752
}
752
753
753
- /// Extracts an identifier that can be originated from a `$var:ident` variable or from a token tree .
754
+ /// Extracts an metavariable value that can be an identifier, a token tree or a literal .
754
755
fn extract_ident < ' a > (
755
756
dcx : DiagCtxtHandle < ' a > ,
756
757
ident : Ident ,
@@ -763,19 +764,29 @@ fn extract_ident<'a>(
763
764
}
764
765
return Ok ( nt_ident. to_string ( ) ) ;
765
766
}
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 ) ) ;
767
+
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 . to_string ( ) ) ;
773
774
}
774
- return Ok ( token_ident. to_string ( ) ) ;
775
+
776
+ if let TokenKind :: Literal ( Lit { kind : LitKind :: Str , symbol, suffix : None } ) = kind {
777
+ return Ok ( symbol. to_string ( ) ) ;
778
+ }
779
+ }
780
+
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
+ {
785
+ return Ok ( symbol. to_string ( ) ) ;
775
786
}
776
787
}
777
788
Err ( dcx. struct_span_err (
778
789
ident. span ,
779
- "`${concat(..)}` currently only accepts identifiers or meta-variables as parameters " ,
790
+ "`${concat(..)}` currently only accepts identifiers, token trees or literals " ,
780
791
) )
781
792
}
0 commit comments