about summary refs log tree commit diff
path: root/compiler/rustc_parse_format/src
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 /compiler/rustc_parse_format/src
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>
Diffstat (limited to 'compiler/rustc_parse_format/src')
-rw-r--r--compiler/rustc_parse_format/src/lib.rs116
1 files changed, 50 insertions, 66 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,
+                            },
+                        );
+                    }
+                    _ => {}
+                };
+            }
         }
     }