diff --git a/crates/ra_cargo_watch/src/lib.rs b/crates/ra_cargo_watch/src/lib.rs index 9bc0fd405db..cb0856aa43e 100644 --- a/crates/ra_cargo_watch/src/lib.rs +++ b/crates/ra_cargo_watch/src/lib.rs @@ -58,6 +58,12 @@ impl CheckWatcher { CheckWatcher { task_recv, cmd_send: Some(cmd_send), handle: Some(handle), shared } } + /// Returns a CheckWatcher that doesn't actually do anything + pub fn dummy() -> CheckWatcher { + let shared = Arc::new(RwLock::new(CheckWatcherSharedState::new())); + CheckWatcher { task_recv: never(), cmd_send: None, handle: None, shared } + } + /// Schedule a re-start of the cargo check worker. pub fn update(&self) { if let Some(cmd_send) = &self.cmd_send { diff --git a/crates/ra_lsp_server/src/world.rs b/crates/ra_lsp_server/src/world.rs index cea18937f28..a52bd263366 100644 --- a/crates/ra_lsp_server/src/world.rs +++ b/crates/ra_lsp_server/src/world.rs @@ -132,20 +132,20 @@ impl WorldState { change.set_crate_graph(crate_graph); // FIXME: Figure out the multi-workspace situation - let check_watcher = { - let first_workspace = workspaces.first().unwrap(); - let cargo_project_root = match first_workspace { - ProjectWorkspace::Cargo { cargo, .. } => cargo.workspace_root().to_path_buf(), - ProjectWorkspace::Json { .. } => { - log::warn!( - "Cargo check watching only supported for cargo workspaces, disabling" - ); - options.cargo_watch.enable = false; - PathBuf::new() - } - }; - CheckWatcher::new(&options.cargo_watch, cargo_project_root) - }; + let check_watcher = workspaces + .iter() + .find_map(|w| match w { + ProjectWorkspace::Cargo { cargo, .. } => Some(cargo), + ProjectWorkspace::Json { .. } => None, + }) + .map(|cargo| { + let cargo_project_root = cargo.workspace_root().to_path_buf(); + CheckWatcher::new(&options.cargo_watch, cargo_project_root) + }) + .unwrap_or_else(|| { + log::warn!("Cargo check watching only supported for cargo workspaces, disabling"); + CheckWatcher::dummy() + }); let mut analysis_host = AnalysisHost::new(lru_capacity, feature_flags); analysis_host.apply_change(change);