]> git.lizzy.rs Git - rust.git/commitdiff
Include correct item path for variant completions
authorJonas Schievink <jonasschievink@gmail.com>
Fri, 24 Apr 2020 20:18:59 +0000 (22:18 +0200)
committerJonas Schievink <jonasschievink@gmail.com>
Fri, 24 Apr 2020 20:18:59 +0000 (22:18 +0200)
crates/ra_ide/src/completion/complete_unqualified_path.rs

index 638f86eda0bebef7bf506ffd0352db547f05d1ba..8e3dcf96e0026160f1e2b10c85bc6c7c0c2c34b9 100644 (file)
@@ -38,7 +38,15 @@ fn complete_enum_variants(acc: &mut Completions, ctx: &CompletionContext) {
     if let Some(ty) = ctx.expected_type_of(&ctx.token.parent()) {
         if let Some(Adt::Enum(enum_data)) = ty.as_adt() {
             let variants = enum_data.variants(ctx.db);
-            let module = enum_data.module(ctx.db);
+
+            let module = if let Some(module) = ctx.scope().module() {
+                // Compute path from the completion site if available.
+                module
+            } else {
+                // Otherwise fall back to the enum's definition site.
+                enum_data.module(ctx.db)
+            };
+
             for variant in variants {
                 if let Some(path) = module.find_use_path(ctx.db, ModuleDef::from(variant)) {
                     // Variants with trivial paths are already added by the existing completion logic,
@@ -1308,4 +1316,47 @@ fn main() {
         "###
         )
     }
+
+    #[test]
+    fn completes_enum_variant_from_module() {
+        assert_debug_snapshot!(
+            do_reference_completion(
+                r"
+                mod m { pub enum E { V } }
+
+                fn f() -> m::E {
+                    V<|>
+                }
+                "
+            ),
+            @r###"
+        [
+            CompletionItem {
+                label: "f()",
+                source_range: [98; 99),
+                delete: [98; 99),
+                insert: "f()$0",
+                kind: Function,
+                lookup: "f",
+                detail: "fn f() -> m::E",
+            },
+            CompletionItem {
+                label: "m",
+                source_range: [98; 99),
+                delete: [98; 99),
+                insert: "m",
+                kind: Module,
+            },
+            CompletionItem {
+                label: "m::E::V",
+                source_range: [98; 99),
+                delete: [98; 99),
+                insert: "m::E::V",
+                kind: EnumVariant,
+                detail: "()",
+            },
+        ]
+        "###
+        )
+    }
 }