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.rs53
1 files changed, 29 insertions, 24 deletions
diff --git a/crates/ide-db/src/symbol_index.rs b/crates/ide-db/src/symbol_index.rs
index 94d354d28e..c94644eeb8 100644
--- a/crates/ide-db/src/symbol_index.rs
+++ b/crates/ide-db/src/symbol_index.rs
@@ -25,6 +25,7 @@ use std::{
fmt,
hash::{Hash, Hasher},
mem,
+ ops::ControlFlow,
};
use base_db::{
@@ -136,16 +137,13 @@ fn library_symbols(db: &dyn SymbolsDatabase, source_root_id: SourceRootId) -> Ar
// the module or crate indices for those in salsa unless we need to.
.for_each(|module| symbol_collector.collect(module));
- let mut symbols = symbol_collector.finish();
- symbols.shrink_to_fit();
- Arc::new(SymbolIndex::new(symbols))
+ Arc::new(SymbolIndex::new(symbol_collector.finish()))
}
fn module_symbols(db: &dyn SymbolsDatabase, module: Module) -> Arc<SymbolIndex> {
let _p = tracing::info_span!("module_symbols").entered();
- let symbols = SymbolCollector::collect_module(db.upcast(), module);
- Arc::new(SymbolIndex::new(symbols))
+ Arc::new(SymbolIndex::new(SymbolCollector::collect_module(db.upcast(), module)))
}
pub fn crate_symbols(db: &dyn SymbolsDatabase, krate: Crate) -> Box<[Arc<SymbolIndex>]> {
@@ -222,13 +220,16 @@ pub fn world_symbols(db: &RootDatabase, query: Query) -> Vec<FileSymbol> {
};
let mut res = vec![];
- query.search(&indices, |f| res.push(f.clone()));
+ query.search::<()>(&indices, |f| {
+ res.push(f.clone());
+ ControlFlow::Continue(())
+ });
res
}
#[derive(Default)]
pub struct SymbolIndex {
- symbols: Vec<FileSymbol>,
+ symbols: Box<[FileSymbol]>,
map: fst::Map<Vec<u8>>,
}
@@ -253,10 +254,10 @@ impl Hash for SymbolIndex {
}
impl SymbolIndex {
- fn new(mut symbols: Vec<FileSymbol>) -> SymbolIndex {
+ fn new(mut symbols: Box<[FileSymbol]>) -> SymbolIndex {
fn cmp(lhs: &FileSymbol, rhs: &FileSymbol) -> Ordering {
- let lhs_chars = lhs.name.chars().map(|c| c.to_ascii_lowercase());
- let rhs_chars = rhs.name.chars().map(|c| c.to_ascii_lowercase());
+ let lhs_chars = lhs.name.as_str().chars().map(|c| c.to_ascii_lowercase());
+ let rhs_chars = rhs.name.as_str().chars().map(|c| c.to_ascii_lowercase());
lhs_chars.cmp(rhs_chars)
}
@@ -316,11 +317,11 @@ impl SymbolIndex {
}
impl Query {
- pub(crate) fn search<'sym>(
+ pub(crate) fn search<'sym, T>(
self,
indices: &'sym [Arc<SymbolIndex>],
- cb: impl FnMut(&'sym FileSymbol),
- ) {
+ cb: impl FnMut(&'sym FileSymbol) -> ControlFlow<T>,
+ ) -> Option<T> {
let _p = tracing::info_span!("symbol_index::Query::search").entered();
let mut op = fst::map::OpBuilder::new();
match self.mode {
@@ -351,12 +352,12 @@ impl Query {
}
}
- fn search_maps<'sym>(
+ fn search_maps<'sym, T>(
&self,
indices: &'sym [Arc<SymbolIndex>],
mut stream: fst::map::Union<'_>,
- mut cb: impl FnMut(&'sym FileSymbol),
- ) {
+ mut cb: impl FnMut(&'sym FileSymbol) -> ControlFlow<T>,
+ ) -> Option<T> {
let ignore_underscore_prefixed = !self.query.starts_with("__");
while let Some((_, indexed_values)) = stream.next() {
for &IndexedValue { index, value } in indexed_values {
@@ -377,15 +378,19 @@ impl Query {
continue;
}
// Hide symbols that start with `__` unless the query starts with `__`
- if ignore_underscore_prefixed && symbol.name.starts_with("__") {
+ let symbol_name = symbol.name.as_str();
+ if ignore_underscore_prefixed && symbol_name.starts_with("__") {
continue;
}
- if self.mode.check(&self.query, self.case_sensitive, &symbol.name) {
- cb(symbol);
+ if self.mode.check(&self.query, self.case_sensitive, symbol_name) {
+ if let Some(b) = cb(symbol).break_value() {
+ return Some(b);
+ }
}
}
}
}
+ None
}
fn matches_assoc_mode(&self, is_trait_assoc_item: bool) -> bool {
@@ -476,9 +481,9 @@ use Macro as ItemLikeMacro;
use Macro as Trait; // overlay namespaces
//- /b_mod.rs
struct StructInModB;
-use super::Macro as SuperItemLikeMacro;
-use crate::b_mod::StructInModB as ThisStruct;
-use crate::Trait as IsThisJustATrait;
+pub(self) use super::Macro as SuperItemLikeMacro;
+pub(self) use crate::b_mod::StructInModB as ThisStruct;
+pub(self) use crate::Trait as IsThisJustATrait;
"#,
);
@@ -487,7 +492,7 @@ use crate::Trait as IsThisJustATrait;
.into_iter()
.map(|module_id| {
let mut symbols = SymbolCollector::collect_module(&db, module_id);
- symbols.sort_by_key(|it| it.name.clone());
+ symbols.sort_by_key(|it| it.name.as_str().to_owned());
(module_id, symbols)
})
.collect();
@@ -514,7 +519,7 @@ struct Duplicate;
.into_iter()
.map(|module_id| {
let mut symbols = SymbolCollector::collect_module(&db, module_id);
- symbols.sort_by_key(|it| it.name.clone());
+ symbols.sort_by_key(|it| it.name.as_str().to_owned());
(module_id, symbols)
})
.collect();