Skip to content

Commit 4c8edd0

Browse files
Use imports_locator
1 parent d155655 commit 4c8edd0

File tree

6 files changed

+119
-86
lines changed

6 files changed

+119
-86
lines changed

crates/assists/src/handlers/replace_derive_with_manual_impl.rs

Lines changed: 15 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -62,19 +62,21 @@ pub(crate) fn replace_derive_with_manual_impl(
6262
let current_module = ctx.sema.scope(annotated_name.syntax()).module()?;
6363
let current_crate = current_module.krate();
6464

65-
let found_traits = imports_locator::find_imports(&ctx.sema, current_crate, trait_token.text())
66-
.into_iter()
67-
.filter_map(|candidate: either::Either<hir::ModuleDef, hir::MacroDef>| match candidate {
68-
either::Either::Left(hir::ModuleDef::Trait(trait_)) => Some(trait_),
69-
_ => None,
70-
})
71-
.flat_map(|trait_| {
72-
current_module
73-
.find_use_path(ctx.sema.db, hir::ModuleDef::Trait(trait_))
74-
.as_ref()
75-
.map(mod_path_to_ast)
76-
.zip(Some(trait_))
77-
});
65+
let found_traits =
66+
imports_locator::find_exact_imports(&ctx.sema, current_crate, trait_token.text())
67+
.filter_map(
68+
|candidate: either::Either<hir::ModuleDef, hir::MacroDef>| match candidate {
69+
either::Either::Left(hir::ModuleDef::Trait(trait_)) => Some(trait_),
70+
_ => None,
71+
},
72+
)
73+
.flat_map(|trait_| {
74+
current_module
75+
.find_use_path(ctx.sema.db, hir::ModuleDef::Trait(trait_))
76+
.as_ref()
77+
.map(mod_path_to_ast)
78+
.zip(Some(trait_))
79+
});
7880

7981
let mut no_traits_found = true;
8082
for (trait_path, trait_) in found_traits.inspect(|_| no_traits_found = false) {

crates/assists/src/utils/import_assets.rs

Lines changed: 19 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -179,21 +179,25 @@ impl ImportAssets {
179179
}
180180
};
181181

182-
let mut res = imports_locator::find_imports(sema, current_crate, &self.get_search_query())
183-
.into_iter()
184-
.filter_map(filter)
185-
.filter_map(|candidate| {
186-
let item: hir::ItemInNs = candidate.either(Into::into, Into::into);
187-
if let Some(prefix_kind) = prefixed {
188-
self.module_with_name_to_import.find_use_path_prefixed(db, item, prefix_kind)
189-
} else {
190-
self.module_with_name_to_import.find_use_path(db, item)
191-
}
192-
.map(|path| (path, item))
193-
})
194-
.filter(|(use_path, _)| !use_path.segments.is_empty())
195-
.take(20)
196-
.collect::<Vec<_>>();
182+
let mut res =
183+
imports_locator::find_exact_imports(sema, current_crate, &self.get_search_query())
184+
.filter_map(filter)
185+
.filter_map(|candidate| {
186+
let item: hir::ItemInNs = candidate.either(Into::into, Into::into);
187+
if let Some(prefix_kind) = prefixed {
188+
self.module_with_name_to_import.find_use_path_prefixed(
189+
db,
190+
item,
191+
prefix_kind,
192+
)
193+
} else {
194+
self.module_with_name_to_import.find_use_path(db, item)
195+
}
196+
.map(|path| (path, item))
197+
})
198+
.filter(|(use_path, _)| !use_path.segments.is_empty())
199+
.take(20)
200+
.collect::<Vec<_>>();
197201
res.sort_by_key(|(path, _)| path.clone());
198202
res
199203
}

crates/completion/src/completions/magic.rs

Lines changed: 36 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@
22
33
use assists::utils::{insert_use, mod_path_to_ast, ImportScope};
44
use either::Either;
5-
use hir::{db::HirDatabase, MacroDef, ModuleDef, Query};
6-
use itertools::Itertools;
5+
use hir::{db::HirDatabase, MacroDef, ModuleDef};
6+
use ide_db::imports_locator;
77
use syntax::{algo, AstNode};
88
use text_edit::TextEdit;
99

