diff options
author | Aleksey Kladov <[email protected]> | 2018-08-13 13:35:53 +0100 |
---|---|---|
committer | Aleksey Kladov <[email protected]> | 2018-08-13 13:35:53 +0100 |
commit | d19f3ac83441420365bff5e4ce21d1d2175bd8c2 (patch) | |
tree | 0523dc698784bb2501998956f8111b31f4e0387b /crates/libanalysis/src/lib.rs | |
parent | 133d001d8296e51bcb4d0dc0982671f55c2c77d9 (diff) |
workspace symbols
Diffstat (limited to 'crates/libanalysis/src/lib.rs')
-rw-r--r-- | crates/libanalysis/src/lib.rs | 29 |
1 files changed, 17 insertions, 12 deletions
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 { | |||
89 | Ok(index.clone()) | 89 | Ok(index.clone()) |
90 | } | 90 | } |
91 | 91 | ||
92 | pub fn world_symbols(&self, query: &str, f: &mut FnMut(&Path, &FileSymbol) -> Search) { | 92 | pub fn world_symbols<'a>(&'a self, query: &str) -> impl Iterator<Item=(&'a Path, &'a FileSymbol)> + 'a |
93 | { | ||
93 | let q = Query::new(query); | 94 | let q = Query::new(query); |
94 | for (path, data) in self.data.file_map.iter() { | 95 | self.data.file_map.iter() |
95 | let symbols = data.symbols(path.as_path()); | 96 | .flat_map(move |(path, data)| { |
96 | if q.process(symbols, &mut |symbol| f(path, symbol)) == Search::Break { | 97 | let path: &'a Path = path.as_path(); |
97 | break; | 98 | let symbols = data.symbols(path); |
98 | } | 99 | q.process(symbols).map(move |s| (path, s)) |
99 | } | 100 | }) |
100 | } | 101 | } |
101 | 102 | ||
102 | fn file_data(&self, path: &Path) -> Result<Arc<FileData>> { | 103 | fn file_data(&self, path: &Path) -> Result<Arc<FileData>> { |
@@ -107,11 +108,15 @@ impl World { | |||
107 | } | 108 | } |
108 | } | 109 | } |
109 | 110 | ||
110 | #[derive(Debug, Clone, Copy, PartialEq, Eq)] | 111 | |
111 | pub enum Search { | 112 | pub type SearchResult = ::std::result::Result<Continue, Break>; |
112 | Continue, | 113 | |
113 | Break, | 114 | pub struct Continue; |
114 | } | 115 | |
116 | pub struct Break; | ||
117 | |||
118 | pub const CONTINUE: SearchResult = Ok(Continue); | ||
119 | pub const BREAK: SearchResult = Err(Break); | ||
115 | 120 | ||
116 | 121 | ||
117 | #[derive(Default, Debug)] | 122 | #[derive(Default, Debug)] |