Skip to content

Commit

Permalink
use suggestions for "enum instead of variant" error
Browse files Browse the repository at this point in the history
  • Loading branch information
euclio committed Mar 21, 2019
1 parent 16e7e05 commit 16a8abe
Show file tree
Hide file tree
Showing 5 changed files with 118 additions and 47 deletions.
21 changes: 14 additions & 7 deletions src/librustc_resolve/error_reporting.rs
Original file line number Diff line number Diff line change
Expand Up @@ -293,13 +293,20 @@ impl<'a> Resolver<'a> {
(Def::Enum(..), PathSource::TupleStruct)
| (Def::Enum(..), PathSource::Expr(..)) => {
if let Some(variants) = self.collect_enum_variants(def) {
err.note(&format!("did you mean to use one \
of the following variants?\n{}",
variants.iter()
.map(|suggestion| path_names_to_string(suggestion))
.map(|suggestion| format!("- `{}`", suggestion))
.collect::<Vec<_>>()
.join("\n")));
if !variants.is_empty() {
let msg = if variants.len() == 1 {
"try using the enum's variant"
} else {
"try using one of the enum's variants"
};

err.span_suggestions(
span,
msg,
variants.iter().map(path_names_to_string),
Applicability::MaybeIncorrect,
);
}
} else {
err.note("did you mean to use one of the enum's variants?");
}
Expand Down
19 changes: 19 additions & 0 deletions src/test/ui/did_you_mean/issue-43871-enum-instead-of-variant.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,20 @@
enum Example { Ex(String), NotEx }

enum Void {}

enum ManyVariants {
One,
Two,
Three,
Four,
Five,
Six,
Seven,
Eight,
Nine,
Ten,
}

fn result_test() {
let x = Option(1); //~ ERROR expected function, found enum

Expand All @@ -12,6 +27,10 @@ fn result_test() {
if let Example(_) = y { //~ ERROR expected tuple struct/variant, found enum
println!("It is OK.");
}

let y = Void(); //~ ERROR expected function, found enum

let z = ManyVariants(); //~ ERROR expected function, found enum
}

fn main() {}
55 changes: 42 additions & 13 deletions src/test/ui/did_you_mean/issue-43871-enum-instead-of-variant.stderr
Original file line number Diff line number Diff line change
@@ -1,34 +1,63 @@
error[E0423]: expected function, found enum `Option`
--> $DIR/issue-43871-enum-instead-of-variant.rs:4:13
--> $DIR/issue-43871-enum-instead-of-variant.rs:19:13
|
LL | let x = Option(1);
| ^^^^^^
help: try using one of the enum's variants
|
= note: did you mean to use one of the following variants?
- `std::prelude::v1::Option::None`
- `std::prelude::v1::Option::Some`
LL | let x = std::prelude::v1::Option::None(1);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
LL | let x = std::prelude::v1::Option::Some(1);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

error[E0532]: expected tuple struct/variant, found enum `Option`
--> $DIR/issue-43871-enum-instead-of-variant.rs:6:12
--> $DIR/issue-43871-enum-instead-of-variant.rs:21:12
|
LL | if let Option(_) = x {
| ^^^^^^
help: try using one of the enum's variants
|
= note: did you mean to use one of the following variants?
- `std::prelude::v1::Option::None`
- `std::prelude::v1::Option::Some`
LL | if let std::prelude::v1::Option::None(_) = x {
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
LL | if let std::prelude::v1::Option::Some(_) = x {
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

error[E0532]: expected tuple struct/variant, found enum `Example`
--> $DIR/issue-43871-enum-instead-of-variant.rs:12:12
--> $DIR/issue-43871-enum-instead-of-variant.rs:27:12
|
LL | if let Example(_) = y {
| ^^^^^^^
help: try using one of the enum's variants
|
= note: did you mean to use one of the following variants?
- `Example::Ex`
- `Example::NotEx`
LL | if let Example::Ex(_) = y {
| ^^^^^^^^^^^
LL | if let Example::NotEx(_) = y {
| ^^^^^^^^^^^^^^

error: aborting due to 3 previous errors
error[E0423]: expected function, found enum `Void`
--> $DIR/issue-43871-enum-instead-of-variant.rs:31:13
|
LL | let y = Void();
| ^^^^

error[E0423]: expected function, found enum `ManyVariants`
--> $DIR/issue-43871-enum-instead-of-variant.rs:33:13
|
LL | let z = ManyVariants();
| ^^^^^^^^^^^^
help: try using one of the enum's variants
|
LL | let z = ManyVariants::Eight();
| ^^^^^^^^^^^^^^^^^^^
LL | let z = ManyVariants::Five();
| ^^^^^^^^^^^^^^^^^^
LL | let z = ManyVariants::Four();
| ^^^^^^^^^^^^^^^^^^
LL | let z = ManyVariants::Nine();
| ^^^^^^^^^^^^^^^^^^
and 6 other candidates

error: aborting due to 5 previous errors

Some errors occurred: E0423, E0532.
For more information about an error, try `rustc --explain E0423`.
5 changes: 1 addition & 4 deletions src/test/ui/glob-resolve1.stderr
Original file line number Diff line number Diff line change
Expand Up @@ -22,10 +22,7 @@ error[E0423]: expected value, found enum `B`
--> $DIR/glob-resolve1.rs:24:5
|
LL | B;
| ^
|
= note: did you mean to use one of the following variants?
- `B::B1`
| ^ help: try using the enum's variant: `B::B1`

error[E0425]: cannot find value `C` in this scope
--> $DIR/glob-resolve1.rs:25:5
Expand Down
65 changes: 42 additions & 23 deletions src/test/ui/resolve/privacy-enum-ctor.stderr
Original file line number Diff line number Diff line change
Expand Up @@ -3,22 +3,32 @@ error[E0423]: expected value, found enum `n::Z`
|
LL | n::Z;
| ^^^^
|
= note: did you mean to use one of the following variants?
- `m::Z::Fn`
- `m::Z::Struct`
- `m::Z::Unit`
help: try using one of the enum's variants
|
LL | m::Z::Fn;
| ^^^^^^^^
LL | m::Z::Struct;
| ^^^^^^^^^^^^
LL | m::Z::Unit;
| ^^^^^^^^^^

error[E0423]: expected value, found enum `Z`
--> $DIR/privacy-enum-ctor.rs:25:9
|
LL | Z;
| ^ help: a function with a similar name exists: `f`
| ^
help: a function with a similar name exists
|
= note: did you mean to use one of the following variants?
- `m::Z::Fn`
- `m::Z::Struct`
- `m::Z::Unit`
LL | f;
| ^
help: try using one of the enum's variants
|
LL | m::Z::Fn;
| ^^^^^^^^
LL | m::Z::Struct;
| ^^^^^^^^^^^^
LL | m::Z::Unit;
| ^^^^^^^^^^

error[E0423]: expected value, found struct variant `Z::Struct`
--> $DIR/privacy-enum-ctor.rs:29:20
Expand All @@ -31,15 +41,18 @@ error[E0423]: expected value, found enum `m::E`
|
LL | let _: E = m::E;
| ^^^^
|
= note: did you mean to use one of the following variants?
- `E::Fn`
- `E::Struct`
- `E::Unit`
help: a function with a similar name exists
|
LL | let _: E = m::f;
| ^
help: try using one of the enum's variants
|
LL | let _: E = E::Fn;
| ^^^^^
LL | let _: E = E::Struct;
| ^^^^^^^^^
LL | let _: E = E::Unit;
| ^^^^^^^
help: possible better candidates are found in other modules, you can import them into scope
|
LL | use std::f32::consts::E;
Expand All @@ -58,11 +71,14 @@ error[E0423]: expected value, found enum `E`
|
LL | let _: E = E;
| ^
help: try using one of the enum's variants
|
= note: did you mean to use one of the following variants?
- `E::Fn`
- `E::Struct`
- `E::Unit`
LL | let _: E = E::Fn;
| ^^^^^
LL | let _: E = E::Struct;
| ^^^^^^^^^
LL | let _: E = E::Unit;
| ^^^^^^^
help: possible better candidates are found in other modules, you can import them into scope
|
LL | use std::f32::consts::E;
Expand Down Expand Up @@ -95,11 +111,14 @@ error[E0423]: expected value, found enum `m::n::Z`
|
LL | let _: Z = m::n::Z;
| ^^^^^^^
help: try using one of the enum's variants
|
= note: did you mean to use one of the following variants?
- `m::Z::Fn`
- `m::Z::Struct`
- `m::Z::Unit`
LL | let _: Z = m::Z::Fn;
| ^^^^^^^^
LL | let _: Z = m::Z::Struct;
| ^^^^^^^^^^^^
LL | let _: Z = m::Z::Unit;
| ^^^^^^^^^^

error[E0412]: cannot find type `Z` in this scope
--> $DIR/privacy-enum-ctor.rs:61:12
Expand Down

0 comments on commit 16a8abe

Please sign in to comment.