PR fixing wrong order of format parameters in strings. Issue #106572

Adding

Adding

Fixing small issues for PR

Adding tests

Removing unused binding

Changing the wording on note

Fixing PR comment
This commit is contained in:
Mads Ravn 2023-01-08 23:48:41 +01:00
parent 0b90256ada
commit f922c8395d
3 changed files with 97 additions and 1 deletions

View file

@ -271,7 +271,13 @@ impl<'a> Iterator for Parser<'a> {
); );
} }
} else { } else {
self.suggest_positional_arg_instead_of_captured_arg(arg); if let Some(&(_, maybe)) = self.cur.peek() {
if maybe == '?' {
self.suggest_format();
} else {
self.suggest_positional_arg_instead_of_captured_arg(arg);
}
}
} }
Some(NextArgument(Box::new(arg))) Some(NextArgument(Box::new(arg)))
} }
@ -823,6 +829,27 @@ impl<'a> Parser<'a> {
if found { Some(cur) } else { None } if found { Some(cur) } else { None }
} }
fn suggest_format(&mut self) {
if let (Some(pos), Some(_)) = (self.consume_pos('?'), self.consume_pos(':')) {
let word = self.word();
let _end = self.current_pos();
let pos = self.to_span_index(pos);
self.errors.insert(
0,
ParseError {
description: "expected format parameter to occur after `:`".to_owned(),
note: Some(
format!("`?` comes after `:`, try `{}:{}` instead", word, "?").to_owned(),
),
label: "expected `?` to occur after `:`".to_owned(),
span: pos.to(pos),
secondary_label: None,
should_be_replaced_with_positional_argument: false,
},
);
}
}
fn suggest_positional_arg_instead_of_captured_arg(&mut self, arg: Argument<'a>) { fn suggest_positional_arg_instead_of_captured_arg(&mut self, arg: Argument<'a>) {
if let Some(end) = self.consume_pos('.') { if let Some(end) = self.consume_pos('.') {
let byte_pos = self.to_span_index(end); let byte_pos = self.to_span_index(end);

View file

@ -0,0 +1,15 @@
fn main() {
let bar = 3;
format!("{?:}", bar);
//~^ ERROR invalid format string: expected format parameter to occur after `:`
format!("{?:bar}");
//~^ ERROR invalid format string: expected format parameter to occur after `:`
format!("{?:?}", bar);
//~^ ERROR invalid format string: expected format parameter to occur after `:`
format!("{??}", bar);
//~^ ERROR invalid format string: expected `'}'`, found `'?'`
format!("{?;bar}");
//~^ ERROR invalid format string: expected `'}'`, found `'?'`
format!("{?:#?}", bar);
//~^ ERROR invalid format string: expected format parameter to occur after `:`
}

View file

@ -0,0 +1,54 @@
error: invalid format string: expected format parameter to occur after `:`
--> $DIR/format-string-wrong-order.rs:3:15
|
LL | format!("{?:}", bar);
| ^ expected `?` to occur after `:` in format string
|
= note: `?` comes after `:`, try `:?` instead
error: invalid format string: expected format parameter to occur after `:`
--> $DIR/format-string-wrong-order.rs:5:15
|
LL | format!("{?:bar}");
| ^ expected `?` to occur after `:` in format string
|
= note: `?` comes after `:`, try `bar:?` instead
error: invalid format string: expected format parameter to occur after `:`
--> $DIR/format-string-wrong-order.rs:7:15
|
LL | format!("{?:?}", bar);
| ^ expected `?` to occur after `:` in format string
|
= note: `?` comes after `:`, try `:?` instead
error: invalid format string: expected `'}'`, found `'?'`
--> $DIR/format-string-wrong-order.rs:9:15
|
LL | format!("{??}", bar);
| -^ expected `}` in format string
| |
| because of this opening brace
|
= note: if you intended to print `{`, you can escape it using `{{`
error: invalid format string: expected `'}'`, found `'?'`
--> $DIR/format-string-wrong-order.rs:11:15
|
LL | format!("{?;bar}");
| -^ expected `}` in format string
| |
| because of this opening brace
|
= note: if you intended to print `{`, you can escape it using `{{`
error: invalid format string: expected format parameter to occur after `:`
--> $DIR/format-string-wrong-order.rs:13:15
|
LL | format!("{?:#?}", bar);
| ^ expected `?` to occur after `:` in format string
|
= note: `?` comes after `:`, try `:?` instead
error: aborting due to 6 previous errors