Add suggestion for incorrect field syntax.
This commit adds a suggestion when a `=` character is used when specifying the value of a field in a struct constructor incorrectly instead of a `:` character.
This commit is contained in:
parent
6bba352cad
commit
f14d007ee4
4 changed files with 109 additions and 1 deletions
|
@ -2263,8 +2263,24 @@ impl<'a> Parser<'a> {
|
||||||
let lo = self.span;
|
let lo = self.span;
|
||||||
|
|
||||||
// Check if a colon exists one ahead. This means we're parsing a fieldname.
|
// Check if a colon exists one ahead. This means we're parsing a fieldname.
|
||||||
let (fieldname, expr, is_shorthand) = if self.look_ahead(1, |t| t == &token::Colon) {
|
let (fieldname, expr, is_shorthand) = if self.look_ahead(1, |t| {
|
||||||
|
t == &token::Colon || t == &token::Eq
|
||||||
|
}) {
|
||||||
let fieldname = self.parse_field_name()?;
|
let fieldname = self.parse_field_name()?;
|
||||||
|
|
||||||
|
// Check for an equals token. This means the source incorrectly attempts to
|
||||||
|
// initialize a field with an eq rather than a colon.
|
||||||
|
if self.token == token::Eq {
|
||||||
|
self.diagnostic()
|
||||||
|
.struct_span_err(self.span, "expected `:`, found `=`")
|
||||||
|
.span_suggestion_with_applicability(
|
||||||
|
fieldname.span.shrink_to_hi().to(self.span),
|
||||||
|
"replace equals symbol with a colon",
|
||||||
|
":".to_string(),
|
||||||
|
Applicability::MachineApplicable,
|
||||||
|
)
|
||||||
|
.emit();
|
||||||
|
}
|
||||||
self.bump(); // `:`
|
self.bump(); // `:`
|
||||||
(fieldname, self.parse_expr()?, false)
|
(fieldname, self.parse_expr()?, false)
|
||||||
} else {
|
} else {
|
||||||
|
|
37
src/test/ui/issues/issue-57684.fixed
Normal file
37
src/test/ui/issues/issue-57684.fixed
Normal file
|
@ -0,0 +1,37 @@
|
||||||
|
// run-rustfix
|
||||||
|
|
||||||
|
#![allow(warnings)]
|
||||||
|
|
||||||
|
// This test checks that the following error is emitted when a `=` character is used to initialize
|
||||||
|
// a struct field when a `:` is expected.
|
||||||
|
//
|
||||||
|
// ```
|
||||||
|
// error: struct fields are initialized with a colon
|
||||||
|
// --> $DIR/issue-57684.rs:12:20
|
||||||
|
// |
|
||||||
|
// LL | let _ = X { f1 = 5 };
|
||||||
|
// | ^ help: replace equals symbol with a colon: `:`
|
||||||
|
// ```
|
||||||
|
|
||||||
|
struct X {
|
||||||
|
f1: i32,
|
||||||
|
}
|
||||||
|
|
||||||
|
struct Y {
|
||||||
|
f1: i32,
|
||||||
|
f2: i32,
|
||||||
|
f3: i32,
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
let _ = X { f1: 5 };
|
||||||
|
//~^ ERROR expected `:`, found `=`
|
||||||
|
|
||||||
|
let f3 = 3;
|
||||||
|
let _ = Y {
|
||||||
|
f1: 5,
|
||||||
|
//~^ ERROR expected `:`, found `=`
|
||||||
|
f2: 4,
|
||||||
|
f3,
|
||||||
|
};
|
||||||
|
}
|
37
src/test/ui/issues/issue-57684.rs
Normal file
37
src/test/ui/issues/issue-57684.rs
Normal file
|
@ -0,0 +1,37 @@
|
||||||
|
// run-rustfix
|
||||||
|
|
||||||
|
#![allow(warnings)]
|
||||||
|
|
||||||
|
// This test checks that the following error is emitted when a `=` character is used to initialize
|
||||||
|
// a struct field when a `:` is expected.
|
||||||
|
//
|
||||||
|
// ```
|
||||||
|
// error: struct fields are initialized with a colon
|
||||||
|
// --> $DIR/issue-57684.rs:12:20
|
||||||
|
// |
|
||||||
|
// LL | let _ = X { f1 = 5 };
|
||||||
|
// | ^ help: replace equals symbol with a colon: `:`
|
||||||
|
// ```
|
||||||
|
|
||||||
|
struct X {
|
||||||
|
f1: i32,
|
||||||
|
}
|
||||||
|
|
||||||
|
struct Y {
|
||||||
|
f1: i32,
|
||||||
|
f2: i32,
|
||||||
|
f3: i32,
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
let _ = X { f1 = 5 };
|
||||||
|
//~^ ERROR expected `:`, found `=`
|
||||||
|
|
||||||
|
let f3 = 3;
|
||||||
|
let _ = Y {
|
||||||
|
f1 = 5,
|
||||||
|
//~^ ERROR expected `:`, found `=`
|
||||||
|
f2: 4,
|
||||||
|
f3,
|
||||||
|
};
|
||||||
|
}
|
18
src/test/ui/issues/issue-57684.stderr
Normal file
18
src/test/ui/issues/issue-57684.stderr
Normal file
|
@ -0,0 +1,18 @@
|
||||||
|
error: expected `:`, found `=`
|
||||||
|
--> $DIR/issue-57684.rs:27:20
|
||||||
|
|
|
||||||
|
LL | let _ = X { f1 = 5 };
|
||||||
|
| -^
|
||||||
|
| |
|
||||||
|
| help: replace equals symbol with a colon: `:`
|
||||||
|
|
||||||
|
error: expected `:`, found `=`
|
||||||
|
--> $DIR/issue-57684.rs:32:12
|
||||||
|
|
|
||||||
|
LL | f1 = 5,
|
||||||
|
| -^
|
||||||
|
| |
|
||||||
|
| help: replace equals symbol with a colon: `:`
|
||||||
|
|
||||||
|
error: aborting due to 2 previous errors
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue