From 1d5eaefe8a8e4f8b267d51ee8ece866741586ada Mon Sep 17 00:00:00 2001 From: Bernardo Date: Sun, 6 Jan 2019 15:05:12 +0100 Subject: initial Watcher impl --- crates/ra_lsp_server/src/main_loop.rs | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) (limited to 'crates/ra_lsp_server/src') 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::{ }; use lsp_types::NumberOrString; use ra_ide_api::{Canceled, FileId, LibraryData}; -use ra_vfs::VfsTask; +use ra_vfs::{VfsTask, WatcherChange}; use rustc_hash::FxHashSet; use serde::{de::DeserializeOwned, Serialize}; use threadpool::ThreadPool; @@ -113,6 +113,7 @@ enum Event { Msg(RawMessage), Task(Task), Vfs(VfsTask), + Watcher(WatcherChange), Lib(LibraryData), } @@ -149,6 +150,7 @@ impl fmt::Debug for Event { Event::Task(it) => fmt::Debug::fmt(it, f), Event::Vfs(it) => fmt::Debug::fmt(it, f), Event::Lib(it) => fmt::Debug::fmt(it, f), + Event::Watcher(it) => fmt::Debug::fmt(it, f), } } } @@ -183,6 +185,10 @@ fn main_loop_inner( Ok(task) => Event::Vfs(task), Err(RecvError) => bail!("vfs died"), }, + recv(state.vfs.read().change_receiver()) -> change => match change { + Ok(change) => Event::Watcher(change), + Err(RecvError) => bail!("vfs watcher died"), + }, recv(libdata_receiver) -> data => Event::Lib(data.unwrap()) }; log::info!("loop_turn = {:?}", event); @@ -194,6 +200,10 @@ fn main_loop_inner( state.vfs.write().handle_task(task); state_changed = true; } + Event::Watcher(change) => { + state.vfs.write().handle_change(change); + state_changed = true; + } Event::Lib(lib) => { feedback(internal_mode, "library loaded", msg_sender); state.add_lib(lib); @@ -365,7 +375,7 @@ fn on_notification( if let Some(file_id) = state .vfs .write() - .add_file_overlay(&path, params.text_document.text) + .add_file_overlay(&path, Some(params.text_document.text)) { subs.add_sub(FileId(file_id.0.into())); } @@ -384,7 +394,10 @@ fn on_notification( .pop() .ok_or_else(|| format_err!("empty changes"))? .text; - state.vfs.write().change_file_overlay(path.as_path(), text); + state + .vfs + .write() + .change_file_overlay(path.as_path(), Some(text)); return Ok(()); } Err(not) => not, -- cgit v1.2.3