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:
parent
0b90256ada
commit
f922c8395d
3 changed files with 97 additions and 1 deletions
|
@ -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);
|
||||||
|
|
15
tests/ui/fmt/format-string-wrong-order.rs
Normal file
15
tests/ui/fmt/format-string-wrong-order.rs
Normal 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 `:`
|
||||||
|
}
|
54
tests/ui/fmt/format-string-wrong-order.stderr
Normal file
54
tests/ui/fmt/format-string-wrong-order.stderr
Normal 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
|
||||||
|
|
Loading…
Add table
Reference in a new issue