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