about summary refs log tree commit diff
diff options
context:
space:
mode:
authorbors <bors@rust-lang.org>2022-06-10 20:33:17 +0000
committerbors <bors@rust-lang.org>2022-06-10 20:33:17 +0000
commit9ef01d0895bb1fef141d9c781519ca03f94c5e85 (patch)
tree8d273a09ad3db0b0b3c62373abc480dc5b8a05ac
parent7b663a3a4a5e5c7be4214531d6120627f7b90470 (diff)
parent29428637093cce62829e863eb5c8143da9860bef (diff)
downloadrust-9ef01d0895bb1fef141d9c781519ca03f94c5e85.tar.gz
rust-9ef01d0895bb1fef141d9c781519ca03f94c5e85.zip
Auto merge of #12490 - yue4u:fix/show-enum-in-fresh-use-tree, r=Veykril
fix: complete non-std enum at the start of `use` completions

close: #12421
-rw-r--r--crates/ide-completion/src/completions/use_.rs31
-rw-r--r--crates/ide-completion/src/tests/use_tree.rs7
2 files changed, 30 insertions, 8 deletions
diff --git a/crates/ide-completion/src/completions/use_.rs b/crates/ide-completion/src/completions/use_.rs
index bc717f6da8a..dc7a342dce2 100644
--- a/crates/ide-completion/src/completions/use_.rs
+++ b/crates/ide-completion/src/completions/use_.rs
@@ -1,13 +1,13 @@
 //! Completion for use trees
 
 use hir::ScopeDef;
-use ide_db::FxHashSet;
+use ide_db::{FxHashSet, SymbolKind};
 use syntax::{ast, AstNode};
 
 use crate::{
     context::{CompletionContext, NameRefContext, PathCompletionCtx, PathKind, PathQualifierCtx},
     item::Builder,
-    CompletionRelevance, Completions,
+    CompletionItem, CompletionItemKind, CompletionRelevance, Completions,
 };
 
 pub(crate) fn complete_use_tree(acc: &mut Completions, ctx: &CompletionContext) {
@@ -101,13 +101,30 @@ pub(crate) fn complete_use_tree(acc: &mut Completions, ctx: &CompletionContext)
             cov_mark::hit!(use_tree_crate_roots_only);
             acc.add_crate_roots(ctx);
         }
-        // only show modules in a fresh UseTree
+        // only show modules and non-std enum in a fresh UseTree
         None => {
-            cov_mark::hit!(unqualified_path_only_modules_in_import);
+            cov_mark::hit!(unqualified_path_selected_only);
             ctx.process_all_names(&mut |name, res| {
-                if let ScopeDef::ModuleDef(hir::ModuleDef::Module(_)) = res {
-                    acc.add_resolution(ctx, name, res);
-                }
+                match res {
+                    ScopeDef::ModuleDef(hir::ModuleDef::Module(_)) => {
+                        acc.add_resolution(ctx, name, res);
+                    }
+                    ScopeDef::ModuleDef(hir::ModuleDef::Adt(hir::Adt::Enum(e))) => {
+                        // exclude prelude enum
+                        let is_builtin =
+                            res.krate(ctx.db).map_or(false, |krate| krate.is_builtin(ctx.db));
+
+                        if !is_builtin {
+                            let item = CompletionItem::new(
+                                CompletionItemKind::SymbolKind(SymbolKind::Enum),
+                                ctx.source_range(),
+                                format!("{}::", e.name(ctx.db)),
+                            );
+                            acc.add(item.build());
+                        }
+                    }
+                    _ => {}
+                };
             });
             acc.add_nameref_keywords_with_colon(ctx);
         }
diff --git a/crates/ide-completion/src/tests/use_tree.rs b/crates/ide-completion/src/tests/use_tree.rs
index 2d2ec864d37..c169a62077c 100644
--- a/crates/ide-completion/src/tests/use_tree.rs
+++ b/crates/ide-completion/src/tests/use_tree.rs
@@ -10,18 +10,23 @@ fn check(ra_fixture: &str, expect: Expect) {
 
 #[test]
 fn use_tree_start() {
-    cov_mark::check!(unqualified_path_only_modules_in_import);
+    cov_mark::check!(unqualified_path_selected_only);
     check(
         r#"
 //- /lib.rs crate:main deps:other_crate
 use f$0
 
 struct Foo;
+enum FooBar {
+    Foo,
+    Bar
+}
 mod foo {}
 //- /other_crate/lib.rs crate:other_crate
 // nothing here
 "#,
         expect![[r#"
+            en FooBar::
             md foo
             md other_crate
             kw crate::