Skip to content

Commit 37196e3

Browse files
committed
Suggest replacing an inexisting field for an unmentioned field
This PR adds a suggestion to replace an inexisting field for an unmentioned field. Given the following code: ```rust enum Foo { Bar { alpha: u8, bravo: u8, charlie: u8 }, } fn foo(foo: Foo) { match foo { Foo::Bar { alpha, beta, // `bravo` miswritten as `beta` here. charlie, } => todo!(), } } ``` the compiler now emits the error messages below. ```text error[E0026]: variant `Foo::Bar` does not have a field named `beta` --> src/lib.rs:9:13 | 9 | beta, // `bravo` miswritten as `beta` here. | ^^^^ | | | variant `Foo::Bar` does not have this field | help: `Foo::Bar` has a field named `bravo`: `bravo` ``` Note that this suggestion is available iff the number of inexisting fields and unmentioned fields are both 1.
1 parent c6f32f3 commit 37196e3

File tree

3 files changed

+22
-3
lines changed

3 files changed

+22
-3
lines changed

compiler/rustc_typeck/src/check/pat.rs

+14-1
Original file line numberDiff line numberDiff line change
@@ -1447,7 +1447,8 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
14471447
plural
14481448
),
14491449
);
1450-
if plural == "" {
1450+
1451+
if unmentioned_fields.len() == 1 {
14511452
let input =
14521453
unmentioned_fields.iter().map(|(_, field)| field.name).collect::<Vec<_>>();
14531454
let suggested_name = find_best_match_for_name(&input, ident.name, None);
@@ -1468,6 +1469,18 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
14681469
// We don't want to throw `E0027` in case we have thrown `E0026` for them.
14691470
unmentioned_fields.retain(|&(_, x)| x.name != suggested_name);
14701471
}
1472+
} else if inexistent_fields.len() == 1 {
1473+
let unmentioned_field = unmentioned_fields[0].1.name;
1474+
err.span_suggestion_short(
1475+
ident.span,
1476+
&format!(
1477+
"`{}` has a field named `{}`",
1478+
tcx.def_path_str(variant.def_id),
1479+
unmentioned_field
1480+
),
1481+
unmentioned_field.to_string(),
1482+
Applicability::MaybeIncorrect,
1483+
);
14711484
}
14721485
}
14731486
}

src/test/ui/issues/issue-51102.stderr

+4-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,10 @@ error[E0026]: struct `SimpleStruct` does not have a field named `state`
22
--> $DIR/issue-51102.rs:13:17
33
|
44
LL | state: 0,
5-
| ^^^^^ struct `SimpleStruct` does not have this field
5+
| ^^^^^
6+
| |
7+
| struct `SimpleStruct` does not have this field
8+
| help: `SimpleStruct` has a field named `no_state_here`
69

710
error[E0025]: field `no_state_here` bound multiple times in the pattern
811
--> $DIR/issue-51102.rs:24:17

src/test/ui/numeric/numeric-fields.stderr

+4-1
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,10 @@ error[E0026]: struct `S` does not have a field named `0x1`
1616
--> $DIR/numeric-fields.rs:7:17
1717
|
1818
LL | S{0: a, 0x1: b, ..} => {}
19-
| ^^^ struct `S` does not have this field
19+
| ^^^
20+
| |
21+
| struct `S` does not have this field
22+
| help: `S` has a field named `1`
2023

2124
error: aborting due to 2 previous errors
2225

0 commit comments

Comments
 (0)