]> git.lizzy.rs Git - rust.git/commitdiff
Complete modules in item lists
authorLukas Wirth <lukastw97@gmail.com>
Thu, 27 May 2021 19:12:50 +0000 (21:12 +0200)
committerLukas Wirth <lukastw97@gmail.com>
Thu, 27 May 2021 19:12:50 +0000 (21:12 +0200)
crates/ide_completion/src/completions/macro_in_item_position.rs
crates/ide_completion/src/completions/qualified_path.rs
crates/ide_completion/src/completions/unqualified_path.rs

index c5e377500053c11b639d1f42c5f3f4ba723f7396..ec57aee30ef689b22b6577be8302f0392bca3a12 100644 (file)
@@ -2,6 +2,7 @@
 
 use crate::{CompletionContext, Completions};
 
+// Ideally this should be removed and moved into `(un)qualified_path` respectively
 pub(crate) fn complete_macro_in_item_position(acc: &mut Completions, ctx: &CompletionContext) {
     // Show only macros in top level.
     if !ctx.is_new_item {
@@ -12,6 +13,10 @@ pub(crate) fn complete_macro_in_item_position(acc: &mut Completions, ctx: &Compl
         if let hir::ScopeDef::MacroDef(mac) = res {
             acc.add_macro(ctx, Some(name.to_string()), mac);
         }
+        // FIXME: This should be done in qualified_path/unqualified_path instead?
+        if let hir::ScopeDef::ModuleDef(hir::ModuleDef::Module(_)) = res {
+            acc.add_resolution(ctx, name.to_string(), &res);
+        }
     })
 }
 
index 4aa37df91b4c7e846357a6fdfce6b710ebbcbbde..7a0e1ead3ffbf5a1dd1b41e18e74d0dcc316fcd1 100644 (file)
@@ -7,7 +7,7 @@
 use crate::{CompletionContext, Completions};
 
 pub(crate) fn complete_qualified_path(acc: &mut Completions, ctx: &CompletionContext) {
-    if ctx.is_path_disallowed() {
+    if ctx.is_path_disallowed() || ctx.expects_item() {
         return;
     }
     let path = match &ctx.path_qual {
@@ -20,7 +20,7 @@ pub(crate) fn complete_qualified_path(acc: &mut Completions, ctx: &CompletionCon
         None => return,
     };
     let context_module = ctx.scope.module();
-    if ctx.expects_item() || ctx.expects_assoc_item() {
+    if ctx.expects_assoc_item() {
         if let PathResolution::Def(hir::ModuleDef::Module(module)) = resolution {
             let module_scope = module.scope(ctx.db, context_module);
             for (name, def) in module_scope {
@@ -636,6 +636,24 @@ impl MyStruct {
         );
     }
 
+    #[test]
+    #[ignore] // FIXME doesn't complete anything atm
+    fn completes_in_item_list() {
+        check(
+            r#"
+struct MyStruct {}
+macro_rules! foo {}
+mod bar {}
+
+crate::$0
+"#,
+            expect![[r#"
+                md bar
+                ma foo! macro_rules! foo
+            "#]],
+        )
+    }
+
     #[test]
     fn test_super_super_completion() {
         check(
index dc93e368d46012fc9a360b318c742637e1238714..c901b358b2e7966090dcd7975dca1ed4e83691a8 100644 (file)
@@ -9,10 +9,10 @@ pub(crate) fn complete_unqualified_path(acc: &mut Completions, ctx: &CompletionC
     if !ctx.is_trivial_path {
         return;
     }
-    if ctx.is_path_disallowed() {
+    if ctx.is_path_disallowed() || ctx.expects_item() {
         return;
     }
-    if ctx.expects_item() || ctx.expects_assoc_item() {
+    if ctx.expects_assoc_item() {
         ctx.scope.process_all_names(&mut |name, def| {
             if let ScopeDef::MacroDef(macro_def) = def {
                 acc.add_macro(ctx, Some(name.to_string()), macro_def);
@@ -692,4 +692,22 @@ impl MyStruct {
             "#]],
         )
     }
+
+    // FIXME: The completions here currently come from `macro_in_item_position`, but they shouldn't
+    #[test]
+    fn completes_in_item_list() {
+        check(
+            r#"
+struct MyStruct {}
+macro_rules! foo {}
+mod bar {}
+
+$0
+"#,
+            expect![[r#"
+                md bar
+                ma foo!(…) macro_rules! foo
+            "#]],
+        )
+    }
 }