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.rs48
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 {
46const THREADPOOL_SIZE: usize = 8; 47const THREADPOOL_SIZE: usize = 8;
47 48
48pub fn main_loop( 49pub 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
150fn main_loop_inner( 150fn 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
504fn feedback(intrnal_mode: bool, msg: &str, sender: &Sender<RawMessage>) { 511fn 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