aboutsummaryrefslogtreecommitdiff
path: root/crates/ide_completion/src/lib.rs
diff options
context:
space:
mode:
Diffstat (limited to 'crates/ide_completion/src/lib.rs')
-rw-r--r--crates/ide_completion/src/lib.rs33
1 files changed, 20 insertions, 13 deletions
diff --git a/crates/ide_completion/src/lib.rs b/crates/ide_completion/src/lib.rs
index 76f31de9e..d46f521a0 100644
--- a/crates/ide_completion/src/lib.rs
+++ b/crates/ide_completion/src/lib.rs
@@ -13,7 +13,9 @@ mod completions;
13 13
14use completions::flyimport::position_for_import; 14use completions::flyimport::position_for_import;
15use ide_db::{ 15use 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 items_locator, RootDatabase,
17}; 19};
18use text_edit::TextEdit; 20use text_edit::TextEdit;
19 21
@@ -21,7 +23,10 @@ use crate::{completions::Completions, context::CompletionContext, item::Completi
21 23
22pub use crate::{ 24pub use crate::{
23 config::CompletionConfig, 25 config::CompletionConfig,
24 item::{CompletionItem, CompletionItemKind, CompletionScore, ImportEdit, InsertTextFormat}, 26 item::{
27 CompletionItem, CompletionItemKind, CompletionScore, ImportEdit, InsertTextFormat,
28 Relevance,
29 },
25}; 30};
26 31
27//FIXME: split the following feature into fine-grained features. 32//FIXME: split the following feature into fine-grained features.
@@ -139,25 +144,27 @@ pub fn resolve_completion_edits(
139 position: FilePosition, 144 position: FilePosition,
140 full_import_path: &str, 145 full_import_path: &str,
141 imported_name: String, 146 imported_name: String,
142 import_for_trait_assoc_item: bool,
143) -> Option<Vec<TextEdit>> { 147) -> Option<Vec<TextEdit>> {
144 let ctx = CompletionContext::new(db, position, config)?; 148 let ctx = CompletionContext::new(db, position, config)?;
145 let position_for_import = position_for_import(&ctx, None)?; 149 let position_for_import = position_for_import(&ctx, None)?;
146 let import_scope = ImportScope::find_insert_use_container(position_for_import, &ctx.sema)?; 150 let scope = ImportScope::find_insert_use_container(position_for_import, &ctx.sema)?;
147 151
148 let current_module = ctx.sema.scope(position_for_import).module()?; 152 let current_module = ctx.sema.scope(position_for_import).module()?;
149 let current_crate = current_module.krate(); 153 let current_crate = current_module.krate();
150 154
151 let import_path = imports_locator::find_exact_imports(&ctx.sema, current_crate, imported_name) 155 let (import_path, item_to_import) =
152 .filter_map(|candidate| { 156 items_locator::with_exact_name(&ctx.sema, current_crate, imported_name)
153 let item: hir::ItemInNs = candidate.either(Into::into, Into::into); 157 .into_iter()
154 current_module.find_use_path_prefixed(db, item, config.insert_use.prefix_kind) 158 .filter_map(|candidate| {
155 }) 159 current_module
156 .find(|mod_path| mod_path.to_string() == full_import_path)?; 160 .find_use_path_prefixed(db, candidate, config.insert_use.prefix_kind)
161 .zip(Some(candidate))
162 })
163 .find(|(mod_path, _)| mod_path.to_string() == full_import_path)?;
164 let import =
165 LocatedImport::new(import_path.clone(), item_to_import, item_to_import, Some(import_path));
157 166
158 ImportEdit { import_path, import_scope, import_for_trait_assoc_item } 167 ImportEdit { import, scope }.to_text_edit(config.insert_use).map(|edit| vec![edit])
159 .to_text_edit(config.insert_use.merge)
160 .map(|edit| vec![edit])
161} 168}
162 169
163#[cfg(test)] 170#[cfg(test)]