diff options
Diffstat (limited to 'crates/ra_lsp_server/src')
-rw-r--r-- | crates/ra_lsp_server/src/main_loop.rs | 19 |
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 | }; |
12 | use lsp_types::NumberOrString; | 12 | use lsp_types::NumberOrString; |
13 | use ra_ide_api::{Canceled, FileId, LibraryData}; | 13 | use ra_ide_api::{Canceled, FileId, LibraryData}; |
14 | use ra_vfs::VfsTask; | 14 | use ra_vfs::{VfsTask, WatcherChange}; |
15 | use rustc_hash::FxHashSet; | 15 | use rustc_hash::FxHashSet; |
16 | use serde::{de::DeserializeOwned, Serialize}; | 16 | use serde::{de::DeserializeOwned, Serialize}; |
17 | use threadpool::ThreadPool; | 17 | use 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, |