From e214c3a6bd7f74b42d38663b959fc4f0d113c90c Mon Sep 17 00:00:00 2001 From: Kirill Bulatov Date: Mon, 1 Mar 2021 13:55:47 +0200 Subject: Simplify --- crates/ide_completion/src/completions/flyimport.rs | 43 +++++++++------------- crates/ide_db/src/helpers/import_assets.rs | 18 +++------ 2 files changed, 23 insertions(+), 38 deletions(-) diff --git a/crates/ide_completion/src/completions/flyimport.rs b/crates/ide_completion/src/completions/flyimport.rs index 55439d0e5..c6b83da3d 100644 --- a/crates/ide_completion/src/completions/flyimport.rs +++ b/crates/ide_completion/src/completions/flyimport.rs @@ -48,7 +48,7 @@ //! Note that having this flag set to `true` does not guarantee that the feature is enabled: your client needs to have the corredponding //! capability enabled. -use hir::{AsAssocItem, ItemInNs, ModPath, ScopeDef}; +use hir::{AsAssocItem, ModPath, ModuleDef, ScopeDef}; use ide_db::helpers::{ import_assets::{ImportAssets, ImportCandidate}, insert_use::ImportScope, @@ -91,33 +91,26 @@ pub(crate) fn import_on_the_fly(acc: &mut Completions, ctx: &CompletionContext) &ctx.sema, )?; - let mut all_mod_paths = import_assets - .search_for_imports(&ctx.sema, ctx.config.insert_use.prefix_kind) - .into_iter() - .map(|import| { - let def_to_display = match import.item_to_display() { - ItemInNs::Types(id) => ScopeDef::ModuleDef(id.into()), - ItemInNs::Values(id) => ScopeDef::ModuleDef(id.into()), - ItemInNs::Macros(id) => ScopeDef::MacroDef(id.into()), - }; - (import, def_to_display) - }) - .collect::>(); - all_mod_paths.sort_by_cached_key(|(import, _)| { + let mut all_imports = + import_assets.search_for_imports(&ctx.sema, ctx.config.insert_use.prefix_kind); + all_imports.sort_by_cached_key(|import| { compute_fuzzy_completion_order_key(import.display_path(), &user_input_lowercased) }); - acc.add_all(all_mod_paths.into_iter().filter_map(|(import, def_to_display)| { - let import_for_trait_assoc_item = match def_to_display { - ScopeDef::ModuleDef(module_def) => module_def - .as_assoc_item(ctx.db) - .and_then(|assoc| assoc.containing_trait(ctx.db)) - .is_some(), - _ => false, - }; - let import_edit = - ImportEdit { import, import_scope: import_scope.clone(), import_for_trait_assoc_item }; - render_resolution_with_import(RenderContext::new(ctx), import_edit, &def_to_display) + acc.add_all(all_imports.into_iter().filter_map(|import| { + let import_for_trait_assoc_item = import + .item_to_display() + .as_module_def_id() + .and_then(|module_def_id| { + ModuleDef::from(module_def_id).as_assoc_item(ctx.db)?.containing_trait(ctx.db) + }) + .is_some(); + let def_to_display = ScopeDef::from(import.item_to_display()); + render_resolution_with_import( + RenderContext::new(ctx), + ImportEdit { import, import_scope: import_scope.clone(), import_for_trait_assoc_item }, + &def_to_display, + ) })); Some(()) } diff --git a/crates/ide_db/src/helpers/import_assets.rs b/crates/ide_db/src/helpers/import_assets.rs index 2909ecd45..4e352d546 100644 --- a/crates/ide_db/src/helpers/import_assets.rs +++ b/crates/ide_db/src/helpers/import_assets.rs @@ -130,7 +130,6 @@ impl<'a> ImportAssets<'a> { #[derive(Debug, Clone, PartialEq, Eq, Hash)] pub struct LocatedImport { - // TODO kb extract both into a separate struct + add another field: `assoc_item_name: Optional` import_path: ModPath, item_to_import: ItemInNs, data_to_display: Option<(ModPath, ItemInNs)>, @@ -146,7 +145,7 @@ impl LocatedImport { } pub fn display_path(&self) -> &ModPath { - self.data_to_display.as_ref().map(|(mod_pathh, _)| mod_pathh).unwrap_or(&self.import_path) + self.data_to_display.as_ref().map(|(mod_path, _)| mod_path).unwrap_or(&self.import_path) } pub fn import_path(&self) -> &ModPath { @@ -227,14 +226,7 @@ impl<'a> ImportAssets<'a> { self.applicable_defs(sema.db, prefixed, defs_for_candidate_name) .into_iter() .filter(|import| import.import_path().len() > 1) - .filter(|import| { - let proposed_def = match import.item_to_import() { - ItemInNs::Types(id) => ScopeDef::ModuleDef(id.into()), - ItemInNs::Values(id) => ScopeDef::ModuleDef(id.into()), - ItemInNs::Macros(id) => ScopeDef::MacroDef(id.into()), - }; - !scope_definitions.contains(&proposed_def) - }) + .filter(|import| !scope_definitions.contains(&ScopeDef::from(import.item_to_import()))) .collect() } @@ -314,8 +306,8 @@ fn import_for_item( unresolved_qualifier: &str, original_item: ItemInNs, ) -> Option { - let (item_candidate, trait_to_import) = match original_item { - ItemInNs::Types(module_def_id) | ItemInNs::Values(module_def_id) => { + let (item_candidate, trait_to_import) = match original_item.as_module_def_id() { + Some(module_def_id) => { match ModuleDef::from(module_def_id).as_assoc_item(db).map(|assoc| assoc.container(db)) { Some(AssocItemContainer::Trait(trait_)) => { @@ -328,7 +320,7 @@ fn import_for_item( None => (original_item, None), } } - ItemInNs::Macros(_) => (original_item, None), + None => (original_item, None), }; let import_path_candidate = mod_path(item_candidate)?; -- cgit v1.2.3