Skip to content

Commit 582cee2

Browse files
Return more data about located imports
1 parent 309421c commit 582cee2

File tree

9 files changed

+172
-125
lines changed

9 files changed

+172
-125
lines changed

crates/ide_assists/src/handlers/auto_import.rs

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -92,14 +92,18 @@ pub(crate) fn auto_import(acc: &mut Assists, ctx: &AssistContext) -> Option<()>
9292
let range = ctx.sema.original_range(&syntax_under_caret).range;
9393
let group = import_group_message(import_assets.import_candidate());
9494
let scope = ImportScope::find_insert_use_container(&syntax_under_caret, &ctx.sema)?;
95-
for (import, _) in proposed_imports {
95+
for import in proposed_imports {
9696
acc.add_group(
9797
&group,
9898
AssistId("auto_import", AssistKind::QuickFix),
99-
format!("Import `{}`", &import),
99+
format!("Import `{}`", import.display_path()),
100100
range,
101101
|builder| {
102-
let rewriter = insert_use(&scope, mod_path_to_ast(&import), ctx.config.insert_use);
102+
let rewriter = insert_use(
103+
&scope,
104+
mod_path_to_ast(import.import_path()),
105+
ctx.config.insert_use,
106+
);
103107
builder.rewrite(rewriter);
104108
},
105109
);

crates/ide_assists/src/handlers/qualify_path.rs

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -74,17 +74,17 @@ pub(crate) fn qualify_path(acc: &mut Assists, ctx: &AssistContext) -> Option<()>
7474
};
7575

7676
let group_label = group_label(candidate);
77-
for (import, item) in proposed_imports {
77+
for import in proposed_imports {
7878
acc.add_group(
7979
&group_label,
8080
AssistId("qualify_path", AssistKind::QuickFix),
81-
label(candidate, &import),
81+
label(candidate, import.display_path()),
8282
range,
8383
|builder| {
8484
qualify_candidate.qualify(
8585
|replace_with: String| builder.replace(range, replace_with),
86-
import,
87-
item,
86+
import.import_path(),
87+
import.item_to_import(),
8888
)
8989
},
9090
);
@@ -100,8 +100,13 @@ enum QualifyCandidate<'db> {
100100
}
101101

102102
impl QualifyCandidate<'_> {
103-
fn qualify(&self, mut replacer: impl FnMut(String), import: hir::ModPath, item: hir::ItemInNs) {
104-
let import = mod_path_to_ast(&import);
103+
fn qualify(
104+
&self,
105+
mut replacer: impl FnMut(String),
106+
import: &hir::ModPath,
107+
item: hir::ItemInNs,
108+
) {
109+
let import = mod_path_to_ast(import);
105110
match self {
106111
QualifyCandidate::QualifierStart(segment, generics) => {
107112
let generics = generics.as_ref().map_or_else(String::new, ToString::to_string);

crates/ide_completion/src/completions/flyimport.rs

Lines changed: 10 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -96,33 +96,30 @@ pub(crate) fn import_on_the_fly(acc: &mut Completions, ctx: &CompletionContext)
9696
let mut all_mod_paths = import_assets
9797
.search_for_imports(&ctx.sema, ctx.config.insert_use.prefix_kind)
9898
.into_iter()
99-
.map(|(mod_path, item_in_ns)| {
100-
let scope_item = match item_in_ns {
99+
.map(|import| {
100+
let proposed_def = match import.item_to_import() {
101101
hir::ItemInNs::Types(id) => ScopeDef::ModuleDef(id.into()),
102102
hir::ItemInNs::Values(id) => ScopeDef::ModuleDef(id.into()),
103103
hir::ItemInNs::Macros(id) => ScopeDef::MacroDef(id.into()),
104104
};
105-
(mod_path, scope_item)
105+
(import, proposed_def)
106106
})
107107
.filter(|(_, proposed_def)| !scope_definitions.contains(proposed_def))
108108
.collect::<Vec<_>>();
109-
all_mod_paths.sort_by_cached_key(|(mod_path, _)| {
110-
compute_fuzzy_completion_order_key(mod_path, &user_input_lowercased)
109+
all_mod_paths.sort_by_cached_key(|(import, _)| {
110+
compute_fuzzy_completion_order_key(import.display_path(), &user_input_lowercased)
111111
});
112112

113-
acc.add_all(all_mod_paths.into_iter().filter_map(|(import_path, definition)| {
113+
acc.add_all(all_mod_paths.into_iter().filter_map(|(import, definition)| {
114114
let import_for_trait_assoc_item = match definition {
115115
ScopeDef::ModuleDef(module_def) => module_def
116116
.as_assoc_item(ctx.db)
117117
.and_then(|assoc| assoc.containing_trait(ctx.db))
118118
.is_some(),
119119
_ => false,
120120
};
121-
let import_edit = ImportEdit {
122-
import_path,
123-
import_scope: import_scope.clone(),
124-
import_for_trait_assoc_item,
125-
};
121+
let import_edit =
122+
ImportEdit { import, import_scope: import_scope.clone(), import_for_trait_assoc_item };
126123
render_resolution_with_import(RenderContext::new(ctx), import_edit, &definition)
127124
}));
128125
Some(())
@@ -186,11 +183,11 @@ fn compute_fuzzy_completion_order_key(
186183
user_input_lowercased: &str,
187184
) -> usize {
188185
cov_mark::hit!(certain_fuzzy_order_test);
189-
let proposed_import_name = match proposed_mod_path.segments().last() {
186+
let import_name = match proposed_mod_path.segments().last() {
190187
Some(name) => name.to_string().to_lowercase(),
191188
None => return usize::MAX,
192189
};
193-
match proposed_import_name.match_indices(user_input_lowercased).next() {
190+
match import_name.match_indices(user_input_lowercased).next() {
194191
Some((first_matching_index, _)) => first_matching_index,
195192
None => usize::MAX,
196193
}

crates/ide_completion/src/item.rs

Lines changed: 13 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,10 @@
22
33
use std::fmt;
44

5-
use hir::{Documentation, ModPath, Mutability};
5+
use hir::{Documentation, Mutability};
66
use ide_db::{
77
helpers::{
8+
import_assets::LocatedImport,
89
insert_use::{self, ImportScope, InsertUseConfig},
910
mod_path_to_ast, SnippetCap,
1011
},
@@ -272,7 +273,7 @@ impl CompletionItem {
272273
/// An extra import to add after the completion is applied.
273274
#[derive(Debug, Clone)]
274275
pub struct ImportEdit {
275-
pub import_path: ModPath,
276+
pub import: LocatedImport,
276277
pub import_scope: ImportScope,
277278
pub import_for_trait_assoc_item: bool,
278279
}
@@ -283,8 +284,11 @@ impl ImportEdit {
283284
pub fn to_text_edit(&self, cfg: InsertUseConfig) -> Option<TextEdit> {
284285
let _p = profile::span("ImportEdit::to_text_edit");
285286

286-
let rewriter =
287-
insert_use::insert_use(&self.import_scope, mod_path_to_ast(&self.import_path), cfg);
287+
let rewriter = insert_use::insert_use(
288+
&self.import_scope,
289+
mod_path_to_ast(self.import.import_path()),
290+
cfg,
291+
);
288292
let old_ast = rewriter.rewrite_root()?;
289293
let mut import_insert = TextEdit::builder();
290294
algo::diff(&old_ast, &rewriter.rewrite(&old_ast)).into_text_edit(&mut import_insert);
@@ -323,19 +327,13 @@ impl Builder {
323327
let mut insert_text = self.insert_text;
324328

325329
if let Some(import_to_add) = self.import_to_add.as_ref() {
330+
lookup = lookup.or_else(|| Some(label.clone()));
331+
insert_text = insert_text.or_else(|| Some(label.clone()));
332+
let display_path = import_to_add.import.display_path();
326333
if import_to_add.import_for_trait_assoc_item {
327-
lookup = lookup.or_else(|| Some(label.clone()));
328-
insert_text = insert_text.or_else(|| Some(label.clone()));
329-
label = format!("{} ({})", label, import_to_add.import_path);
334+
label = format!("{} ({})", label, display_path);
330335
} else {
331-
let mut import_path_without_last_segment = import_to_add.import_path.to_owned();
332-
let _ = import_path_without_last_segment.pop_segment();
333-
334-
if !import_path_without_last_segment.segments().is_empty() {
335-
lookup = lookup.or_else(|| Some(label.clone()));
336-
insert_text = insert_text.or_else(|| Some(label.clone()));
337-
label = format!("{}::{}", import_path_without_last_segment, label);
338-
}
336+
label = display_path.to_string();
339337
}
340338
}
341339

crates/ide_completion/src/lib.rs

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,9 @@ mod completions;
1313

1414
use completions::flyimport::position_for_import;
1515
use ide_db::{
16-
base_db::FilePosition, helpers::insert_use::ImportScope, imports_locator, RootDatabase,
16+
base_db::FilePosition,
17+
helpers::{import_assets::LocatedImport, insert_use::ImportScope},
18+
imports_locator, RootDatabase,
1719
};
1820
use text_edit::TextEdit;
1921

@@ -148,12 +150,16 @@ pub fn resolve_completion_edits(
148150
let current_module = ctx.sema.scope(position_for_import).module()?;
149151
let current_crate = current_module.krate();
150152

151-
let import_path = imports_locator::find_exact_imports(&ctx.sema, current_crate, imported_name)
152-
.filter_map(|candidate| {
153-
let item: hir::ItemInNs = candidate.either(Into::into, Into::into);
154-
current_module.find_use_path_prefixed(db, item, config.insert_use.prefix_kind)
155-
})
156-
.find(|mod_path| mod_path.to_string() == full_import_path)?;
153+
let (import_path, item_to_import) =
154+
imports_locator::find_exact_imports(&ctx.sema, current_crate, imported_name)
155+
.filter_map(|candidate| {
156+
let item: hir::ItemInNs = candidate.either(Into::into, Into::into);
157+
current_module
158+
.find_use_path_prefixed(db, item, config.insert_use.prefix_kind)
159+
.zip(Some(item))
160+
})
161+
.find(|(mod_path, _)| mod_path.to_string() == full_import_path)?;
162+
let import = LocatedImport::new(import_path, item_to_import, None);
157163

158164
ImportEdit { import_path, import_scope, import_for_trait_assoc_item }
159165
.to_text_edit(config.insert_use)

crates/ide_completion/src/render.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ pub(crate) fn render_resolution_with_import<'a>(
5656
ScopeDef::ModuleDef(ModuleDef::Function(f)) => f.name(ctx.completion.db).to_string(),
5757
ScopeDef::ModuleDef(ModuleDef::Const(c)) => c.name(ctx.completion.db)?.to_string(),
5858
ScopeDef::ModuleDef(ModuleDef::TypeAlias(t)) => t.name(ctx.completion.db).to_string(),
59-
_ => import_edit.import_path.segments().last()?.to_string(),
59+
_ => import_edit.import.display_path().segments().last()?.to_string(),
6060
};
6161
Render::new(ctx).render_resolution(local_name, Some(import_edit), resolution).map(|mut item| {
6262
item.completion_kind = CompletionKind::Magic;

0 commit comments

Comments
 (0)