From 15a52f69d9522442866307254cc712a308688516 Mon Sep 17 00:00:00 2001 From: Lukas Wirth Date: Sun, 20 Dec 2020 12:32:53 +0100 Subject: Show enum variant completions for ref scrutinee --- .../completion/src/completions/unqualified_path.rs | 27 +++++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) (limited to 'crates/completion/src/completions/unqualified_path.rs') diff --git a/crates/completion/src/completions/unqualified_path.rs b/crates/completion/src/completions/unqualified_path.rs index 099ffb4d4..d09849752 100644 --- a/crates/completion/src/completions/unqualified_path.rs +++ b/crates/completion/src/completions/unqualified_path.rs @@ -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( -- cgit v1.2.3