use suggestions for "enum instead of variant" error
This commit is contained in:
parent
16e7e05e95
commit
16a8abe1bb
@ -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?");
|
||||
}
|
||||
|
@ -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
|
||||
|
||||
@ -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() {}
|
||||
|
@ -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`.
|
||||
|
@ -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
|
||||
|
@ -3,22 +3,32 @@ error[E0423]: expected value, found enum `n::Z`
|
||||
|
|
||||
LL | 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 | 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
|
||||
@ -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;
|
||||
@ -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;
|
||||
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user