Just suggest positional arg and adjust issue0139104 ui test

Signed-off-by: xizheyin <xizheyin@smail.nju.edu.cn>
This commit is contained in:
xizheyin
2025-05-02 22:34:30 +08:00
parent 64867c68f4
commit 873ca5fa04
3 changed files with 147 additions and 108 deletions

View File

@@ -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,
},
);
}
_ => {}
};
}
}
}

View File

@@ -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 `.`
}

View File

@@ -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
error: invalid format string: invalid format string for argument `foo`
--> $DIR/invalid-parse-format-issue-139104.rs:3:16
|
LL | println!("{foo:1.4_1.4}", foo = 3.14);
| ^^^ invalid format specifier for this argument in format string
error: invalid format string: invalid format string for argument at index `0`
--> $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
error: invalid format string: invalid format string for argument `foo`
--> $DIR/invalid-parse-format-issue-139104.rs:5:16
|
LL | println!("{foo:_1.4", foo = 3.14);
| ^^^ invalid format specifier for this argument in format string
error: invalid format string: invalid format string for argument at index `0`
--> $DIR/invalid-parse-format-issue-139104.rs:6:19
|
LL | println!("xxx{0:_1.4", 1.11);
| ^ invalid format specifier for this argument in format string
error: invalid format string: expected `}`, found `0`
--> $DIR/invalid-parse-format-issue-139104.rs:7:21
|
LL | println!("xxx{ 0", 1.11);
| - ^ expected `}` in format string
| |
| because of this opening brace
| - ^ 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: invalid format string: expected `}`, found `.`
--> $DIR/invalid-parse-format-issue-139104.rs:3: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: expected `}`, found `.`
--> $DIR/invalid-parse-format-issue-139104.rs:4:19
|
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: expected `}`, found `.`
--> $DIR/invalid-parse-format-issue-139104.rs:6:22
|
LL | println!("{foo:_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: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: 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
|
= 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: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!("{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 9 previous errors