Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/ide_completion/src/completions/flyimport.rs')
-rw-r--r--crates/ide_completion/src/completions/flyimport.rs30
1 files changed, 28 insertions, 2 deletions
diff --git a/crates/ide_completion/src/completions/flyimport.rs b/crates/ide_completion/src/completions/flyimport.rs
index 784a1a0637..446a808de8 100644
--- a/crates/ide_completion/src/completions/flyimport.rs
+++ b/crates/ide_completion/src/completions/flyimport.rs
@@ -1,13 +1,14 @@
//! See [`import_on_the_fly`].
+use hir::ItemInNs;
use ide_db::helpers::{
- import_assets::{ImportAssets, ImportCandidate},
+ import_assets::{ImportAssets, ImportCandidate, LocatedImport},
insert_use::ImportScope,
};
use itertools::Itertools;
use syntax::{AstNode, SyntaxNode, T};
use crate::{
- context::CompletionContext,
+ context::{CompletionContext, PathKind},
render::{render_resolution_with_import, RenderContext},
ImportEdit,
};
@@ -135,10 +136,35 @@ pub(crate) fn import_on_the_fly(acc: &mut Completions, ctx: &CompletionContext)
&ctx.sema,
)?;
+ let ns_filter = |import: &LocatedImport| {
+ let kind = match ctx.path_kind() {
+ Some(kind) => kind,
+ None => {
+ return match import.original_item {
+ ItemInNs::Macros(mac) => mac.is_fn_like(),
+ _ => true,
+ }
+ }
+ };
+ match (kind, import.original_item) {
+ (PathKind::Expr, ItemInNs::Types(_) | ItemInNs::Values(_)) => true,
+
+ (PathKind::Type, ItemInNs::Types(_)) => true,
+ (PathKind::Type, ItemInNs::Values(_)) => false,
+
+ (PathKind::Expr | PathKind::Type, ItemInNs::Macros(mac)) => mac.is_fn_like(),
+
+ (PathKind::Attr, ItemInNs::Types(hir::ModuleDef::Module(_))) => true,
+ (PathKind::Attr, ItemInNs::Macros(mac)) => mac.is_attr(),
+ (PathKind::Attr, _) => false,
+ }
+ };
+
acc.add_all(
import_assets
.search_for_imports(&ctx.sema, ctx.config.insert_use.prefix_kind)
.into_iter()
+ .filter(ns_filter)
.filter(|import| {
!ctx.is_item_hidden(&import.item_to_import)
&& !ctx.is_item_hidden(&import.original_item)