diff options
| author | xizheyin <xizheyin@smail.nju.edu.cn> | 2025-05-02 22:34:30 +0800 |
|---|---|---|
| committer | xizheyin <xizheyin@smail.nju.edu.cn> | 2025-05-03 22:39:43 +0800 |
| commit | 873ca5fa04b79da80ca779e0e577f06a07cea8d3 (patch) | |
| tree | 8269aba88fa4fa9c08cb060b74f0bdd274ea5dbd | |
| parent | 64867c68f4eb537215e65268903803f44f1fe6b6 (diff) | |
| download | rust-873ca5fa04b79da80ca779e0e577f06a07cea8d3.tar.gz rust-873ca5fa04b79da80ca779e0e577f06a07cea8d3.zip | |
Just suggest positional arg and adjust issue0139104 ui test
Signed-off-by: xizheyin <xizheyin@smail.nju.edu.cn>
| -rw-r--r-- | compiler/rustc_parse_format/src/lib.rs | 116 | ||||
| -rw-r--r-- | tests/ui/parser/issues/invalid-parse-format-issue-139104.rs | 17 | ||||
| -rw-r--r-- | tests/ui/parser/issues/invalid-parse-format-issue-139104.stderr | 96 |
3 files changed, 134 insertions, 95 deletions
diff --git a/compiler/rustc_parse_format/src/lib.rs b/compiler/rustc_parse_format/src/lib.rs index c356a97a55a..999e7159274 100644 --- a/compiler/rustc_parse_format/src/lib.rs +++ b/compiler/rustc_parse_format/src/lib.rs @@ -918,73 +918,57 @@ impl<'a> Parser<'a> { } fn suggest_positional_arg_instead_of_captured_arg(&mut self, arg: Argument<'a>) { - // If the argument is an identifier, it may be a field access. - if arg.is_identifier() { - if let Some(end) = self.consume_pos('.') { - let byte_pos = self.to_span_index(end); - let start = InnerOffset(byte_pos.0 + 1); - let field = self.argument(start); - // 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 { - 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, - }, - ); - } - _ => {} - }; - } - } - } else if matches!(arg.position, ArgumentNamed(_) | ArgumentIs(_)) { - let arg_name = match arg.position { - ArgumentNamed(arg_name) => &format!("`{arg_name}`"), - ArgumentIs(arg_index) => &format!("at index `{arg_index}`"), - _ => unreachable!(), - }; + // If the argument is not an identifier, it is not a field access. + if !arg.is_identifier() { + return; + } - self.errors.insert( - 0, - ParseError { - description: format!("invalid format string for argument {}", arg_name), - note: None, - label: format!("invalid format specifier for this argument"), - span: InnerSpan::new(arg.position_span.start, arg.position_span.end), - secondary_label: None, - suggestion: Suggestion::None, - }, - ); + if let Some(end) = self.consume_pos('.') { + let byte_pos = self.to_span_index(end); + let start = InnerOffset(byte_pos.0 + 1); + let field = self.argument(start); + // 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 { + 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, + }, + ); + } + _ => {} + }; + } } } diff --git a/tests/ui/parser/issues/invalid-parse-format-issue-139104.rs b/tests/ui/parser/issues/invalid-parse-format-issue-139104.rs index 0809235bb6d..7644df8be49 100644 --- a/tests/ui/parser/issues/invalid-parse-format-issue-139104.rs +++ b/tests/ui/parser/issues/invalid-parse-format-issue-139104.rs @@ -1,8 +1,13 @@ fn main() { - println!("{foo:_1.4}", foo = 3.14); //~ ERROR invalid format string: invalid format string for argument `foo` - println!("{foo:1.4_1.4}", foo = 3.14); //~ ERROR invalid format string: invalid format string for argument `foo` - println!("xxx{0:_1.4}", 1.11); //~ ERROR invalid format string: invalid format string for argument at index `0` - println!("{foo:_1.4", foo = 3.14); //~ ERROR invalid format string: invalid format string for argument `foo` - println!("xxx{0:_1.4", 1.11); //~ ERROR invalid format string: invalid format string for argument at index `0` - println!("xxx{ 0", 1.11); //~ ERROR invalid format string: expected `}`, found `0` + println!("{foo:_1.4}", foo = 3.14); //~ ERROR invalid format string: expected `}`, found `.` + println!("{0:_1.4}", 1.11); //~ ERROR invalid format string: expected `}`, found `.` + println!("{:_1.4}", 3.14); //~ ERROR invalid format string: expected `}`, found `.` + + println!("{foo:_1.4", foo = 3.14); //~ ERROR invalid format string: expected `}`, found `.` + println!("{0:_1.4", 1.11); //~ ERROR invalid format string: expected `}`, found `.` + println!("{:_1.4", 3.14); //~ ERROR invalid format string: expected `}`, found `.` + + println!("{ 0", 1.11); //~ ERROR invalid format string: expected `}`, found `0` + println!("{foo:1.4_1.4}", foo = 3.14); //~ ERROR invalid format string: expected `}`, found `.` + println!("{0:1.4_1.4}", 3.14); //~ ERROR invalid format string: expected `}`, found `.` } diff --git a/tests/ui/parser/issues/invalid-parse-format-issue-139104.stderr b/tests/ui/parser/issues/invalid-parse-format-issue-139104.stderr index ceae8d051e5..202aa450cab 100644 --- a/tests/ui/parser/issues/invalid-parse-format-issue-139104.stderr +++ b/tests/ui/parser/issues/invalid-parse-format-issue-139104.stderr @@ -1,42 +1,92 @@ -error: invalid format string: invalid format string for argument `foo` - --> $DIR/invalid-parse-format-issue-139104.rs:2:16 +error: invalid format string: expected `}`, found `.` + --> $DIR/invalid-parse-format-issue-139104.rs:2:22 | LL | println!("{foo:_1.4}", foo = 3.14); - | ^^^ invalid format specifier for this argument in format string + | - ^ expected `}` in format string + | | + | because of this opening brace + | + = note: if you intended to print `{`, you can escape it using `{{` -error: invalid format string: invalid format string for argument `foo` - --> $DIR/invalid-parse-format-issue-139104.rs:3:16 +error: invalid format string: expected `}`, found `.` + --> $DIR/invalid-parse-format-issue-139104.rs:3:20 | -LL | println!("{foo:1.4_1.4}", foo = 3.14); - | ^^^ invalid format specifier for this argument in format string +LL | println!("{0:_1.4}", 1.11); + | - ^ expected `}` in format string + | | + | because of this opening brace + | + = note: if you intended to print `{`, you can escape it using `{{` -error: invalid format string: invalid format string for argument at index `0` +error: invalid format string: expected `}`, found `.` --> $DIR/invalid-parse-format-issue-139104.rs:4:19 | -LL | println!("xxx{0:_1.4}", 1.11); - | ^ invalid format specifier for this argument in format string +LL | println!("{:_1.4}", 3.14); + | - ^ expected `}` in format string + | | + | because of this opening brace + | + = note: if you intended to print `{`, you can escape it using `{{` -error: invalid format string: invalid format string for argument `foo` - --> $DIR/invalid-parse-format-issue-139104.rs:5:16 +error: invalid format string: expected `}`, found `.` + --> $DIR/invalid-parse-format-issue-139104.rs:6:22 | LL | println!("{foo:_1.4", foo = 3.14); - | ^^^ invalid format specifier for this argument in format string + | - ^ 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/invalid-parse-format-issue-139104.rs:7:20 + | +LL | println!("{0:_1.4", 1.11); + | - ^ expected `}` in format string + | | + | because of this opening brace + | + = note: if you intended to print `{`, you can escape it using `{{` -error: invalid format string: invalid format string for argument at index `0` - --> $DIR/invalid-parse-format-issue-139104.rs:6:19 +error: invalid format string: expected `}`, found `.` + --> $DIR/invalid-parse-format-issue-139104.rs:8:19 + | +LL | println!("{:_1.4", 3.14); + | - ^ expected `}` in format string + | | + | because of this opening brace | -LL | println!("xxx{0:_1.4", 1.11); - | ^ invalid format specifier for this argument in format string + = note: if you intended to print `{`, you can escape it using `{{` error: invalid format string: expected `}`, found `0` - --> $DIR/invalid-parse-format-issue-139104.rs:7:21 + --> $DIR/invalid-parse-format-issue-139104.rs:10:18 + | +LL | println!("{ 0", 1.11); + | - ^ 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/invalid-parse-format-issue-139104.rs:11:25 + | +LL | println!("{foo:1.4_1.4}", foo = 3.14); + | - ^ 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/invalid-parse-format-issue-139104.rs:12:23 | -LL | println!("xxx{ 0", 1.11); - | - ^ expected `}` in format string - | | - | because of this opening brace +LL | println!("{0:1.4_1.4}", 3.14); + | - ^ expected `}` in format string + | | + | because of this opening brace | = note: if you intended to print `{`, you can escape it using `{{` -error: aborting due to 6 previous errors +error: aborting due to 9 previous errors |
