@@ -13,7 +13,7 @@ impl Display<'_> {
13
13
// Transform `"error {var}"` to `"error {}", var`.
14
14
pub fn expand_shorthand ( & mut self , fields : & [ Field ] ) {
15
15
let raw_args = self . args . clone ( ) ;
16
- let mut named_args = explicit_named_args. parse2 ( raw_args) . unwrap ( ) ;
16
+ let mut named_args = explicit_named_args. parse2 ( raw_args) . unwrap ( ) . named ;
17
17
let mut member_index = Map :: new ( ) ;
18
18
for ( i, field) in fields. iter ( ) . enumerate ( ) {
19
19
member_index. insert ( & field. member , i) ;
@@ -119,8 +119,13 @@ impl Display<'_> {
119
119
}
120
120
}
121
121
122
+ struct FmtArguments {
123
+ named : Set < Ident > ,
124
+ unnamed : bool ,
125
+ }
126
+
122
127
#[ allow( clippy:: unnecessary_wraps) ]
123
- fn explicit_named_args ( input : ParseStream ) -> Result < Set < Ident > > {
128
+ fn explicit_named_args ( input : ParseStream ) -> Result < FmtArguments > {
124
129
let ahead = input. fork ( ) ;
125
130
if let Ok ( set) = try_explicit_named_args ( & ahead) {
126
131
input. advance_to ( & ahead) ;
@@ -134,12 +139,18 @@ fn explicit_named_args(input: ParseStream) -> Result<Set<Ident>> {
134
139
}
135
140
136
141
input. parse :: < TokenStream > ( ) . unwrap ( ) ;
137
- Ok ( Set :: new ( ) )
142
+ Ok ( FmtArguments {
143
+ named : Set :: new ( ) ,
144
+ unnamed : false ,
145
+ } )
138
146
}
139
147
140
- fn try_explicit_named_args ( input : ParseStream ) -> Result < Set < Ident > > {
148
+ fn try_explicit_named_args ( input : ParseStream ) -> Result < FmtArguments > {
141
149
let mut syn_full = None ;
142
- let mut named_args = Set :: new ( ) ;
150
+ let mut args = FmtArguments {
151
+ named : Set :: new ( ) ,
152
+ unnamed : false ,
153
+ } ;
143
154
144
155
while !input. is_empty ( ) {
145
156
input. parse :: < Token ! [ , ] > ( ) ?;
@@ -149,7 +160,9 @@ fn try_explicit_named_args(input: ParseStream) -> Result<Set<Ident>> {
149
160
if input. peek ( Ident :: peek_any) && input. peek2 ( Token ! [ =] ) && !input. peek2 ( Token ! [ ==] ) {
150
161
let ident = input. call ( Ident :: parse_any) ?;
151
162
input. parse :: < Token ! [ =] > ( ) ?;
152
- named_args. insert ( ident) ;
163
+ args. named . insert ( ident) ;
164
+ } else {
165
+ args. unnamed = true ;
153
166
}
154
167
if * syn_full. get_or_insert_with ( is_syn_full) {
155
168
let ahead = input. fork ( ) ;
@@ -161,22 +174,25 @@ fn try_explicit_named_args(input: ParseStream) -> Result<Set<Ident>> {
161
174
scan_expr ( input) ?;
162
175
}
163
176
164
- Ok ( named_args )
177
+ Ok ( args )
165
178
}
166
179
167
- fn fallback_explicit_named_args ( input : ParseStream ) -> Result < Set < Ident > > {
168
- let mut named_args = Set :: new ( ) ;
180
+ fn fallback_explicit_named_args ( input : ParseStream ) -> Result < FmtArguments > {
181
+ let mut args = FmtArguments {
182
+ named : Set :: new ( ) ,
183
+ unnamed : false ,
184
+ } ;
169
185
170
186
while !input. is_empty ( ) {
171
187
if input. peek ( Token ! [ , ] ) && input. peek2 ( Ident :: peek_any) && input. peek3 ( Token ! [ =] ) {
172
188
input. parse :: < Token ! [ , ] > ( ) ?;
173
189
let ident = input. call ( Ident :: parse_any) ?;
174
190
input. parse :: < Token ! [ =] > ( ) ?;
175
- named_args . insert ( ident) ;
191
+ args . named . insert ( ident) ;
176
192
}
177
193
}
178
194
179
- Ok ( named_args )
195
+ Ok ( args )
180
196
}
181
197
182
198
fn is_syn_full ( ) -> bool {
0 commit comments