From eaa4fcbbdea69c8fcf5b6cdc1ff3c259be3e09cb Mon Sep 17 00:00:00 2001 From: Kirill Bulatov Date: Sun, 21 Mar 2021 00:17:09 +0200 Subject: Less reallocations --- crates/ide_db/src/helpers/import_assets.rs | 3 --- crates/ide_db/src/items_locator.rs | 28 ++++++++++++---------------- 2 files changed, 12 insertions(+), 19 deletions(-) (limited to 'crates/ide_db') diff --git a/crates/ide_db/src/helpers/import_assets.rs b/crates/ide_db/src/helpers/import_assets.rs index 0da7a1a9d..1881c746f 100644 --- a/crates/ide_db/src/helpers/import_assets.rs +++ b/crates/ide_db/src/helpers/import_assets.rs @@ -267,7 +267,6 @@ fn path_applicable_imports( AssocItemSearch::Exclude, Some(DEFAULT_QUERY_SEARCH_LIMIT), ) - .into_iter() .filter_map(|item| { let mod_path = mod_path(item)?; Some(LocatedImport::new(mod_path.clone(), item, item, Some(mod_path))) @@ -285,7 +284,6 @@ fn path_applicable_imports( AssocItemSearch::Include, Some(DEFAULT_QUERY_SEARCH_LIMIT), ) - .into_iter() .filter_map(|item| { import_for_item( sema.db, @@ -430,7 +428,6 @@ fn trait_applicable_items( AssocItemSearch::AssocItemsOnly, Some(DEFAULT_QUERY_SEARCH_LIMIT), ) - .into_iter() .filter_map(|input| item_as_assoc(db, input)) .filter_map(|assoc| { let assoc_item_trait = assoc.containing_trait(db)?; diff --git a/crates/ide_db/src/items_locator.rs b/crates/ide_db/src/items_locator.rs index b9d5852e2..9af94b86c 100644 --- a/crates/ide_db/src/items_locator.rs +++ b/crates/ide_db/src/items_locator.rs @@ -15,7 +15,6 @@ use crate::{ symbol_index::{self, FileSymbol}, RootDatabase, }; -use rustc_hash::FxHashSet; /// A value to use, when uncertain which limit to pick. pub const DEFAULT_QUERY_SEARCH_LIMIT: usize = 40; @@ -32,13 +31,13 @@ pub enum AssocItemSearch { } /// Searches for importable items with the given name in the crate and its dependencies. -pub fn items_with_name( - sema: &Semantics<'_, RootDatabase>, +pub fn items_with_name<'a>( + sema: &'a Semantics<'_, RootDatabase>, krate: Crate, name: NameToImport, assoc_item_search: AssocItemSearch, limit: Option, -) -> FxHashSet { +) -> impl Iterator + 'a { let _p = profile::span("items_with_name").detail(|| { format!( "Name: {} ({:?}), crate: {:?}, limit: {:?}", @@ -94,13 +93,13 @@ pub fn items_with_name( find_items(sema, krate, assoc_item_search, local_query, external_query) } -fn find_items( - sema: &Semantics<'_, RootDatabase>, +fn find_items<'a>( + sema: &'a Semantics<'_, RootDatabase>, krate: Crate, assoc_item_search: AssocItemSearch, local_query: symbol_index::Query, external_query: import_map::Query, -) -> FxHashSet { +) -> impl Iterator + 'a { let _p = profile::span("find_items"); let db = sema.db; @@ -115,21 +114,18 @@ fn find_items( // Query the local crate using the symbol index. let local_results = symbol_index::crate_symbols(db, krate.into(), local_query) .into_iter() - .filter_map(|local_candidate| get_name_definition(sema, &local_candidate)) + .filter_map(move |local_candidate| get_name_definition(sema, &local_candidate)) .filter_map(|name_definition_to_import| match name_definition_to_import { Definition::ModuleDef(module_def) => Some(ItemInNs::from(module_def)), Definition::Macro(macro_def) => Some(ItemInNs::from(macro_def)), _ => None, }); - external_importables - .chain(local_results) - .filter(move |&item| match assoc_item_search { - AssocItemSearch::Include => true, - AssocItemSearch::Exclude => !is_assoc_item(item, sema.db), - AssocItemSearch::AssocItemsOnly => is_assoc_item(item, sema.db), - }) - .collect() + external_importables.chain(local_results).filter(move |&item| match assoc_item_search { + AssocItemSearch::Include => true, + AssocItemSearch::Exclude => !is_assoc_item(item, sema.db), + AssocItemSearch::AssocItemsOnly => is_assoc_item(item, sema.db), + }) } fn get_name_definition( -- cgit v1.2.3