Fixed: Multiple errors on single typo in match pattern

Here we have fixed the case where we were throwing two diagnostic
messages `E0026` and `E0027` for same case like this

Example
error[E0026]: variant `A::A` does not have a field named `fob`
  --> src/test/ui/issue-52717.rs:20:12
   |
20 |     A::A { fob } => { println!("{}", fob); }
   |            ^^^ variant `A::A` does not have this field

error[E0027]: pattern does not mention field `foo`
  --> src/test/ui/issue-52717.rs:20:5
   |
20 |     A::A { fob } => { println!("{}", fob); }
   |     ^^^^^^^^^^^^ missing field `foo`

error: aborting due to 2 previous errors

Here above we can see that both `E0026` and `E0027` are depicting
same thing.

So, to fix this issue, we are simply checking element of
`inexistent_fields` is there any value lies in
`unmentioned_fields` using Levenshtein algorithm, if does
then for that case we are simply deleting element from
`unmentioned_fields`. More or less now instead of showing
separate message in `E0027` we are giving extra hint on `E0026`

Address: #52717
This commit is contained in:
Pramod Bisht 2018-10-19 10:33:49 +00:00
parent cbbd70d4f2
commit 978dc3d66f
5 changed files with 56 additions and 20 deletions

View file

@ -0,0 +1,21 @@
// Copyright 2018 The Rust Project Developers. See the COPYRIGHT
// file at the top-level directory of this distribution and at
// http://rust-lang.org/COPYRIGHT.
//
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
// option. This file may not be copied, modified, or distributed
// except according to those terms.
enum A {
A {
foo: usize,
}
}
fn main() {
let x = A::A { foo: 3 };
match x {
A::A { fob } => { println!("{}", fob); }
}
}

View file

@ -0,0 +1,12 @@
error[E0026]: variant `A::A` does not have a field named `fob`
--> $DIR/issue-52717.rs:19:12
|
LL | A::A { fob } => { println!("{}", fob); }
| ^^^
| |
| variant `A::A` does not have this field
| help: did you mean: `foo`
error: aborting due to previous error
For more information about this error, try `rustc --explain E0026`.

View file

@ -17,7 +17,6 @@ fn main() {
match MyOption::MySome(42) {
MyOption::MySome { x: 42 } => (),
//~^ ERROR variant `MyOption::MySome` does not have a field named `x`
//~| ERROR pattern does not mention field `0`
_ => (),
}
}

View file

@ -2,17 +2,11 @@ error[E0026]: variant `MyOption::MySome` does not have a field named `x`
--> $DIR/issue-17800.rs:18:28
|
LL | MyOption::MySome { x: 42 } => (),
| ^^^^^ variant `MyOption::MySome` does not have this field
| ^^^^^
| |
| variant `MyOption::MySome` does not have this field
| help: did you mean: `0`
error[E0027]: pattern does not mention field `0`
--> $DIR/issue-17800.rs:18:9
|
LL | MyOption::MySome { x: 42 } => (),
| ^^^^^^^^^^^^^^^^^^^^^^^^^^ missing field `0`
|
= note: trying to match a tuple variant with a struct variant pattern
error: aborting due to previous error
error: aborting due to 2 previous errors
Some errors occurred: E0026, E0027.
For more information about an error, try `rustc --explain E0026`.
For more information about this error, try `rustc --explain E0026`.