]> git.lizzy.rs Git - rust.git/commitdiff
completion for enum variants
authorAleksey Kladov <aleksey.kladov@gmail.com>
Fri, 28 Dec 2018 18:06:08 +0000 (21:06 +0300)
committerAleksey Kladov <aleksey.kladov@gmail.com>
Fri, 28 Dec 2018 18:07:47 +0000 (21:07 +0300)
crates/ra_analysis/src/completion/complete_path.rs
crates/ra_analysis/src/completion/completion_item.rs
crates/ra_hir/src/adt.rs
crates/ra_lsp_server/src/conv.rs

index aaa2c7ceec10844564cb07bd1f70f78e79c88adc..c73a083a43cef20e573298297a58ddaa07e66b02 100644 (file)
@@ -1,6 +1,6 @@
 use crate::{
     Cancelable,
-    completion::{CompletionItem, Completions, CompletionKind, CompletionContext},
+    completion::{CompletionItem, CompletionItemKind, Completions, CompletionKind, CompletionContext},
 };
 
 pub(super) fn complete_path(acc: &mut Completions, ctx: &CompletionContext) -> Cancelable<()> {
@@ -12,16 +12,25 @@ pub(super) fn complete_path(acc: &mut Completions, ctx: &CompletionContext) -> C
         Some(it) => it,
         None => return Ok(()),
     };
-    let target_module = match def_id.resolve(ctx.db)? {
-        hir::Def::Module(it) => it,
+    match def_id.resolve(ctx.db)? {
+        hir::Def::Module(module) => {
+            let module_scope = module.scope(ctx.db)?;
+            module_scope.entries().for_each(|(name, res)| {
+                CompletionItem::new(CompletionKind::Reference, name.to_string())
+                    .from_resolution(ctx.db, res)
+                    .add_to(acc)
+            });
+        }
+        hir::Def::Enum(e) => e
+            .variants(ctx.db)?
+            .into_iter()
+            .for_each(|(name, _variant)| {
+                CompletionItem::new(CompletionKind::Reference, name.to_string())
+                    .kind(CompletionItemKind::EnumVariant)
+                    .add_to(acc)
+            }),
         _ => return Ok(()),
     };
-    let module_scope = target_module.scope(ctx.db)?;
-    module_scope.entries().for_each(|(name, res)| {
-        CompletionItem::new(CompletionKind::Reference, name.to_string())
-            .from_resolution(ctx.db, res)
-            .add_to(acc)
-    });
     Ok(())
 }
 
@@ -92,4 +101,16 @@ pub mod baz {
             "Spam",
         );
     }
+
+    #[test]
+    fn completes_enum_variant() {
+        check_reference_completion(
+            "
+            //- /lib.rs
+            enum E { Foo, Bar(i32) }
+            fn foo() { let _ = E::<|> }
+            ",
+            "Foo;Bar",
+        );
+    }
 }
index c9f9f495da88098b5ee7a96765c7d1efd2c1d003..1d294c553aa5f2ea36bf0b51c12050590f1b13b3 100644 (file)
@@ -29,6 +29,7 @@ pub enum CompletionItemKind {
     Function,
     Struct,
     Enum,
+    EnumVariant,
     Binding,
     Field,
 }
index 65c461148aa4cdbdad0cd3f1ed16e5acb79a398d..6cdaa1888ca7d5b5ac6adc0ef0f34ba391151b44 100644 (file)
@@ -73,6 +73,10 @@ pub fn def_id(&self) -> DefId {
     pub fn name(&self, db: &impl HirDatabase) -> Cancelable<Option<SmolStr>> {
         Ok(db.enum_data(self.def_id)?.name.clone())
     }
+
+    pub fn variants(&self, db: &impl HirDatabase) -> Cancelable<Vec<(SmolStr, Arc<VariantData>)>> {
+        Ok(db.enum_data(self.def_id)?.variants.clone())
+    }
 }
 
 #[derive(Debug, Clone, PartialEq, Eq)]
index 3d56ccd9717a52f067469ab3caa6062dfa8a4c2f..0d6e6272732fedecf104d1e377db2974eedf085d 100644 (file)
@@ -57,6 +57,7 @@ fn conv(self) -> <Self as Conv>::Output {
             CompletionItemKind::Function => Function,
             CompletionItemKind::Struct => Struct,
             CompletionItemKind::Enum => Enum,
+            CompletionItemKind::EnumVariant => EnumMember,
             CompletionItemKind::Binding => Variable,
             CompletionItemKind::Field => Field,
         }