From d999f4b56803b613dcf354862e1db4b5d2a8a8d0 Mon Sep 17 00:00:00 2001 From: Aleksey Kladov <aleksey.kladov@gmail.com> Date: Fri, 31 Aug 2018 12:04:33 +0300 Subject: cancelation --- crates/libanalysis/src/imp.rs | 11 +++++++---- crates/libanalysis/src/job.rs | 4 ++-- crates/libanalysis/src/lib.rs | 8 ++++---- 3 files changed, 13 insertions(+), 10 deletions(-) (limited to 'crates/libanalysis') 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::<ast::NameRef>(syntax, offset) { - return self.index_resolve(name_ref); + return self.index_resolve(name_ref, token); } if let Some(name) = find_node_at_offset::<ast::Name>(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<FileId> { diff --git a/crates/libanalysis/src/job.rs b/crates/libanalysis/src/job.rs index 4d393b915..ea1652a26 100644 --- a/crates/libanalysis/src/job.rs +++ b/crates/libanalysis/src/job.rs @@ -18,8 +18,8 @@ impl JobHandle { let handle = JobHandle { job_alive: receiver_alive, _job_canceled: sender_canceled }; (handle, token) } - pub fn is_alive(&self) -> bool { - !is_closed(&self.job_alive) + pub fn has_completed(&self) -> bool { + is_closed(&self.job_alive) } pub fn cancel(self) { } diff --git a/crates/libanalysis/src/lib.rs b/crates/libanalysis/src/lib.rs index 20ddb69d6..a59fd1c09 100644 --- a/crates/libanalysis/src/lib.rs +++ b/crates/libanalysis/src/lib.rs @@ -159,11 +159,11 @@ impl Analysis { let file = self.file_syntax(file_id); libeditor::file_structure(&file) } - pub fn symbol_search(&self, query: Query) -> Vec<(FileId, FileSymbol)> { - self.imp.world_symbols(query) + pub fn symbol_search(&self, query: Query, token: &JobToken) -> Vec<(FileId, FileSymbol)> { + self.imp.world_symbols(query, token) } - pub fn approximately_resolve_symbol(&self, file_id: FileId, offset: TextUnit) -> Vec<(FileId, FileSymbol)> { - self.imp.approximately_resolve_symbol(file_id, offset) + pub fn approximately_resolve_symbol(&self, file_id: FileId, offset: TextUnit, token: &JobToken) -> Vec<(FileId, FileSymbol)> { + self.imp.approximately_resolve_symbol(file_id, offset, token) } pub fn parent_module(&self, file_id: FileId) -> Vec<(FileId, FileSymbol)> { self.imp.parent_module(file_id) -- cgit v1.2.3