Don't mention already set fields

This commit is contained in:
Michael Goulet 2023-06-05 20:59:41 +00:00
parent 408bbd0406
commit 140c011ca6
11 changed files with 23 additions and 20 deletions

View File

@ -2081,13 +2081,10 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
}, },
_ => { _ => {
// prevent all specified fields from being suggested // prevent all specified fields from being suggested
let skip_fields = skip_fields.iter().map(|x| x.ident.name); let skip_fields: Vec<_> = skip_fields.iter().map(|x| x.ident.name).collect();
if let Some(field_name) = self.suggest_field_name( if let Some(field_name) =
variant, self.suggest_field_name(variant, field.ident.name, &skip_fields, expr_span)
field.ident.name, {
skip_fields.collect(),
expr_span,
) {
err.span_suggestion( err.span_suggestion(
field.ident.span, field.ident.span,
"a field with a similar name exists", "a field with a similar name exists",
@ -2108,9 +2105,13 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
format!("`{ty}` does not have this field"), format!("`{ty}` does not have this field"),
); );
} }
let available_field_names = let mut available_field_names =
self.available_field_names(variant, expr_span); self.available_field_names(variant, expr_span);
if !available_field_names.is_empty() { available_field_names
.retain(|name| skip_fields.iter().all(|skip| name != skip));
if available_field_names.is_empty() {
err.note("all struct fields are already assigned");
} else {
err.note(format!( err.note(format!(
"available fields are: {}", "available fields are: {}",
self.name_series_display(available_field_names) self.name_series_display(available_field_names)
@ -2130,7 +2131,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
&self, &self,
variant: &'tcx ty::VariantDef, variant: &'tcx ty::VariantDef,
field: Symbol, field: Symbol,
skip: Vec<Symbol>, skip: &[Symbol],
// The span where stability will be checked // The span where stability will be checked
span: Span, span: Span,
) -> Option<Symbol> { ) -> Option<Symbol> {
@ -2582,7 +2583,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
access_span: Span, access_span: Span,
) { ) {
if let Some(suggested_field_name) = if let Some(suggested_field_name) =
self.suggest_field_name(def.non_enum_variant(), field.name, vec![], access_span) self.suggest_field_name(def.non_enum_variant(), field.name, &[], access_span)
{ {
err.span_suggestion( err.span_suggestion(
field.span, field.span,

View File

@ -3,6 +3,8 @@ error[E0559]: variant `Option<_>::None` has no field named `value`
| |
LL | None { value: (), ..Default::default() }.await; LL | None { value: (), ..Default::default() }.await;
| ^^^^^ `Option<_>::None` does not have this field | ^^^^^ `Option<_>::None` does not have this field
|
= note: all struct fields are already assigned
error[E0277]: `Option<_>` is not a future error[E0277]: `Option<_>` is not a future
--> $DIR/drop-track-bad-field-in-fru.rs:7:46 --> $DIR/drop-track-bad-field-in-fru.rs:7:46

View File

@ -10,7 +10,7 @@ error[E0560]: struct `Demo` has no field named `egregiously_nonexistent_field`
LL | Self { secret_integer: 3, egregiously_nonexistent_field: () } LL | Self { secret_integer: 3, egregiously_nonexistent_field: () }
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ `Demo` does not have this field | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ `Demo` does not have this field
| |
= note: available fields are: `favorite_integer`, `secret_integer`, `innocently_misspellable`, `another_field`, `yet_another_field` ... and 2 others = note: available fields are: `favorite_integer`, `innocently_misspellable`, `another_field`, `yet_another_field`, `always_more_fields`, `and_ever`
error[E0609]: no field `inocently_mispellable` on type `Demo` error[E0609]: no field `inocently_mispellable` on type `Demo`
--> $DIR/issue-42599_available_fields_note.rs:32:41 --> $DIR/issue-42599_available_fields_note.rs:32:41

View File

@ -4,7 +4,7 @@ error[E0560]: struct `Simba` has no field named `father`
LL | let s = Simba { mother: 1, father: 0 }; LL | let s = Simba { mother: 1, father: 0 };
| ^^^^^^ `Simba` does not have this field | ^^^^^^ `Simba` does not have this field
| |
= note: available fields are: `mother` = note: all struct fields are already assigned
error: aborting due to previous error error: aborting due to previous error

View File

@ -4,7 +4,7 @@ error[E0560]: struct `Foo` has no field named `nonexistent`
LL | return Box::new(Foo { nonexistent: self, foo: i }); LL | return Box::new(Foo { nonexistent: self, foo: i });
| ^^^^^^^^^^^ `Foo` does not have this field | ^^^^^^^^^^^ `Foo` does not have this field
| |
= note: available fields are: `foo` = note: all struct fields are already assigned
error: aborting due to previous error error: aborting due to previous error

View File

@ -32,7 +32,7 @@ error[E0560]: struct `Foo` has no field named `b`
LL | let y = Foo { a: 10, b: 10isize }; LL | let y = Foo { a: 10, b: 10isize };
| ^ `Foo` does not have this field | ^ `Foo` does not have this field
| |
= note: available fields are: `a` = note: all struct fields are already assigned
error[E0308]: mismatched types error[E0308]: mismatched types
--> $DIR/span-preservation.rs:39:5 --> $DIR/span-preservation.rs:39:5

View File

@ -10,7 +10,7 @@ error[E0560]: struct `Foo` has no field named `absent`
LL | let _ = Foo { present: (), #[cfg(all())] absent: () }; LL | let _ = Foo { present: (), #[cfg(all())] absent: () };
| ^^^^^^ `Foo` does not have this field | ^^^^^^ `Foo` does not have this field
| |
= note: available fields are: `present` = note: all struct fields are already assigned
error[E0027]: pattern does not mention field `present` error[E0027]: pattern does not mention field `present`
--> $DIR/struct-field-cfg.rs:13:9 --> $DIR/struct-field-cfg.rs:13:9

View File

@ -4,7 +4,7 @@ error[E0560]: struct `Foo` has no field named `z`
LL | x, y, z LL | x, y, z
| ^ `Foo` does not have this field | ^ `Foo` does not have this field
| |
= note: available fields are: `x`, `y` = note: all struct fields are already assigned
error: aborting due to previous error error: aborting due to previous error

View File

@ -4,7 +4,7 @@ error[E0560]: struct `BuildData` has no field named `bar`
LL | bar: 0 LL | bar: 0
| ^^^ `BuildData` does not have this field | ^^^ `BuildData` does not have this field
| |
= note: available fields are: `foo` = note: all struct fields are already assigned
error: aborting due to previous error error: aborting due to previous error

View File

@ -16,7 +16,7 @@ error[E0560]: union `U` has no field named `c`
LL | let u = U { a: 0, b: 1, c: 2 }; LL | let u = U { a: 0, b: 1, c: 2 };
| ^ `U` does not have this field | ^ `U` does not have this field
| |
= note: available fields are: `a`, `b` = note: all struct fields are already assigned
error[E0784]: union expressions should have exactly one field error[E0784]: union expressions should have exactly one field
--> $DIR/union-fields-2.rs:13:13 --> $DIR/union-fields-2.rs:13:13

View File

@ -16,7 +16,7 @@ error[E0560]: union `U` has no field named `c`
LL | let u = U { a: 0, b: 1, c: 2 }; LL | let u = U { a: 0, b: 1, c: 2 };
| ^ `U` does not have this field | ^ `U` does not have this field
| |
= note: available fields are: `a`, `b` = note: all struct fields are already assigned
error[E0784]: union expressions should have exactly one field error[E0784]: union expressions should have exactly one field
--> $DIR/union-fields-2.rs:13:13 --> $DIR/union-fields-2.rs:13:13