about summary refs log tree commit diff
diff options
context:
space:
mode:
authorxizheyin <xizheyin@smail.nju.edu.cn>2025-05-02 22:34:30 +0800
committerxizheyin <xizheyin@smail.nju.edu.cn>2025-05-03 22:39:43 +0800
commit873ca5fa04b79da80ca779e0e577f06a07cea8d3 (patch)
tree8269aba88fa4fa9c08cb060b74f0bdd274ea5dbd
parent64867c68f4eb537215e65268903803f44f1fe6b6 (diff)
downloadrust-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.rs116
-rw-r--r--tests/ui/parser/issues/invalid-parse-format-issue-139104.rs17
-rw-r--r--tests/ui/parser/issues/invalid-parse-format-issue-139104.stderr96
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