diff options
Diffstat (limited to 'crates/ra_lsp_server/src/main_loop.rs')
-rw-r--r-- | crates/ra_lsp_server/src/main_loop.rs | 19 |
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 | ||
3 | mod handlers; | 4 | mod handlers; |
4 | mod subscriptions; | 5 | mod 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(()); |