@@ -22,42 +22,40 @@ pub(crate) fn complete_magic(acc: &mut Completions, ctx: &CompletionContext) ->
2222

2323
let potential_import_name = ctx.token.to_string();
2424

25-
let possible_imports = ctx
26-
.krate?
27-
// TODO kb use imports_locator instead?
28-
.query_external_importables(ctx.db, Query::new(&potential_import_name).limit(40))
29-
.unique()
30-
.filter_map(|import_candidate| {
31-
let use_path = match import_candidate {
32-
Either::Left(module_def) => current_module.find_use_path(ctx.db, module_def),
33-
Either::Right(macro_def) => current_module.find_use_path(ctx.db, macro_def),
34-
}?;
35-
Some((use_path, additional_completion(ctx.db, import_candidate)))
36-
})
37-
.filter_map(|(mod_path, additional_completion)| {
38-
let mut builder = TextEdit::builder();
39-
40-
let correct_qualifier = format!(
41-
"{}{}",
42-
mod_path.segments.last()?,
43-
additional_completion.unwrap_or_default()
44-
);
45-
builder.replace(anchor.syntax().text_range(), correct_qualifier);
46-
47-
let rewriter = insert_use(&import_scope, mod_path_to_ast(&mod_path), ctx.config.merge);
48-
let old_ast = rewriter.rewrite_root()?;
49-
algo::diff(&old_ast, &rewriter.rewrite(&old_ast)).into_text_edit(&mut builder);
50-
51-
let completion_item: CompletionItem = CompletionItem::new(
52-
CompletionKind::Magic,
53-
ctx.source_range(),
54-
mod_path.to_string(),
55-
)
56-
.kind(CompletionItemKind::Struct)
57-
.text_edit(builder.finish())
58-
.into();
59-
Some(completion_item)
60-
});
25+
let possible_imports =
26+
imports_locator::find_similar_imports(&ctx.sema, ctx.krate?, &potential_import_name)
27+
.filter_map(|import_candidate| {
28+
let use_path = match import_candidate {
29+
Either::Left(module_def) => current_module.find_use_path(ctx.db, module_def),
30+
Either::Right(macro_def) => current_module.find_use_path(ctx.db, macro_def),
31+
}?;
32+
Some((use_path, additional_completion(ctx.db, import_candidate)))
33+
})
34+
.filter_map(|(mod_path, additional_completion)| {
35+
let mut builder = TextEdit::builder();
36+
37+
let correct_qualifier = format!(
38+
"{}{}",
39+
mod_path.segments.last()?,
40+
additional_completion.unwrap_or_default()
41+
);
42+
builder.replace(anchor.syntax().text_range(), correct_qualifier);
43+
44+
let rewriter =
45+
insert_use(&import_scope, mod_path_to_ast(&mod_path), ctx.config.merge);
46+
let old_ast = rewriter.rewrite_root()?;
47+
algo::diff(&old_ast, &rewriter.rewrite(&old_ast)).into_text_edit(&mut builder);
48+
49+
let completion_item: CompletionItem = CompletionItem::new(
50+
CompletionKind::Magic,
51+
ctx.source_range(),
52+
mod_path.to_string(),
53+
)
54+
.kind(CompletionItemKind::Struct)
55+
.text_edit(builder.finish())
56+
.into();
57+
Some(completion_item)
58+
});
6159
acc.add_all(possible_imports);
6260

6361
Some(())

crates/completion/src/lib.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,7 @@ pub fn completions(
118118
completions::macro_in_item_position::complete_macro_in_item_position(&mut acc, &ctx);
119119
completions::trait_impl::complete_trait_impl(&mut acc, &ctx);
120120
completions::mod_::complete_mod(&mut acc, &ctx);
121-
completions::complete_magic::complete_magic(&mut acc, &ctx);
121+
completions::magic::complete_magic(&mut acc, &ctx);
122122

123123
Some(acc)
124124
}

