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, 12 insertions, 7 deletions
diff --git a/crates/ra_lsp_server/src/main_loop.rs b/crates/ra_lsp_server/src/main_loop.rs
index 83845f1e0..dda318e43 100644
--- a/crates/ra_lsp_server/src/main_loop.rs
+++ b/crates/ra_lsp_server/src/main_loop.rs
@@ -1,4 +1,5 @@
1//! FIXME: write short doc here 1//! The main loop of `ra_lsp_server` responsible for dispatching LSP requests/replies and
2//! notifications back to the client.
2 3
3mod handlers; 4mod handlers;
4mod subscriptions; 5mod subscriptions;
@@ -67,6 +68,7 @@ pub fn main_loop(
67 let workspace = ra_project_model::ProjectWorkspace::discover_with_sysroot( 68 let workspace = ra_project_model::ProjectWorkspace::discover_with_sysroot(
68 ws_root.as_path(), 69 ws_root.as_path(),
69 config.with_sysroot, 70 config.with_sysroot,
71 &config.cargo_features,
70 ); 72 );
71 match workspace { 73 match workspace {
72 Ok(workspace) => loaded_workspaces.push(workspace), 74 Ok(workspace) => loaded_workspaces.push(workspace),
@@ -130,7 +132,7 @@ pub fn main_loop(
130 let feature_flags = { 132 let feature_flags = {
131 let mut ff = FeatureFlags::default(); 133 let mut ff = FeatureFlags::default();
132 for (flag, value) in config.feature_flags { 134 for (flag, value) in config.feature_flags {
133 if let Err(_) = ff.set(flag.as_str(), value) { 135 if ff.set(flag.as_str(), value).is_err() {
134 log::error!("unknown feature flag: {:?}", flag); 136 log::error!("unknown feature flag: {:?}", flag);
135 show_message( 137 show_message(
136 req::MessageType::Error, 138 req::MessageType::Error,
@@ -303,7 +305,6 @@ fn loop_turn(
303 log::info!("queued count = {}", queue_count); 305 log::info!("queued count = {}", queue_count);
304 } 306 }
305 307
306 let mut state_changed = false;
307 match event { 308 match event {
308 Event::Task(task) => { 309 Event::Task(task) => {
309 on_task(task, &connection.sender, &mut loop_state.pending_requests, world_state); 310 on_task(task, &connection.sender, &mut loop_state.pending_requests, world_state);
@@ -311,7 +312,6 @@ fn loop_turn(
311 } 312 }
312 Event::Vfs(task) => { 313 Event::Vfs(task) => {
313 world_state.vfs.write().handle_task(task); 314 world_state.vfs.write().handle_task(task);
314 state_changed = true;
315 } 315 }
316 Event::Lib(lib) => { 316 Event::Lib(lib) => {
317 world_state.add_lib(lib); 317 world_state.add_lib(lib);
@@ -336,7 +336,6 @@ fn loop_turn(
336 &mut loop_state.subscriptions, 336 &mut loop_state.subscriptions,
337 not, 337 not,
338 )?; 338 )?;
339 state_changed = true;
340 } 339 }
341 Message::Response(resp) => { 340 Message::Response(resp) => {
342 let removed = loop_state.pending_responses.remove(&resp.id); 341 let removed = loop_state.pending_responses.remove(&resp.id);
@@ -347,7 +346,12 @@ fn loop_turn(
347 }, 346 },
348 }; 347 };
349 348
350 loop_state.pending_libraries.extend(world_state.process_changes()); 349 let mut state_changed = false;
350 if let Some(changes) = world_state.process_changes() {
351 state_changed = true;
352 loop_state.pending_libraries.extend(changes);
353 }
354
351 while loop_state.in_flight_libraries < MAX_IN_FLIGHT_LIBS 355 while loop_state.in_flight_libraries < MAX_IN_FLIGHT_LIBS
352 && !loop_state.pending_libraries.is_empty() 356 && !loop_state.pending_libraries.is_empty()
353 { 357 {
@@ -520,7 +524,8 @@ fn on_notification(
520 if let Some(file_id) = state.vfs.write().remove_file_overlay(path.as_path()) { 524 if let Some(file_id) = state.vfs.write().remove_file_overlay(path.as_path()) {
521 subs.remove_sub(FileId(file_id.0)); 525 subs.remove_sub(FileId(file_id.0));
522 } 526 }
523 let params = req::PublishDiagnosticsParams { uri, diagnostics: Vec::new() }; 527 let params =
528 req::PublishDiagnosticsParams { uri, diagnostics: Vec::new(), version: None };
524 let not = notification_new::<req::PublishDiagnostics>(params); 529 let not = notification_new::<req::PublishDiagnostics>(params);
525 msg_sender.send(not.into()).unwrap(); 530 msg_sender.send(not.into()).unwrap();
526 return Ok(()); 531 return Ok(());