Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/ide-assists/src/handlers/qualify_path.rs')
-rw-r--r--crates/ide-assists/src/handlers/qualify_path.rs31
1 files changed, 20 insertions, 11 deletions
diff --git a/crates/ide-assists/src/handlers/qualify_path.rs b/crates/ide-assists/src/handlers/qualify_path.rs
index 4164a4c102..d8e7da15d5 100644
--- a/crates/ide-assists/src/handlers/qualify_path.rs
+++ b/crates/ide-assists/src/handlers/qualify_path.rs
@@ -1,6 +1,7 @@
+use std::cmp::Reverse;
use std::iter;
-use hir::{AsAssocItem, ImportPathConfig};
+use hir::AsAssocItem;
use ide_db::RootDatabase;
use ide_db::{
helpers::mod_path_to_ast,
@@ -38,11 +39,7 @@ use crate::{
// ```
pub(crate) fn qualify_path(acc: &mut Assists, ctx: &AssistContext<'_>) -> Option<()> {
let (import_assets, syntax_under_caret) = find_importable_node(ctx)?;
- 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 mut proposed_imports: Vec<_> =
import_assets.search_for_relative_paths(&ctx.sema, cfg).collect();
@@ -50,12 +47,8 @@ pub(crate) fn qualify_path(acc: &mut Assists, ctx: &AssistContext<'_>) -> Option
return None;
}
- let range = match &syntax_under_caret {
- NodeOrToken::Node(node) => ctx.sema.original_range(node).range,
- NodeOrToken::Token(token) => token.text_range(),
- };
let candidate = import_assets.import_candidate();
- let qualify_candidate = match syntax_under_caret {
+ let qualify_candidate = match syntax_under_caret.clone() {
NodeOrToken::Node(syntax_under_caret) => match candidate {
ImportCandidate::Path(candidate) if candidate.qualifier.is_some() => {
cov_mark::hit!(qualify_path_qualifier_start);
@@ -89,6 +82,22 @@ pub(crate) fn qualify_path(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 range = match &syntax_under_caret {
+ NodeOrToken::Node(node) => ctx.sema.original_range(node).range,
+ NodeOrToken::Token(token) => token.text_range(),
+ };
+ let current_module = ctx
+ .sema
+ .scope(&match syntax_under_caret {
+ NodeOrToken::Node(node) => node.clone(),
+ NodeOrToken::Token(t) => t.parent()?,
+ })
+ .map(|scope| scope.module());
+ // prioritize more relevant imports
+ proposed_imports.sort_by_key(|import| {
+ Reverse(super::auto_import::relevance_score(ctx, import, current_module.as_ref()))
+ });
+
let group_label = group_label(candidate);
for import in proposed_imports {
acc.add_group(