diff options
Diffstat (limited to 'crates/ra_lsp_server/src/main_loop.rs')
-rw-r--r-- | crates/ra_lsp_server/src/main_loop.rs | 48 |
1 files changed, 28 insertions, 20 deletions
diff --git a/crates/ra_lsp_server/src/main_loop.rs b/crates/ra_lsp_server/src/main_loop.rs index 0f8ef10b9..d0c2a95ef 100644 --- a/crates/ra_lsp_server/src/main_loop.rs +++ b/crates/ra_lsp_server/src/main_loop.rs | |||
@@ -22,6 +22,7 @@ use crate::{ | |||
22 | req, | 22 | req, |
23 | server_world::{ServerWorld, ServerWorldState}, | 23 | server_world::{ServerWorld, ServerWorldState}, |
24 | Result, | 24 | Result, |
25 | InitializationOptions, | ||
25 | }; | 26 | }; |
26 | 27 | ||
27 | #[derive(Debug, Fail)] | 28 | #[derive(Debug, Fail)] |
@@ -46,9 +47,8 @@ enum Task { | |||
46 | const THREADPOOL_SIZE: usize = 8; | 47 | const THREADPOOL_SIZE: usize = 8; |
47 | 48 | ||
48 | pub fn main_loop( | 49 | pub fn main_loop( |
49 | internal_mode: bool, | ||
50 | ws_root: PathBuf, | 50 | ws_root: PathBuf, |
51 | supports_decorations: bool, | 51 | options: InitializationOptions, |
52 | msg_receiver: &Receiver<RawMessage>, | 52 | msg_receiver: &Receiver<RawMessage>, |
53 | msg_sender: &Sender<RawMessage>, | 53 | msg_sender: &Sender<RawMessage>, |
54 | ) -> Result<()> { | 54 | ) -> Result<()> { |
@@ -63,11 +63,12 @@ pub fn main_loop( | |||
63 | Ok(ws) => vec![ws], | 63 | Ok(ws) => vec![ws], |
64 | Err(e) => { | 64 | Err(e) => { |
65 | log::error!("loading workspace failed: {}", e); | 65 | log::error!("loading workspace failed: {}", e); |
66 | let msg = RawNotification::new::<req::ShowMessage>(&req::ShowMessageParams { | 66 | |
67 | typ: req::MessageType::Error, | 67 | show_message( |
68 | message: format!("rust-analyzer failed to load workspace: {}", e), | 68 | req::MessageType::Error, |
69 | }); | 69 | format!("rust-analyzer failed to load workspace: {}", e), |
70 | msg_sender.send(msg.into()).unwrap(); | 70 | msg_sender, |
71 | ); | ||
71 | Vec::new() | 72 | Vec::new() |
72 | } | 73 | } |
73 | } | 74 | } |
@@ -80,8 +81,7 @@ pub fn main_loop( | |||
80 | let mut pending_requests = FxHashSet::default(); | 81 | let mut pending_requests = FxHashSet::default(); |
81 | let mut subs = Subscriptions::new(); | 82 | let mut subs = Subscriptions::new(); |
82 | let main_res = main_loop_inner( | 83 | let main_res = main_loop_inner( |
83 | internal_mode, | 84 | options, |
84 | supports_decorations, | ||
85 | &pool, | 85 | &pool, |
86 | msg_sender, | 86 | msg_sender, |
87 | msg_receiver, | 87 | msg_receiver, |
@@ -148,8 +148,7 @@ impl fmt::Debug for Event { | |||
148 | } | 148 | } |
149 | 149 | ||
150 | fn main_loop_inner( | 150 | fn main_loop_inner( |
151 | internal_mode: bool, | 151 | options: InitializationOptions, |
152 | supports_decorations: bool, | ||
153 | pool: &ThreadPool, | 152 | pool: &ThreadPool, |
154 | msg_sender: &Sender<RawMessage>, | 153 | msg_sender: &Sender<RawMessage>, |
155 | msg_receiver: &Receiver<RawMessage>, | 154 | msg_receiver: &Receiver<RawMessage>, |
@@ -163,6 +162,7 @@ fn main_loop_inner( | |||
163 | // time to always have a thread ready to react to input. | 162 | // time to always have a thread ready to react to input. |
164 | let mut in_flight_libraries = 0; | 163 | let mut in_flight_libraries = 0; |
165 | let mut pending_libraries = Vec::new(); | 164 | let mut pending_libraries = Vec::new(); |
165 | let mut send_workspace_notification = true; | ||
166 | 166 | ||
167 | let (libdata_sender, libdata_receiver) = unbounded(); | 167 | let (libdata_sender, libdata_receiver) = unbounded(); |
168 | loop { | 168 | loop { |
@@ -190,7 +190,6 @@ fn main_loop_inner( | |||
190 | state_changed = true; | 190 | state_changed = true; |
191 | } | 191 | } |
192 | Event::Lib(lib) => { | 192 | Event::Lib(lib) => { |
193 | feedback(internal_mode, "library loaded", msg_sender); | ||
194 | state.add_lib(lib); | 193 | state.add_lib(lib); |
195 | in_flight_libraries -= 1; | 194 | in_flight_libraries -= 1; |
196 | } | 195 | } |
@@ -244,15 +243,23 @@ fn main_loop_inner( | |||
244 | }); | 243 | }); |
245 | } | 244 | } |
246 | 245 | ||
247 | if state.roots_to_scan == 0 && pending_libraries.is_empty() && in_flight_libraries == 0 { | 246 | if send_workspace_notification |
248 | feedback(internal_mode, "workspace loaded", msg_sender); | 247 | && state.roots_to_scan == 0 |
248 | && pending_libraries.is_empty() | ||
249 | && in_flight_libraries == 0 | ||
250 | { | ||
251 | if options.show_workspace_loaded { | ||
252 | show_message(req::MessageType::Info, "workspace loaded", msg_sender); | ||
253 | } | ||
254 | // Only send the notification first time | ||
255 | send_workspace_notification = false; | ||
249 | } | 256 | } |
250 | 257 | ||
251 | if state_changed { | 258 | if state_changed { |
252 | update_file_notifications_on_threadpool( | 259 | update_file_notifications_on_threadpool( |
253 | pool, | 260 | pool, |
254 | state.snapshot(), | 261 | state.snapshot(), |
255 | supports_decorations, | 262 | options.publish_decorations, |
256 | task_sender.clone(), | 263 | task_sender.clone(), |
257 | subs.subscriptions(), | 264 | subs.subscriptions(), |
258 | ) | 265 | ) |
@@ -501,11 +508,12 @@ fn update_file_notifications_on_threadpool( | |||
501 | }); | 508 | }); |
502 | } | 509 | } |
503 | 510 | ||
504 | fn feedback(intrnal_mode: bool, msg: &str, sender: &Sender<RawMessage>) { | 511 | fn show_message<M: Into<String>>(typ: req::MessageType, msg: M, sender: &Sender<RawMessage>) { |
505 | if !intrnal_mode { | 512 | let not = RawNotification::new::<req::ShowMessage>(&req::ShowMessageParams { |
506 | return; | 513 | typ, |
507 | } | 514 | message: msg.into(), |
508 | let not = RawNotification::new::<req::InternalFeedback>(&msg.to_string()); | 515 | }); |
516 | |||
509 | sender.send(not.into()).unwrap(); | 517 | sender.send(not.into()).unwrap(); |
510 | } | 518 | } |
511 | 519 | ||