crates/hir/src/lib.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ pub use hir_def::{
4949
builtin_type::BuiltinType,
5050
docs::Documentation,
5151
find_path::PrefixKind,
52-
import_map::Query,
52+
import_map::Query as ExternalImportablesQuery,
5353
item_scope::ItemInNs,
5454
nameres::ModuleSource,
5555
path::{ModPath, PathKind},

crates/ide_db/src/imports_locator.rs

Lines changed: 47 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,40 +1,69 @@
11
//! This module contains an import search funcionality that is provided to the assists module.
22
//! Later, this should be moved away to a separate crate that is accessible from the assists module.
33
4-
use hir::{Crate, MacroDef, ModuleDef, Query as ImportMapQuery, Semantics};
4+
use hir::{Crate, ExternalImportablesQuery, MacroDef, ModuleDef, Semantics};
55
use syntax::{ast, AstNode, SyntaxKind::NAME};
66

77
use crate::{
88
defs::{Definition, NameClass},
9-
symbol_index::{self, FileSymbol, Query as SymbolQuery},
9+
symbol_index::{self, FileSymbol, Query as LocalImportablesQuery},
1010
RootDatabase,
1111
};
1212
use either::Either;
1313
use rustc_hash::FxHashSet;
1414

15-
pub fn find_imports<'a>(
15+
pub fn find_exact_imports<'a>(
1616
sema: &Semantics<'a, RootDatabase>,
1717
krate: Crate,
1818
name_to_import: &str,
19-
) -> Vec<Either<ModuleDef, MacroDef>> {
20-
let _p = profile::span("search_for_imports");
19+
) -> impl Iterator<Item = Either<ModuleDef, MacroDef>> {
20+
let _p = profile::span("find_exact_imports");
21+
find_imports(
22+
sema,
23+
krate,
24+
{
25+
let mut local_query = LocalImportablesQuery::new(name_to_import.to_string());
26+
local_query.exact();
27+
local_query.limit(40);
28+
local_query
29+
},
30+
ExternalImportablesQuery::new(name_to_import).anchor_end().case_sensitive().limit(40),
31+
)
32+
}
33+
34+
pub fn find_similar_imports<'a>(
35+
sema: &Semantics<'a, RootDatabase>,
36+
krate: Crate,
37+
name_to_import: &str,
38+
) -> impl Iterator<Item = Either<ModuleDef, MacroDef>> {
39+
let _p = profile::span("find_similar_imports");
40+
find_imports(
41+
sema,
42+
krate,
43+
{
44+
let mut local_query = LocalImportablesQuery::new(name_to_import.to_string());
45+
local_query.limit(40);
46+
local_query
47+
},
48+
ExternalImportablesQuery::new(name_to_import).limit(40),
49+
)
50+
}
51+
52+
fn find_imports<'a>(
53+
sema: &Semantics<'a, RootDatabase>,
54+
krate: Crate,
55+
local_query: LocalImportablesQuery,
56+
external_query: ExternalImportablesQuery,
57+
) -> impl Iterator<Item = Either<ModuleDef, MacroDef>> {
58+
let _p = profile::span("find_similar_imports");
2159
let db = sema.db;
2260

2361
// Query dependencies first.
24-
let mut candidates: FxHashSet<_> = krate
25-
.query_external_importables(
26-
db,
27-
ImportMapQuery::new(name_to_import).anchor_end().case_sensitive().limit(40),
28-
)
29-
.collect();
62+
let mut candidates: FxHashSet<_> =
63+
krate.query_external_importables(db, external_query).collect();
3064

3165
// Query the local crate using the symbol index.
32-
let local_results = {
33-
let mut query = SymbolQuery::new(name_to_import.to_string());
34-
query.exact();
35-
query.limit(40);
36-
symbol_index::crate_symbols(db, krate.into(), query)
37-
};
66+
let local_results = symbol_index::crate_symbols(db, krate.into(), local_query);
3867

3968
candidates.extend(
4069
local_results
@@ -47,7 +76,7 @@ pub fn find_imports<'a>(
4776
}),
4877
);
4978

50-
candidates.into_iter().collect()
79+
candidates.into_iter()
5180
}
5281

5382
fn get_name_definition<'a>(

0 commit comments

Comments
 (0)