Show enum variant completions for ref scrutinee

This commit is contained in:
Lukas Wirth 2020-12-20 12:32:53 +01:00
parent 943e4faceb
commit 15a52f69d9

View File

@ -1,5 +1,7 @@
//! Completion of names from the current scope, e.g. locals and imported items.
use std::iter;
use either::Either;
use hir::{Adt, ModPath, ModuleDef, ScopeDef, Type};
use ide_db::helpers::insert_use::ImportScope;
@ -50,7 +52,9 @@ pub(crate) fn complete_unqualified_path(acc: &mut Completions, ctx: &CompletionC
}
fn complete_enum_variants(acc: &mut Completions, ctx: &CompletionContext, ty: &Type) {
if let Some(Adt::Enum(enum_data)) = ty.as_adt() {
if let Some(Adt::Enum(enum_data)) =
iter::successors(Some(ty.clone()), |ty| ty.remove_ref()).last().and_then(|ty| ty.as_adt())
{
let variants = enum_data.variants(ctx.db);
let module = if let Some(module) = ctx.scope.module() {
@ -701,6 +705,7 @@ fn main() { <|> }
"#]],
);
}
#[test]
fn completes_enum_variant_matcharm() {
check(
@ -721,6 +726,26 @@ fn main() {
)
}
#[test]
fn completes_enum_variant_matcharm_ref() {
check(
r#"
enum Foo { Bar, Baz, Quux }
fn main() {
let foo = Foo::Quux;
match &foo { Qu<|> }
}
"#,
expect![[r#"
ev Foo::Bar ()
ev Foo::Baz ()
ev Foo::Quux ()
en Foo
"#]],
)
}
#[test]
fn completes_enum_variant_iflet() {
check(