@@ -69,35 +69,26 @@ struct MacroInput {
69
69
/// Ok((fmtstr, parsed arguments))
70
70
/// ```
71
71
fn parse_args < ' a > ( ecx : & ExtCtxt < ' a > , sp : Span , tts : TokenStream ) -> PResult < ' a , MacroInput > {
72
- let mut args = FormatArguments :: new ( ) ;
73
-
74
72
let mut p = ecx. new_parser_from_tts ( tts) ;
75
73
76
- if p. token == token:: Eof {
77
- return Err ( ecx. dcx ( ) . create_err ( errors:: FormatRequiresString { span : sp } ) ) ;
78
- }
79
-
80
- let first_token = & p. token ;
81
-
82
- let fmtstr = if let token:: Literal ( lit) = first_token. kind
83
- && matches ! ( lit. kind, token:: Str | token:: StrRaw ( _) )
84
- {
74
+ // parse the format string
75
+ let fmtstr = match p. token . kind {
76
+ token:: Eof => return Err ( ecx. dcx ( ) . create_err ( errors:: FormatRequiresString { span : sp } ) ) ,
85
77
// This allows us to properly handle cases when the first comma
86
78
// after the format string is mistakenly replaced with any operator,
87
79
// which cause the expression parser to eat too much tokens.
88
- p. parse_literal_maybe_minus ( ) ?
89
- } else {
80
+ token:: Literal ( token:: Lit { kind : token:: Str | token:: StrRaw ( _) , .. } ) => {
81
+ p. parse_literal_maybe_minus ( ) ?
82
+ }
90
83
// Otherwise, we fall back to the expression parser.
91
- p. parse_expr ( ) ?
84
+ _ => p. parse_expr ( ) ?,
92
85
} ;
93
86
94
- // Only allow implicit captures to be used when the argument is a direct literal
95
- // instead of a macro expanding to one.
96
- let is_direct_literal = matches ! ( fmtstr. kind, ExprKind :: Lit ( _) ) ;
97
-
87
+ // parse comma FormatArgument pairs
88
+ let mut args = FormatArguments :: new ( ) ;
98
89
let mut first = true ;
99
-
100
90
while p. token != token:: Eof {
91
+ // parse a comma, or else report an error
101
92
if !p. eat ( exp ! ( Comma ) ) {
102
93
if first {
103
94
p. clear_expected_token_types ( ) ;
@@ -120,9 +111,11 @@ fn parse_args<'a>(ecx: &ExtCtxt<'a>, sp: Span, tts: TokenStream) -> PResult<'a,
120
111
}
121
112
}
122
113
first = false ;
114
+ // accept a trailing comma
123
115
if p. token == token:: Eof {
124
116
break ;
125
- } // accept trailing commas
117
+ }
118
+ // parse a FormatArgument
126
119
match p. token . ident ( ) {
127
120
Some ( ( ident, _) ) if p. look_ahead ( 1 , |t| * t == token:: Eq ) => {
128
121
p. bump ( ) ;
@@ -156,6 +149,10 @@ fn parse_args<'a>(ecx: &ExtCtxt<'a>, sp: Span, tts: TokenStream) -> PResult<'a,
156
149
}
157
150
}
158
151
}
152
+
153
+ // Only allow implicit captures for direct literals
154
+ let is_direct_literal = matches ! ( fmtstr. kind, ExprKind :: Lit ( _) ) ;
155
+
159
156
Ok ( MacroInput { fmtstr, args, is_direct_literal } )
160
157
}
161
158
0 commit comments