Skip to content

Commit

Permalink
Extend format arg help for simple tuple index access expression
Browse files Browse the repository at this point in the history
  • Loading branch information
jieyouxu committed Mar 16, 2024
1 parent 22e241e commit 52a1125
Show file tree
Hide file tree
Showing 4 changed files with 70 additions and 15 deletions.
52 changes: 37 additions & 15 deletions compiler/rustc_parse_format/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -907,25 +907,47 @@ impl<'a> Parser<'a> {
let byte_pos = self.to_span_index(end);
let start = InnerOffset(byte_pos.0 + 1);
let field = self.argument(start);
// We can only parse `foo.bar` field access, any deeper nesting,
// or another type of expression, like method calls, are not supported
// We can only parse simple `foo.bar` field access or `foo.0` tuple index access, any
// deeper nesting, or another type of expression, like method calls, are not supported
if !self.consume('}') {
return;
}
if let ArgumentNamed(_) = arg.position {
if let ArgumentNamed(_) = field.position {
self.errors.insert(
0,
ParseError {
description: "field access isn't supported".to_string(),
note: None,
label: "not supported".to_string(),
span: InnerSpan::new(arg.position_span.start, field.position_span.end),
secondary_label: None,
suggestion: Suggestion::UsePositional,
},
);
}
match field.position {
ArgumentNamed(_) => {
self.errors.insert(
0,
ParseError {
description: "field access isn't supported".to_string(),
note: None,
label: "not supported".to_string(),
span: InnerSpan::new(
arg.position_span.start,
field.position_span.end,
),
secondary_label: None,
suggestion: Suggestion::UsePositional,
},
);
}
ArgumentIs(_) => {
self.errors.insert(
0,
ParseError {
description: "tuple index access isn't supported".to_string(),
note: None,
label: "not supported".to_string(),
span: InnerSpan::new(
arg.position_span.start,
field.position_span.end,
),
secondary_label: None,
suggestion: Suggestion::UsePositional,
},
);
}
_ => {}
};
}
}
}
Expand Down
10 changes: 10 additions & 0 deletions tests/ui/fmt/format-args-non-identifier-diagnostics.fixed
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
// Checks that there is a suggestion for simple tuple index access expression (used where an
// identifier is expected in a format arg) to use positional arg instead.
// Issue: <https://github.com/rust-lang/rust/issues/122535>.
//@ run-rustfix

fn main() {
let x = (1,);
println!("{0}", x.0);
//~^ ERROR invalid format string
}
10 changes: 10 additions & 0 deletions tests/ui/fmt/format-args-non-identifier-diagnostics.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
// Checks that there is a suggestion for simple tuple index access expression (used where an
// identifier is expected in a format arg) to use positional arg instead.
// Issue: <https://github.com/rust-lang/rust/issues/122535>.
//@ run-rustfix

fn main() {
let x = (1,);
println!("{x.0}");
//~^ ERROR invalid format string
}
13 changes: 13 additions & 0 deletions tests/ui/fmt/format-args-non-identifier-diagnostics.stderr
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
error: invalid format string: tuple index access isn't supported
--> $DIR/format-args-non-identifier-diagnostics.rs:8:16
|
LL | println!("{x.0}");
| ^^^ not supported in format string
|
help: consider using a positional formatting argument instead
|
LL | println!("{0}", x.0);
| ~ +++++

error: aborting due to 1 previous error

0 comments on commit 52a1125

Please sign in to comment.