Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/ide-db/src/symbol_index.rs')
-rw-r--r--crates/ide-db/src/symbol_index.rs39
1 files changed, 38 insertions, 1 deletions
diff --git a/crates/ide-db/src/symbol_index.rs b/crates/ide-db/src/symbol_index.rs
index d1ba79e8c7..c15cade84a 100644
--- a/crates/ide-db/src/symbol_index.rs
+++ b/crates/ide-db/src/symbol_index.rs
@@ -50,6 +50,7 @@ pub struct Query {
case_sensitive: bool,
only_types: bool,
libs: bool,
+ exclude_imports: bool,
}
impl Query {
@@ -63,6 +64,7 @@ impl Query {
mode: SearchMode::Fuzzy,
assoc_mode: AssocSearchMode::Include,
case_sensitive: false,
+ exclude_imports: false,
}
}
@@ -94,6 +96,10 @@ impl Query {
pub fn case_sensitive(&mut self) {
self.case_sensitive = true;
}
+
+ pub fn exclude_imports(&mut self) {
+ self.exclude_imports = true;
+ }
}
#[query_group::query_group]
@@ -362,6 +368,9 @@ impl Query {
if ignore_underscore_prefixed && symbol_name.starts_with("__") {
continue;
}
+ if self.exclude_imports && symbol.is_import {
+ continue;
+ }
if self.mode.check(&self.query, self.case_sensitive, symbol_name) {
if let Some(b) = cb(symbol).break_value() {
return Some(b);
@@ -385,7 +394,8 @@ impl Query {
mod tests {
use expect_test::expect_file;
- use test_fixture::WithFixture;
+ use salsa::Durability;
+ use test_fixture::{WORKSPACE, WithFixture};
use super::*;
@@ -506,4 +516,31 @@ struct Duplicate;
expect_file!["./test_data/test_doc_alias.txt"].assert_debug_eq(&symbols);
}
+
+ #[test]
+ fn test_exclude_imports() {
+ let (mut db, _) = RootDatabase::with_many_files(
+ r#"
+//- /lib.rs
+mod foo;
+pub use foo::Foo;
+
+//- /foo.rs
+pub struct Foo;
+"#,
+ );
+
+ let mut local_roots = FxHashSet::default();
+ local_roots.insert(WORKSPACE);
+ db.set_local_roots_with_durability(Arc::new(local_roots), Durability::HIGH);
+
+ let mut query = Query::new("Foo".to_owned());
+ let mut symbols = world_symbols(&db, query.clone());
+ symbols.sort_by_key(|x| x.is_import);
+ expect_file!["./test_data/test_symbols_with_imports.txt"].assert_debug_eq(&symbols);
+
+ query.exclude_imports();
+ let symbols = world_symbols(&db, query);
+ expect_file!["./test_data/test_symbols_exclude_imports.txt"].assert_debug_eq(&symbols);
+ }
}