]> git.lizzy.rs Git - rust.git/commitdiff
Show enum variant completions for ref scrutinee
authorLukas Wirth <lukastw97@gmail.com>
Sun, 20 Dec 2020 11:32:53 +0000 (12:32 +0100)
committerLukas Wirth <lukastw97@gmail.com>
Sun, 20 Dec 2020 11:32:53 +0000 (12:32 +0100)
crates/completion/src/completions/unqualified_path.rs

index 099ffb4d48bd0b4bfbc35d86c8f242fc549d6342..d09849752064111b56b1fe95d8e63116b06ea756 100644 (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() 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(