Skip to content

Commit d2a823d

Browse files
authored
Merge pull request #343 from dtolnay/unnamed
Add logic to determine whether unnamed fmt arguments are present
2 parents 490f9c0 + b3bf7a6 commit d2a823d

File tree

1 file changed

+27
-11
lines changed

1 file changed

+27
-11
lines changed

impl/src/fmt.rs

Lines changed: 27 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ impl Display<'_> {
1313
// Transform `"error {var}"` to `"error {}", var`.
1414
pub fn expand_shorthand(&mut self, fields: &[Field]) {
1515
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;
1717
let mut member_index = Map::new();
1818
for (i, field) in fields.iter().enumerate() {
1919
member_index.insert(&field.member, i);
@@ -119,8 +119,13 @@ impl Display<'_> {
119119
}
120120
}
121121

122+
struct FmtArguments {
123+
named: Set<Ident>,
124+
unnamed: bool,
125+
}
126+
122127
#[allow(clippy::unnecessary_wraps)]
123-
fn explicit_named_args(input: ParseStream) -> Result<Set<Ident>> {
128+
fn explicit_named_args(input: ParseStream) -> Result<FmtArguments> {
124129
let ahead = input.fork();
125130
if let Ok(set) = try_explicit_named_args(&ahead) {
126131
input.advance_to(&ahead);
@@ -134,12 +139,18 @@ fn explicit_named_args(input: ParseStream) -> Result<Set<Ident>> {
134139
}
135140

136141
input.parse::<TokenStream>().unwrap();
137-
Ok(Set::new())
142+
Ok(FmtArguments {
143+
named: Set::new(),
144+
unnamed: false,
145+
})
138146
}
139147

140-
fn try_explicit_named_args(input: ParseStream) -> Result<Set<Ident>> {
148+
fn try_explicit_named_args(input: ParseStream) -> Result<FmtArguments> {
141149
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+
};
143154

144155
while !input.is_empty() {
145156
input.parse::<Token![,]>()?;
@@ -149,7 +160,9 @@ fn try_explicit_named_args(input: ParseStream) -> Result<Set<Ident>> {
149160
if input.peek(Ident::peek_any) && input.peek2(Token![=]) && !input.peek2(Token![==]) {
150161
let ident = input.call(Ident::parse_any)?;
151162
input.parse::<Token![=]>()?;
152-
named_args.insert(ident);
163+
args.named.insert(ident);
164+
} else {
165+
args.unnamed = true;
153166
}
154167
if *syn_full.get_or_insert_with(is_syn_full) {
155168
let ahead = input.fork();
@@ -161,22 +174,25 @@ fn try_explicit_named_args(input: ParseStream) -> Result<Set<Ident>> {
161174
scan_expr(input)?;
162175
}
163176

164-
Ok(named_args)
177+
Ok(args)
165178
}
166179

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+
};
169185

170186
while !input.is_empty() {
171187
if input.peek(Token![,]) && input.peek2(Ident::peek_any) && input.peek3(Token![=]) {
172188
input.parse::<Token![,]>()?;
173189
let ident = input.call(Ident::parse_any)?;
174190
input.parse::<Token![=]>()?;
175-
named_args.insert(ident);
191+
args.named.insert(ident);
176192
}
177193
}
178194

179-
Ok(named_args)
195+
Ok(args)
180196
}
181197

182198
fn is_syn_full() -> bool {

0 commit comments

Comments
 (0)