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.rs88
1 files changed, 40 insertions, 48 deletions
diff --git a/crates/ide-assists/src/handlers/qualify_path.rs b/crates/ide-assists/src/handlers/qualify_path.rs
index 2a8465f634..07d2f52a34 100644
--- a/crates/ide-assists/src/handlers/qualify_path.rs
+++ b/crates/ide-assists/src/handlers/qualify_path.rs
@@ -7,18 +7,17 @@ use ide_db::{
helpers::mod_path_to_ast,
imports::import_assets::{ImportCandidate, LocatedImport},
};
-use syntax::ast::HasGenericArgs;
use syntax::Edition;
+use syntax::ast::HasGenericArgs;
use syntax::{
- ast,
- ast::{make, HasArgList},
- AstNode, NodeOrToken,
+ AstNode, ast,
+ ast::{HasArgList, make},
};
use crate::{
+ AssistId, GroupLabel,
assist_context::{AssistContext, Assists},
handlers::auto_import::find_importable_node,
- AssistId, AssistKind, GroupLabel,
};
// Assist: qualify_path
@@ -39,7 +38,7 @@ use crate::{
// # pub mod std { pub mod collections { pub struct HashMap { } } }
// ```
pub(crate) fn qualify_path(acc: &mut Assists, ctx: &AssistContext<'_>) -> Option<()> {
- let (import_assets, syntax_under_caret) = find_importable_node(ctx)?;
+ let (import_assets, syntax_under_caret, expected) = find_importable_node(ctx)?;
let cfg = ctx.config.import_path_config();
let mut proposed_imports: Vec<_> =
@@ -48,64 +47,57 @@ pub(crate) fn qualify_path(acc: &mut Assists, ctx: &AssistContext<'_>) -> Option
return None;
}
+ let range = ctx.sema.original_range(&syntax_under_caret).range;
+ let current_module = ctx.sema.scope(&syntax_under_caret).map(|scope| scope.module());
+
let candidate = import_assets.import_candidate();
- let qualify_candidate = match syntax_under_caret.clone() {
- NodeOrToken::Node(syntax_under_caret) => match candidate {
- ImportCandidate::Path(candidate) if !candidate.qualifier.is_empty() => {
- cov_mark::hit!(qualify_path_qualifier_start);
- let path = ast::Path::cast(syntax_under_caret)?;
- let (prev_segment, segment) = (path.qualifier()?.segment()?, path.segment()?);
- QualifyCandidate::QualifierStart(segment, prev_segment.generic_arg_list())
- }
- ImportCandidate::Path(_) => {
- cov_mark::hit!(qualify_path_unqualified_name);
- let path = ast::Path::cast(syntax_under_caret)?;
- let generics = path.segment()?.generic_arg_list();
- QualifyCandidate::UnqualifiedName(generics)
- }
- ImportCandidate::TraitAssocItem(_) => {
- cov_mark::hit!(qualify_path_trait_assoc_item);
- let path = ast::Path::cast(syntax_under_caret)?;
- let (qualifier, segment) = (path.qualifier()?, path.segment()?);
- QualifyCandidate::TraitAssocItem(qualifier, segment)
- }
- ImportCandidate::TraitMethod(_) => {
- cov_mark::hit!(qualify_path_trait_method);
- let mcall_expr = ast::MethodCallExpr::cast(syntax_under_caret)?;
- QualifyCandidate::TraitMethod(ctx.sema.db, mcall_expr)
- }
- },
- // derive attribute path
- NodeOrToken::Token(_) => QualifyCandidate::UnqualifiedName(None),
+ let qualify_candidate = match candidate {
+ ImportCandidate::Path(candidate) if !candidate.qualifier.is_empty() => {
+ cov_mark::hit!(qualify_path_qualifier_start);
+ let path = ast::Path::cast(syntax_under_caret)?;
+ let (prev_segment, segment) = (path.qualifier()?.segment()?, path.segment()?);
+ QualifyCandidate::QualifierStart(segment, prev_segment.generic_arg_list())
+ }
+ ImportCandidate::Path(_) => {
+ cov_mark::hit!(qualify_path_unqualified_name);
+ let path = ast::Path::cast(syntax_under_caret)?;
+ let generics = path.segment()?.generic_arg_list();
+ QualifyCandidate::UnqualifiedName(generics)
+ }
+ ImportCandidate::TraitAssocItem(_) => {
+ cov_mark::hit!(qualify_path_trait_assoc_item);
+ let path = ast::Path::cast(syntax_under_caret)?;
+ let (qualifier, segment) = (path.qualifier()?, path.segment()?);
+ QualifyCandidate::TraitAssocItem(qualifier, segment)
+ }
+ ImportCandidate::TraitMethod(_) => {
+ cov_mark::hit!(qualify_path_trait_method);
+ let mcall_expr = ast::MethodCallExpr::cast(syntax_under_caret)?;
+ QualifyCandidate::TraitMethod(ctx.sema.db, mcall_expr)
+ }
};
// we aren't interested in different namespaces
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());
let current_edition =
current_module.map(|it| it.krate().edition(ctx.db())).unwrap_or(Edition::CURRENT);
// prioritize more relevant imports
proposed_imports.sort_by_key(|import| {
- Reverse(super::auto_import::relevance_score(ctx, import, current_module.as_ref()))
+ Reverse(super::auto_import::relevance_score(
+ ctx,
+ import,
+ expected.as_ref(),
+ current_module.as_ref(),
+ ))
});
let group_label = group_label(candidate);
for import in proposed_imports {
acc.add_group(
&group_label,
- AssistId("qualify_path", AssistKind::QuickFix),
+ AssistId::quick_fix("qualify_path"),
label(ctx.db(), candidate, &import, current_edition),
range,
|builder| {
@@ -354,7 +346,7 @@ pub mod PubMod3 {
}
"#,
r#"
-PubMod3::PubStruct
+PubMod1::PubStruct
pub mod PubMod1 {
pub struct PubStruct;