Use smart case in flyimport items lookup

This commit is contained in:
Kirill Bulatov 2021-03-20 23:55:16 +02:00
parent 09412d85fc
commit ec731e19df
3 changed files with 80 additions and 6 deletions

View File

@ -1,8 +1,10 @@
//! Feature: completion with imports-on-the-fly
//!
//! When completing names in the current scope, proposes additional imports from other modules or crates,
//! if they can be qualified in the scope and their name contains all symbols from the completion input
//! (case-insensitive, in any order or places).
//! if they can be qualified in the scope and their name contains all symbols from the completion input.
//!
//! To be considered applicable, the name must contain all input symbols in the given order, not necessarily adjacent.
//! If any input symbol is not lowercased, the name must contain all symbols in exact case; otherwise the contaning is checked case-insensitively.
//!
//! ```
//! fn main() {
@ -942,7 +944,7 @@ impl Item {
}
fn main() {
bar::Ass$0
bar::ASS$0
}"#,
expect![[]],
)
@ -979,4 +981,57 @@ fn main() {
expect![[]],
)
}
#[test]
fn case_matters() {
check(
r#"
mod foo {
pub const TEST_CONST: usize = 3;
pub fn test_function() -> i32 {
4
}
}
fn main() {
TE$0
}"#,
expect![[r#"
ct foo::TEST_CONST
"#]],
);
check(
r#"
mod foo {
pub const TEST_CONST: usize = 3;
pub fn test_function() -> i32 {
4
}
}
fn main() {
te$0
}"#,
expect![[r#"
ct foo::TEST_CONST
fn test_function() (foo::test_function) fn() -> i32
"#]],
);
check(
r#"
mod foo {
pub const TEST_CONST: usize = 3;
pub fn test_function() -> i32 {
4
}
}
fn main() {
Te$0
}"#,
expect![[]],
);
}
}

View File

@ -62,6 +62,8 @@ pub fn items_with_name(
(local_query, external_query)
}
NameToImport::Fuzzy(fuzzy_search_string) => {
let mut local_query = symbol_index::Query::new(fuzzy_search_string.clone());
let mut external_query = import_map::Query::new(fuzzy_search_string.clone())
.search_mode(import_map::SearchMode::Fuzzy)
.name_only();
@ -75,7 +77,12 @@ pub fn items_with_name(
}
}
(symbol_index::Query::new(fuzzy_search_string), external_query)
if fuzzy_search_string.to_lowercase() != fuzzy_search_string {
local_query.case_sensitive();
external_query = external_query.case_sensitive();
}
(local_query, external_query)
}
};

View File

@ -52,6 +52,7 @@ pub struct Query {
only_types: bool,
libs: bool,
exact: bool,
case_sensitive: bool,
limit: usize,
}
@ -64,6 +65,7 @@ pub fn new(query: String) -> Query {
only_types: false,
libs: false,
exact: false,
case_sensitive: false,
limit: usize::max_value(),
}
}
@ -80,6 +82,10 @@ pub fn exact(&mut self) {
self.exact = true;
}
pub fn case_sensitive(&mut self) {
self.case_sensitive = true;
}
pub fn limit(&mut self, limit: usize) {
self.limit = limit
}
@ -326,8 +332,14 @@ pub(crate) fn search(self, indices: &[&SymbolIndex]) -> Vec<FileSymbol> {
if self.only_types && !symbol.kind.is_type() {
continue;
}
if self.exact && symbol.name != self.query {
continue;
if self.exact {
if symbol.name != self.query {
continue;
}
} else if self.case_sensitive {
if self.query.chars().any(|c| !symbol.name.contains(c)) {
continue;
}
}
res.push(symbol.clone());