From d999f4b56803b613dcf354862e1db4b5d2a8a8d0 Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Fri, 31 Aug 2018 12:04:33 +0300 Subject: cancelation --- crates/libanalysis/src/imp.rs | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) (limited to 'crates/libanalysis/src/imp.rs') diff --git a/crates/libanalysis/src/imp.rs b/crates/libanalysis/src/imp.rs index 97802bd50..6a6e1e933 100644 --- a/crates/libanalysis/src/imp.rs +++ b/crates/libanalysis/src/imp.rs @@ -23,6 +23,7 @@ use { module_map::Problem, symbol_index::FileSymbols, module_map::{ModuleMap, ChangeKind}, + JobToken, }; #[derive(Debug)] @@ -111,9 +112,10 @@ impl AnalysisImpl { .clone() } - pub fn world_symbols(&self, mut query: Query) -> Vec<(FileId, FileSymbol)> { + pub fn world_symbols(&self, mut query: Query, token: &JobToken) -> Vec<(FileId, FileSymbol)> { self.reindex(); self.data.file_map.iter() + .take_while(move |_| !token.is_canceled()) .flat_map(move |(id, data)| { let symbols = data.symbols(); query.process(symbols).into_iter().map(move |s| (*id, s)) @@ -147,11 +149,12 @@ impl AnalysisImpl { &self, id: FileId, offset: TextUnit, + token: &JobToken, ) -> Vec<(FileId, FileSymbol)> { let file = self.file_syntax(id); let syntax = file.syntax(); if let Some(name_ref) = find_node_at_offset::(syntax, offset) { - return self.index_resolve(name_ref); + return self.index_resolve(name_ref, token); } if let Some(name) = find_node_at_offset::(syntax, offset) { if let Some(module) = name.syntax().parent().and_then(ast::Module::cast) { @@ -245,12 +248,12 @@ impl AnalysisImpl { .collect() } - fn index_resolve(&self, name_ref: ast::NameRef) -> Vec<(FileId, FileSymbol)> { + fn index_resolve(&self, name_ref: ast::NameRef, token: &JobToken) -> Vec<(FileId, FileSymbol)> { let name = name_ref.text(); let mut query = Query::new(name.to_string()); query.exact(); query.limit(4); - self.world_symbols(query) + self.world_symbols(query, token) } fn resolve_module(&self, id: FileId, module: ast::Module) -> Vec { -- cgit v1.2.3