Skip to content

Commit

Permalink
Rollup merge of #119712 - madsravn:parsing-errors, r=estebank
Browse files Browse the repository at this point in the history
Adding alignment to the cases to test for specific error messages.

Adding alignment to the list of cases to test for specific error message. Covers `>`, `^` and `<`.

Pinging people who chimed in last time ( #106805 ): ``@estebank`` , ``@compiler-errors`` and ``@Nilstrieb``
  • Loading branch information
matthiaskrgr authored Jan 9, 2024
2 parents 50982bd + 506c066 commit deb504b
Show file tree
Hide file tree
Showing 3 changed files with 47 additions and 7 deletions.
28 changes: 22 additions & 6 deletions compiler/rustc_parse_format/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -289,10 +289,10 @@ impl<'a> Iterator for Parser<'a> {
}
} else {
if let Some(&(_, maybe)) = self.cur.peek() {
if maybe == '?' {
self.suggest_format();
} else {
self.suggest_positional_arg_instead_of_captured_arg(arg);
match maybe {
'?' => self.suggest_format_debug(),
'<' | '^' | '>' => self.suggest_format_align(maybe),
_ => self.suggest_positional_arg_instead_of_captured_arg(arg),
}
}
}
Expand Down Expand Up @@ -868,10 +868,9 @@ impl<'a> Parser<'a> {
found.then_some(cur)
}

fn suggest_format(&mut self) {
fn suggest_format_debug(&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,
Expand All @@ -887,6 +886,23 @@ impl<'a> Parser<'a> {
}
}

fn suggest_format_align(&mut self, alignment: char) {
if let Some(pos) = self.consume_pos(alignment) {
let pos = self.to_span_index(pos);
self.errors.insert(
0,
ParseError {
description: "expected format parameter to occur after `:`".to_owned(),
note: None,
label: format!("expected `{}` to occur after `:`", alignment).to_owned(),
span: pos.to(pos),
secondary_label: None,
suggestion: Suggestion::None,
},
);
}
}

fn suggest_positional_arg_instead_of_captured_arg(&mut self, arg: Argument<'a>) {
if let Some(end) = self.consume_pos('.') {
let byte_pos = self.to_span_index(end);
Expand Down
6 changes: 6 additions & 0 deletions tests/ui/fmt/format-string-wrong-order.rs
Original file line number Diff line number Diff line change
Expand Up @@ -12,4 +12,10 @@ fn main() {
//~^ ERROR invalid format string: expected `'}'`, found `'?'`
format!("{?:#?}", bar);
//~^ ERROR invalid format string: expected format parameter to occur after `:`
format!("Hello {<5:}!", "x");
//~^ ERROR invalid format string: expected format parameter to occur after `:`
format!("Hello {^5:}!", "x");
//~^ ERROR invalid format string: expected format parameter to occur after `:`
format!("Hello {>5:}!", "x");
//~^ ERROR invalid format string: expected format parameter to occur after `:`
}
20 changes: 19 additions & 1 deletion tests/ui/fmt/format-string-wrong-order.stderr
Original file line number Diff line number Diff line change
Expand Up @@ -50,5 +50,23 @@ LL | format!("{?:#?}", bar);
|
= note: `?` comes after `:`, try `:?` instead

error: aborting due to 6 previous errors
error: invalid format string: expected format parameter to occur after `:`
--> $DIR/format-string-wrong-order.rs:15:21
|
LL | format!("Hello {<5:}!", "x");
| ^ expected `<` to occur after `:` in format string

error: invalid format string: expected format parameter to occur after `:`
--> $DIR/format-string-wrong-order.rs:17:21
|
LL | format!("Hello {^5:}!", "x");
| ^ expected `^` to occur after `:` in format string

error: invalid format string: expected format parameter to occur after `:`
--> $DIR/format-string-wrong-order.rs:19:21
|
LL | format!("Hello {>5:}!", "x");
| ^ expected `>` to occur after `:` in format string

error: aborting due to 9 previous errors

0 comments on commit deb504b

Please sign in to comment.