use std::iter;
use either::Either;
-use hir::{Adt, AsAssocItem, ModPath, ModuleDef, ScopeDef, Type};
+use hir::{Adt, ModPath, ModuleDef, ScopeDef, Type};
use ide_db::helpers::insert_use::ImportScope;
use ide_db::imports_locator;
use syntax::AstNode;
Some(40),
potential_import_name,
true,
+ true,
)
- .filter(|import_candidate| match import_candidate {
- Either::Left(ModuleDef::Function(function)) => function.as_assoc_item(ctx.db).is_none(),
- Either::Left(ModuleDef::Const(const_)) => const_.as_assoc_item(ctx.db).is_none(),
- Either::Left(ModuleDef::TypeAlias(type_alias)) => {
- type_alias.as_assoc_item(ctx.db).is_none()
- }
- _ => true,
- })
.filter_map(|import_candidate| {
Some(match import_candidate {
Either::Left(module_def) => {
ItemInNs::Values(module_def_id)
};
- let mut assoc_item_info = original_import_info.to_owned();
+ let mut assoc_item_info = original_import_info.clone();
assoc_item_info.path.segments.push(assoc_item_name.to_owned());
assoc_item_info.is_trait_assoc_item = true;
self.map.insert(assoc_item, assoc_item_info);
self.exclude_import_kinds.insert(import_kind);
self
}
-}
-fn import_matches_query(import: &ImportInfo, query: &Query, enforce_lowercase: bool) -> bool {
- let mut input = if import.is_trait_assoc_item || query.name_only {
- import.path.segments.last().unwrap().to_string()
- } else {
- import.path.to_string()
- };
- if enforce_lowercase || !query.case_sensitive {
- input.make_ascii_lowercase();
- }
+ fn import_matches(&self, import: &ImportInfo, enforce_lowercase: bool) -> bool {
+ let mut input = if import.is_trait_assoc_item || self.name_only {
+ import.path.segments.last().unwrap().to_string()
+ } else {
+ import.path.to_string()
+ };
+ if enforce_lowercase || !self.case_sensitive {
+ input.make_ascii_lowercase();
+ }
- let query_string =
- if !enforce_lowercase && query.case_sensitive { &query.query } else { &query.lowercased };
-
- match query.search_mode {
- SearchMode::Equals => &input == query_string,
- SearchMode::Contains => input.contains(query_string),
- SearchMode::Fuzzy => {
- let mut unchecked_query_chars = query_string.chars();
- let mut mismatching_query_char = unchecked_query_chars.next();
-
- for input_char in input.chars() {
- match mismatching_query_char {
- None => return true,
- Some(matching_query_char) if matching_query_char == input_char => {
- mismatching_query_char = unchecked_query_chars.next();
+ let query_string =
+ if !enforce_lowercase && self.case_sensitive { &self.query } else { &self.lowercased };
+
+ match self.search_mode {
+ SearchMode::Equals => &input == query_string,
+ SearchMode::Contains => input.contains(query_string),
+ SearchMode::Fuzzy => {
+ let mut unchecked_query_chars = query_string.chars();
+ let mut mismatching_query_char = unchecked_query_chars.next();
+
+ for input_char in input.chars() {
+ match mismatching_query_char {
+ None => return true,
+ Some(matching_query_char) if matching_query_char == input_char => {
+ mismatching_query_char = unchecked_query_chars.next();
+ }
+ _ => (),
}
- _ => (),
}
+ mismatching_query_char.is_none()
}
- mismatching_query_char.is_none()
}
}
}
let importables = &import_map.importables[indexed_value.value as usize..];
let common_importable_data = &import_map.map[&importables[0]];
- if !import_matches_query(common_importable_data, &query, true) {
+ if !query.import_matches(common_importable_data, true) {
continue;
}
})
.filter(|item| {
!query.case_sensitive // we've already checked the common importables path case-insensitively
- || import_matches_query(&import_map.map[item], &query, false)
+ || query.import_matches(&import_map.map[item], false)
});
res.extend(iter);
//! This module contains an import search funcionality that is provided to the assists module.
//! Later, this should be moved away to a separate crate that is accessible from the assists module.
-use hir::{import_map, Crate, MacroDef, ModuleDef, Semantics};
+use hir::{import_map, AsAssocItem, Crate, MacroDef, ModuleDef, Semantics};
use syntax::{ast, AstNode, SyntaxKind::NAME};
use crate::{
krate: Crate,
limit: Option<usize>,
fuzzy_search_string: String,
+ ignore_assoc_items: bool,
name_only: bool,
-) -> impl Iterator<Item = Either<ModuleDef, MacroDef>> {
+) -> impl Iterator<Item = Either<ModuleDef, MacroDef>> + 'a {
let _p = profile::span("find_similar_imports");
let mut external_query = import_map::Query::new(fuzzy_search_string.clone())
external_query = external_query.limit(limit);
}
- find_imports(sema, krate, local_query, external_query)
+ let db = sema.db;
+ find_imports(sema, krate, local_query, external_query).filter(move |import_candidate| {
+ if ignore_assoc_items {
+ match import_candidate {
+ Either::Left(ModuleDef::Function(function)) => function.as_assoc_item(db).is_none(),
+ Either::Left(ModuleDef::Const(const_)) => const_.as_assoc_item(db).is_none(),
+ Either::Left(ModuleDef::TypeAlias(type_alias)) => {
+ type_alias.as_assoc_item(db).is_none()
+ }
+ _ => true,
+ }
+ } else {
+ true
+ }
+ })
}
fn find_imports<'a>(