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)))
AssocItemSearch::Include,
Some(DEFAULT_QUERY_SEARCH_LIMIT),
)
- .into_iter()
.filter_map(|item| {
import_for_item(
sema.db,
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)?;
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;
}
/// 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<usize>,
-) -> FxHashSet<ItemInNs> {
+) -> impl Iterator<Item = ItemInNs> + 'a {
let _p = profile::span("items_with_name").detail(|| {
format!(
"Name: {} ({:?}), crate: {:?}, limit: {:?}",
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<ItemInNs> {
+) -> impl Iterator<Item = ItemInNs> + 'a {
let _p = profile::span("find_items");
let db = sema.db;
// 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(