Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/ide-assists/src/handlers/auto_import.rs')
-rw-r--r--crates/ide-assists/src/handlers/auto_import.rs53
1 files changed, 31 insertions, 22 deletions
diff --git a/crates/ide-assists/src/handlers/auto_import.rs b/crates/ide-assists/src/handlers/auto_import.rs
index f17635972b..db53e49d84 100644
--- a/crates/ide-assists/src/handlers/auto_import.rs
+++ b/crates/ide-assists/src/handlers/auto_import.rs
@@ -1,6 +1,6 @@
use std::cmp::Reverse;
-use hir::{db::HirDatabase, ImportPathConfig, Module};
+use hir::{db::HirDatabase, Module};
use ide_db::{
helpers::mod_path_to_ast,
imports::{
@@ -90,11 +90,7 @@ use crate::{AssistContext, AssistId, AssistKind, Assists, GroupLabel};
// # pub mod std { pub mod collections { pub struct HashMap { } } }
// ```
pub(crate) fn auto_import(acc: &mut Assists, ctx: &AssistContext<'_>) -> Option<()> {
- let cfg = ImportPathConfig {
- prefer_no_std: ctx.config.prefer_no_std,
- prefer_prelude: ctx.config.prefer_prelude,
- prefer_absolute: ctx.config.prefer_absolute,
- };
+ let cfg = ctx.config.import_path_config();
let (import_assets, syntax_under_caret) = find_importable_node(ctx)?;
let mut proposed_imports: Vec<_> = import_assets
@@ -108,7 +104,6 @@ pub(crate) fn auto_import(acc: &mut Assists, ctx: &AssistContext<'_>) -> Option<
NodeOrToken::Node(node) => ctx.sema.original_range(node).range,
NodeOrToken::Token(token) => token.text_range(),
};
- let group_label = group_label(import_assets.import_candidate());
let scope = ImportScope::find_insert_use_container(
&match syntax_under_caret {
NodeOrToken::Node(it) => it,
@@ -121,18 +116,12 @@ pub(crate) fn auto_import(acc: &mut Assists, ctx: &AssistContext<'_>) -> Option<
proposed_imports.sort_by(|a, b| a.import_path.cmp(&b.import_path));
proposed_imports.dedup_by(|a, b| a.import_path == b.import_path);
- let current_node = match ctx.covering_element() {
- NodeOrToken::Node(node) => Some(node),
- NodeOrToken::Token(token) => token.parent(),
- };
-
- let current_module =
- current_node.as_ref().and_then(|node| ctx.sema.scope(node)).map(|scope| scope.module());
-
+ let current_module = ctx.sema.scope(scope.as_syntax_node()).map(|scope| scope.module());
// prioritize more relevant imports
proposed_imports
.sort_by_key(|import| Reverse(relevance_score(ctx, import, current_module.as_ref())));
+ let group_label = group_label(import_assets.import_candidate());
for import in proposed_imports {
let import_path = import.import_path;
@@ -226,7 +215,7 @@ fn group_label(import_candidate: &ImportCandidate) -> GroupLabel {
/// Determine how relevant a given import is in the current context. Higher scores are more
/// relevant.
-fn relevance_score(
+pub(crate) fn relevance_score(
ctx: &AssistContext<'_>,
import: &LocatedImport,
current_module: Option<&Module>,
@@ -288,8 +277,8 @@ fn module_distance_heuristic(db: &dyn HirDatabase, current: &Module, item: &Modu
mod tests {
use super::*;
- use hir::Semantics;
- use ide_db::{assists::AssistResolveStrategy, base_db::FileRange, RootDatabase};
+ use hir::{FileRange, Semantics};
+ use ide_db::{assists::AssistResolveStrategy, RootDatabase};
use test_fixture::WithFixture;
use crate::tests::{
@@ -1637,8 +1626,8 @@ mod bar {
#[test]
fn local_inline_import_has_alias() {
- // FIXME
- check_assist_not_applicable(
+ // FIXME wrong import
+ check_assist(
auto_import,
r#"
struct S<T>(T);
@@ -1648,13 +1637,23 @@ mod foo {
pub fn bar() -> S$0<()> {}
}
"#,
+ r#"
+struct S<T>(T);
+use S as IoResult;
+
+mod foo {
+ use crate::S;
+
+ pub fn bar() -> S<()> {}
+}
+"#,
);
}
#[test]
fn alias_local() {
- // FIXME
- check_assist_not_applicable(
+ // FIXME wrong import
+ check_assist(
auto_import,
r#"
struct S<T>(T);
@@ -1664,6 +1663,16 @@ mod foo {
pub fn bar() -> IoResult$0<()> {}
}
"#,
+ r#"
+struct S<T>(T);
+use S as IoResult;
+
+mod foo {
+ use crate::S;
+
+ pub fn bar() -> IoResult<()> {}
+}
+"#,
);
}