aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_lsp_server/src/main_loop.rs
diff options
context:
space:
mode:
Diffstat (limited to 'crates/ra_lsp_server/src/main_loop.rs')
-rw-r--r--crates/ra_lsp_server/src/main_loop.rs19
1 files changed, 16 insertions, 3 deletions
diff --git a/crates/ra_lsp_server/src/main_loop.rs b/crates/ra_lsp_server/src/main_loop.rs
index ddd20a41f..e5a0603d1 100644
--- a/crates/ra_lsp_server/src/main_loop.rs
+++ b/crates/ra_lsp_server/src/main_loop.rs
@@ -11,7 +11,7 @@ use gen_lsp_server::{
11}; 11};
12use lsp_types::NumberOrString; 12use lsp_types::NumberOrString;
13use ra_ide_api::{Canceled, FileId, LibraryData}; 13use ra_ide_api::{Canceled, FileId, LibraryData};
14use ra_vfs::VfsTask; 14use ra_vfs::{VfsTask, WatcherChange};
15use rustc_hash::FxHashSet; 15use rustc_hash::FxHashSet;
16use serde::{de::DeserializeOwned, Serialize}; 16use serde::{de::DeserializeOwned, Serialize};
17use threadpool::ThreadPool; 17use threadpool::ThreadPool;
@@ -113,6 +113,7 @@ enum Event {
113 Msg(RawMessage), 113 Msg(RawMessage),
114 Task(Task), 114 Task(Task),
115 Vfs(VfsTask), 115 Vfs(VfsTask),
116 Watcher(WatcherChange),
116 Lib(LibraryData), 117 Lib(LibraryData),
117} 118}
118 119
@@ -149,6 +150,7 @@ impl fmt::Debug for Event {
149 Event::Task(it) => fmt::Debug::fmt(it, f), 150 Event::Task(it) => fmt::Debug::fmt(it, f),
150 Event::Vfs(it) => fmt::Debug::fmt(it, f), 151 Event::Vfs(it) => fmt::Debug::fmt(it, f),
151 Event::Lib(it) => fmt::Debug::fmt(it, f), 152 Event::Lib(it) => fmt::Debug::fmt(it, f),
153 Event::Watcher(it) => fmt::Debug::fmt(it, f),
152 } 154 }
153 } 155 }
154} 156}
@@ -183,6 +185,10 @@ fn main_loop_inner(
183 Ok(task) => Event::Vfs(task), 185 Ok(task) => Event::Vfs(task),
184 Err(RecvError) => bail!("vfs died"), 186 Err(RecvError) => bail!("vfs died"),
185 }, 187 },
188 recv(state.vfs.read().change_receiver()) -> change => match change {
189 Ok(change) => Event::Watcher(change),
190 Err(RecvError) => bail!("vfs watcher died"),
191 },
186 recv(libdata_receiver) -> data => Event::Lib(data.unwrap()) 192 recv(libdata_receiver) -> data => Event::Lib(data.unwrap())
187 }; 193 };
188 log::info!("loop_turn = {:?}", event); 194 log::info!("loop_turn = {:?}", event);
@@ -194,6 +200,10 @@ fn main_loop_inner(
194 state.vfs.write().handle_task(task); 200 state.vfs.write().handle_task(task);
195 state_changed = true; 201 state_changed = true;
196 } 202 }
203 Event::Watcher(change) => {
204 state.vfs.write().handle_change(change);
205 state_changed = true;
206 }
197 Event::Lib(lib) => { 207 Event::Lib(lib) => {
198 feedback(internal_mode, "library loaded", msg_sender); 208 feedback(internal_mode, "library loaded", msg_sender);
199 state.add_lib(lib); 209 state.add_lib(lib);
@@ -365,7 +375,7 @@ fn on_notification(
365 if let Some(file_id) = state 375 if let Some(file_id) = state
366 .vfs 376 .vfs
367 .write() 377 .write()
368 .add_file_overlay(&path, params.text_document.text) 378 .add_file_overlay(&path, Some(params.text_document.text))
369 { 379 {
370 subs.add_sub(FileId(file_id.0.into())); 380 subs.add_sub(FileId(file_id.0.into()));
371 } 381 }
@@ -384,7 +394,10 @@ fn on_notification(
384 .pop() 394 .pop()
385 .ok_or_else(|| format_err!("empty changes"))? 395 .ok_or_else(|| format_err!("empty changes"))?
386 .text; 396 .text;
387 state.vfs.write().change_file_overlay(path.as_path(), text); 397 state
398 .vfs
399 .write()
400 .change_file_overlay(path.as_path(), Some(text));
388 return Ok(()); 401 return Ok(());
389 } 402 }
390 Err(not) => not, 403 Err(not) => not,