Skip to content

Commit

Permalink
Rollup merge of rust-lang#57863 - davidtwco:issue-57684, r=estebank
Browse files Browse the repository at this point in the history
Add suggestion for incorrect field syntax.

Fixes rust-lang#57684.

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.

r? @estebank
  • Loading branch information
Centril committed Jan 24, 2019
2 parents 5b288ae + f14d007 commit 1a3b3d4
Show file tree
Hide file tree
Showing 4 changed files with 109 additions and 1 deletion.
18 changes: 17 additions & 1 deletion src/libsyntax/parse/parser.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2322,8 +2322,24 @@ impl<'a> Parser<'a> {
let lo = self.span;

// 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()?;

// 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(); // `:`
(fieldname, self.parse_expr()?, false)
} else {
Expand Down
37 changes: 37 additions & 0 deletions src/test/ui/issues/issue-57684.fixed
Original file line number Diff line number Diff line change
@@ -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 changes: 37 additions & 0 deletions src/test/ui/issues/issue-57684.rs
Original file line number Diff line number Diff line change
@@ -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 changes: 18 additions & 0 deletions src/test/ui/issues/issue-57684.stderr
Original file line number Diff line number Diff line change
@@ -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

0 comments on commit 1a3b3d4

Please sign in to comment.