Add docs and optimisations
This commit is contained in:
parent
c4995cfbd5
commit
e4c3f753d2
@ -101,8 +101,8 @@ fn complete_enum_variants(acc: &mut Completions, ctx: &CompletionContext, ty: &T
|
|||||||
//
|
//
|
||||||
// .Fuzzy search details
|
// .Fuzzy search details
|
||||||
//
|
//
|
||||||
// To avoid an excessive amount of the results returned, completion input is checked for inclusion in the identifiers only
|
// To avoid an excessive amount of the results returned, completion input is checked for inclusion in the names only
|
||||||
// (i.e. in `HashMap` in the `std::collections::HashMap` path), also not in the module indentifiers.
|
// (i.e. in `HashMap` in the `std::collections::HashMap` path).
|
||||||
//
|
//
|
||||||
// .Merge Behavior
|
// .Merge Behavior
|
||||||
//
|
//
|
||||||
|
@ -238,11 +238,15 @@ pub enum ImportKind {
|
|||||||
BuiltinType,
|
BuiltinType,
|
||||||
}
|
}
|
||||||
|
|
||||||
/// todo kb
|
/// A way to match import map contents against the search query.
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
pub enum SearchMode {
|
pub enum SearchMode {
|
||||||
|
/// Import map entry should strictly match the query string.
|
||||||
Equals,
|
Equals,
|
||||||
|
/// Import map entry should contain the query string.
|
||||||
Contains,
|
Contains,
|
||||||
|
/// Import map entry should contain all letters from the query string,
|
||||||
|
/// in the same order, but not necessary adjacent.
|
||||||
Fuzzy,
|
Fuzzy,
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -270,11 +274,14 @@ pub fn new(query: &str) -> Self {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Matches entries' names only, ignoring the rest of
|
||||||
|
/// the qualifier.
|
||||||
|
/// Example: for `std::marker::PhantomData`, the name is `PhantomData`.
|
||||||
pub fn name_only(self) -> Self {
|
pub fn name_only(self) -> Self {
|
||||||
Self { name_only: true, ..self }
|
Self { name_only: true, ..self }
|
||||||
}
|
}
|
||||||
|
|
||||||
/// todo kb
|
/// Specifies the way to search for the entries using the query.
|
||||||
pub fn search_mode(self, search_mode: SearchMode) -> Self {
|
pub fn search_mode(self, search_mode: SearchMode) -> Self {
|
||||||
Self { search_mode, ..self }
|
Self { search_mode, ..self }
|
||||||
}
|
}
|
||||||
@ -296,7 +303,6 @@ pub fn exclude_import_kind(mut self, import_kind: ImportKind) -> Self {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO kb: ugly with a special `return true` case and the `enforce_lowercase` one.
|
|
||||||
fn contains_query(query: &Query, input_path: &ImportPath, enforce_lowercase: bool) -> bool {
|
fn contains_query(query: &Query, input_path: &ImportPath, enforce_lowercase: bool) -> bool {
|
||||||
let mut input = if query.name_only {
|
let mut input = if query.name_only {
|
||||||
input_path.segments.last().unwrap().to_string()
|
input_path.segments.last().unwrap().to_string()
|
||||||
@ -378,7 +384,10 @@ pub fn search_dependencies<'a>(
|
|||||||
Some(import_kind) => !query.exclude_import_kinds.contains(&import_kind),
|
Some(import_kind) => !query.exclude_import_kinds.contains(&import_kind),
|
||||||
None => true,
|
None => true,
|
||||||
})
|
})
|
||||||
.filter(|item| contains_query(&query, &import_map.map[item].path, false));
|
.filter(|item| {
|
||||||
|
!query.case_sensitive // we've already checked the common importables path case-insensitively
|
||||||
|
|| contains_query(&query, &import_map.map[item].path, false)
|
||||||
|
});
|
||||||
res.extend(iter);
|
res.extend(iter);
|
||||||
|
|
||||||
if res.len() >= query.limit {
|
if res.len() >= query.limit {
|
||||||
|
@ -39,18 +39,18 @@ pub fn find_similar_imports<'a>(
|
|||||||
sema: &Semantics<'a, RootDatabase>,
|
sema: &Semantics<'a, RootDatabase>,
|
||||||
krate: Crate,
|
krate: Crate,
|
||||||
limit: Option<usize>,
|
limit: Option<usize>,
|
||||||
name_to_import: &str,
|
fuzzy_search_string: &str,
|
||||||
name_only: bool,
|
name_only: bool,
|
||||||
) -> impl Iterator<Item = Either<ModuleDef, MacroDef>> {
|
) -> impl Iterator<Item = Either<ModuleDef, MacroDef>> {
|
||||||
let _p = profile::span("find_similar_imports");
|
let _p = profile::span("find_similar_imports");
|
||||||
|
|
||||||
let mut external_query =
|
let mut external_query =
|
||||||
import_map::Query::new(name_to_import).search_mode(import_map::SearchMode::Fuzzy);
|
import_map::Query::new(fuzzy_search_string).search_mode(import_map::SearchMode::Fuzzy);
|
||||||
if name_only {
|
if name_only {
|
||||||
external_query = external_query.name_only();
|
external_query = external_query.name_only();
|
||||||
}
|
}
|
||||||
|
|
||||||
let mut local_query = symbol_index::Query::new(name_to_import.to_string());
|
let mut local_query = symbol_index::Query::new(fuzzy_search_string.to_string());
|
||||||
|
|
||||||
if let Some(limit) = limit {
|
if let Some(limit) = limit {
|
||||||
local_query.limit(limit);
|
local_query.limit(limit);
|
||||||
|
Loading…
Reference in New Issue
Block a user