From d19f3ac83441420365bff5e4ce21d1d2175bd8c2 Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Mon, 13 Aug 2018 15:35:53 +0300 Subject: workspace symbols --- crates/libanalysis/src/lib.rs | 29 +++++++++++++++++------------ crates/libanalysis/src/symbol_index.rs | 28 ++++++++++++---------------- 2 files changed, 29 insertions(+), 28 deletions(-) (limited to 'crates/libanalysis') diff --git a/crates/libanalysis/src/lib.rs b/crates/libanalysis/src/lib.rs index f0d0cf0a4..acaadb8a2 100644 --- a/crates/libanalysis/src/lib.rs +++ b/crates/libanalysis/src/lib.rs @@ -89,14 +89,15 @@ impl World { Ok(index.clone()) } - pub fn world_symbols(&self, query: &str, f: &mut FnMut(&Path, &FileSymbol) -> Search) { + pub fn world_symbols<'a>(&'a self, query: &str) -> impl Iterator + 'a + { let q = Query::new(query); - for (path, data) in self.data.file_map.iter() { - let symbols = data.symbols(path.as_path()); - if q.process(symbols, &mut |symbol| f(path, symbol)) == Search::Break { - break; - } - } + self.data.file_map.iter() + .flat_map(move |(path, data)| { + let path: &'a Path = path.as_path(); + let symbols = data.symbols(path); + q.process(symbols).map(move |s| (path, s)) + }) } fn file_data(&self, path: &Path) -> Result> { @@ -107,11 +108,15 @@ impl World { } } -#[derive(Debug, Clone, Copy, PartialEq, Eq)] -pub enum Search { - Continue, - Break, -} + +pub type SearchResult = ::std::result::Result; + +pub struct Continue; + +pub struct Break; + +pub const CONTINUE: SearchResult = Ok(Continue); +pub const BREAK: SearchResult = Err(Break); #[derive(Default, Debug)] diff --git a/crates/libanalysis/src/symbol_index.rs b/crates/libanalysis/src/symbol_index.rs index 1878fae99..4d90aac0c 100644 --- a/crates/libanalysis/src/symbol_index.rs +++ b/crates/libanalysis/src/symbol_index.rs @@ -5,8 +5,6 @@ use libsyntax2::{ }; use fst::{self, IntoStreamer}; -use Search; - #[derive(Debug)] pub(crate) struct FileSymbols { symbols: Vec, @@ -47,11 +45,10 @@ impl Query { Query { query, all_symbols } } - pub(crate) fn process( + pub(crate) fn process<'a>( &self, - file: &FileSymbols, - acc: &mut FnMut(&FileSymbol) -> Search, - ) -> Search { + file: &'a FileSymbols, + ) -> impl Iterator + 'a { fn is_type(kind: SyntaxKind) -> bool { match kind { STRUCT | ENUM | TRAIT | TYPE_ITEM => true, @@ -59,16 +56,15 @@ impl Query { } } let automaton = fst::automaton::Subsequence::new(&self.query); - for idx in file.map.search(automaton).into_stream().into_values() { - let idx = idx as usize; - let symbol = &file.symbols[idx]; - if self.all_symbols || is_type(symbol.kind) { - if acc(&symbol) == Search::Break { - return Search::Break; - } - } - } - Search::Continue + let all_symbols = self.all_symbols; + file.map.search(automaton).into_stream() + .into_values() + .into_iter() + .map(move |idx| { + let idx = idx as usize; + &file.symbols[idx] + }) + .filter(move |s| all_symbols || is_type(s.kind)) } } -- cgit v1.2.3