diff --git a/crates/ra_flycheck/src/lib.rs b/crates/ra_flycheck/src/lib.rs index f6f9171add..75aece45fd 100644 --- a/crates/ra_flycheck/src/lib.rs +++ b/crates/ra_flycheck/src/lib.rs @@ -24,33 +24,32 @@ pub use crate::conv::url_from_path_with_drive_lowercasing; #[derive(Clone, Debug)] pub struct CheckConfig { - pub enable: bool, pub args: Vec, pub command: String, pub all_targets: bool, } -/// CheckWatcher wraps the shared state and communication machinery used for +/// Flycheck wraps the shared state and communication machinery used for /// running `cargo check` (or other compatible command) and providing /// diagnostics based on the output. /// The spawned thread is shut down when this struct is dropped. #[derive(Debug)] -pub struct CheckWatcher { +pub struct Flycheck { // XXX: drop order is significant cmd_send: Sender, - handle: Option>, + handle: jod_thread::JoinHandle<()>, pub task_recv: Receiver, } -impl CheckWatcher { - pub fn new(config: CheckConfig, workspace_root: PathBuf) -> CheckWatcher { +impl Flycheck { + pub fn new(config: CheckConfig, workspace_root: PathBuf) -> Flycheck { let (task_send, task_recv) = unbounded::(); let (cmd_send, cmd_recv) = unbounded::(); let handle = jod_thread::spawn(move || { - let mut check = CheckWatcherThread::new(config, workspace_root); + let mut check = FlycheckThread::new(config, workspace_root); check.run(&task_send, &cmd_recv); }); - CheckWatcher { task_recv, cmd_send, handle: Some(handle) } + Flycheck { task_recv, cmd_send, handle } } /// Schedule a re-start of the cargo check worker. @@ -76,7 +75,7 @@ pub enum CheckCommand { Update, } -struct CheckWatcherThread { +struct FlycheckThread { options: CheckConfig, workspace_root: PathBuf, last_update_req: Option, @@ -90,9 +89,9 @@ struct CheckWatcherThread { check_process: Option>, } -impl CheckWatcherThread { - fn new(options: CheckConfig, workspace_root: PathBuf) -> CheckWatcherThread { - CheckWatcherThread { +impl FlycheckThread { + fn new(options: CheckConfig, workspace_root: PathBuf) -> FlycheckThread { + FlycheckThread { options, workspace_root, last_update_req: None, @@ -216,9 +215,6 @@ impl CheckWatcherThread { // First, clear and cancel the old thread self.message_recv = never(); self.check_process = None; - if !self.options.enable { - return; - } let mut args: Vec = vec![ self.options.command.clone(), diff --git a/crates/rust-analyzer/src/main_loop.rs b/crates/rust-analyzer/src/main_loop.rs index bb33fb27d5..79dc03de43 100644 --- a/crates/rust-analyzer/src/main_loop.rs +++ b/crates/rust-analyzer/src/main_loop.rs @@ -101,11 +101,14 @@ fn get_config( chaining_hints: config.inlay_hints_chaining, max_length: config.inlay_hints_max_length, }, - check: CheckConfig { - enable: config.cargo_watch_enable, - args: config.cargo_watch_args.clone(), - command: config.cargo_watch_command.clone(), - all_targets: config.cargo_watch_all_targets, + check: if config.cargo_watch_enable { + Some(CheckConfig { + args: config.cargo_watch_args.clone(), + command: config.cargo_watch_command.clone(), + all_targets: config.cargo_watch_all_targets, + }) + } else { + None }, rustfmt_args: config.rustfmt_args.clone(), vscode_lldb: config.vscode_lldb, @@ -240,7 +243,7 @@ pub fn main_loop( Err(RecvError) => return Err("vfs died".into()), }, recv(libdata_receiver) -> data => Event::Lib(data.unwrap()), - recv(world_state.check_watcher.as_ref().map_or(&never(), |it| &it.task_recv)) -> task => match task { + recv(world_state.flycheck.as_ref().map_or(&never(), |it| &it.task_recv)) -> task => match task { Ok(task) => Event::CheckWatcher(task), Err(RecvError) => return Err("check watcher died".into()), } @@ -481,8 +484,8 @@ fn loop_turn( && loop_state.in_flight_libraries == 0 { loop_state.workspace_loaded = true; - if let Some(check_watcher) = &world_state.check_watcher { - check_watcher.update(); + if let Some(flycheck) = &world_state.flycheck { + flycheck.update(); } pool.execute({ let subs = loop_state.subscriptions.subscriptions(); @@ -654,8 +657,8 @@ fn on_notification( }; let not = match notification_cast::(not) { Ok(_params) => { - if let Some(check_watcher) = &state.check_watcher { - check_watcher.update(); + if let Some(flycheck) = &state.flycheck { + flycheck.update(); } return Ok(()); } diff --git a/crates/rust-analyzer/src/world.rs b/crates/rust-analyzer/src/world.rs index acb729bae7..7814a682e1 100644 --- a/crates/rust-analyzer/src/world.rs +++ b/crates/rust-analyzer/src/world.rs @@ -11,7 +11,7 @@ use std::{ use crossbeam_channel::{unbounded, Receiver}; use lsp_types::Url; use parking_lot::RwLock; -use ra_flycheck::{url_from_path_with_drive_lowercasing, CheckConfig, CheckWatcher}; +use ra_flycheck::{url_from_path_with_drive_lowercasing, CheckConfig, Flycheck}; use ra_ide::{ Analysis, AnalysisChange, AnalysisHost, CrateGraph, FileId, InlayHintsConfig, LibraryData, SourceRootId, @@ -31,7 +31,9 @@ use crate::{ use ra_db::ExternSourceId; use rustc_hash::{FxHashMap, FxHashSet}; -fn create_watcher(workspaces: &[ProjectWorkspace], config: &Config) -> Option { +fn create_flycheck(workspaces: &[ProjectWorkspace], config: &Config) -> Option { + let check_config = config.check.as_ref()?; + // FIXME: Figure out the multi-workspace situation workspaces .iter() @@ -41,7 +43,7 @@ fn create_watcher(workspaces: &[ProjectWorkspace], config: &Config) -> Option, - pub check: CheckConfig, + pub check: Option, pub vscode_lldb: bool, pub proc_macro_srv: Option, } @@ -76,7 +78,7 @@ pub struct WorldState { pub vfs: Arc>, pub task_receiver: Receiver, pub latest_requests: Arc>, - pub check_watcher: Option, + pub flycheck: Option, pub diagnostics: DiagnosticCollection, } @@ -201,7 +203,7 @@ impl WorldState { }); change.set_crate_graph(crate_graph); - let check_watcher = create_watcher(&workspaces, &config); + let flycheck = create_flycheck(&workspaces, &config); let mut analysis_host = AnalysisHost::new(lru_capacity); analysis_host.apply_change(change); @@ -214,7 +216,7 @@ impl WorldState { vfs: Arc::new(RwLock::new(vfs)), task_receiver, latest_requests: Default::default(), - check_watcher, + flycheck, diagnostics: Default::default(), } } @@ -227,7 +229,7 @@ impl WorldState { ) { self.feature_flags = Arc::new(feature_flags); self.analysis_host.update_lru_capacity(lru_capacity); - self.check_watcher = create_watcher(&self.workspaces, &config); + self.flycheck = create_flycheck(&self.workspaces, &config); self.config = config; }