diff --git a/crates/ra_lsp_server/src/cargo_check.rs b/crates/ra_lsp_server/src/cargo_check.rs index fa0409ee04e..70c723b1996 100644 --- a/crates/ra_lsp_server/src/cargo_check.rs +++ b/crates/ra_lsp_server/src/cargo_check.rs @@ -39,22 +39,14 @@ pub struct CheckWatcher { impl CheckWatcher { pub fn new(options: &Options, workspace_root: PathBuf) -> CheckWatcher { - let check_enabled = options.cargo_check_enable; - let check_command = options.cargo_check_command.clone(); - let check_args = options.cargo_check_args.clone(); + let options = options.clone(); let shared = Arc::new(RwLock::new(CheckWatcherSharedState::new())); let (task_send, task_recv) = unbounded::(); let (cmd_send, cmd_recv) = unbounded::(); let shared_ = shared.clone(); let handle = std::thread::spawn(move || { - let mut check = CheckWatcherState::new( - check_enabled, - check_command, - check_args, - workspace_root, - shared_, - ); + let mut check = CheckWatcherState::new(options, workspace_root, shared_); check.run(&task_send, &cmd_recv); }); @@ -68,9 +60,7 @@ impl CheckWatcher { } pub struct CheckWatcherState { - check_enabled: bool, - check_command: Option, - check_args: Vec, + options: Options, workspace_root: PathBuf, running: bool, watcher: WatchThread, @@ -162,18 +152,13 @@ pub enum CheckCommand { impl CheckWatcherState { pub fn new( - check_enabled: bool, - check_command: Option, - check_args: Vec, + options: Options, workspace_root: PathBuf, shared: Arc>, ) -> CheckWatcherState { - let watcher = - WatchThread::new(check_enabled, check_command.as_ref(), &check_args, &workspace_root); + let watcher = WatchThread::new(&options, &workspace_root); CheckWatcherState { - check_enabled, - check_command, - check_args, + options, workspace_root, running: false, watcher, @@ -204,12 +189,7 @@ impl CheckWatcherState { self.shared.write().clear(task_send); self.watcher.cancel(); - self.watcher = WatchThread::new( - self.check_enabled, - self.check_command.as_ref(), - &self.check_args, - &self.workspace_root, - ); + self.watcher = WatchThread::new(&self.options, &self.workspace_root); } } } @@ -306,25 +286,23 @@ enum CheckEvent { } impl WatchThread { - fn new( - check_enabled: bool, - check_command: Option<&String>, - check_args: &[String], - workspace_root: &PathBuf, - ) -> WatchThread { - let check_command = check_command.cloned().unwrap_or("check".to_string()); + fn new(options: &Options, workspace_root: &PathBuf) -> WatchThread { let mut args: Vec = vec![ - check_command, + options.cargo_watch_command.clone(), "--message-format=json".to_string(), "--manifest-path".to_string(), format!("{}/Cargo.toml", workspace_root.to_string_lossy()), ]; - args.extend(check_args.iter().cloned()); + if options.cargo_watch_all_targets { + args.push("--all-targets".to_string()); + } + args.extend(options.cargo_watch_args.iter().cloned()); let (message_send, message_recv) = unbounded(); let (cancel_send, cancel_recv) = unbounded(); + let enabled = options.cargo_watch_enable; std::thread::spawn(move || { - if !check_enabled { + if !enabled { return; } diff --git a/crates/ra_lsp_server/src/config.rs b/crates/ra_lsp_server/src/config.rs index 621f2238c51..2d7948d74ae 100644 --- a/crates/ra_lsp_server/src/config.rs +++ b/crates/ra_lsp_server/src/config.rs @@ -32,9 +32,10 @@ pub struct ServerConfig { pub max_inlay_hint_length: Option, - pub cargo_check_enable: bool, - pub cargo_check_command: Option, - pub cargo_check_args: Vec, + pub cargo_watch_enable: bool, + pub cargo_watch_args: Vec, + pub cargo_watch_command: String, + pub cargo_watch_all_targets: bool, /// For internal usage to make integrated tests faster. #[serde(deserialize_with = "nullable_bool_true")] @@ -55,9 +56,10 @@ impl Default for ServerConfig { use_client_watching: false, lru_capacity: None, max_inlay_hint_length: None, - cargo_check_enable: true, - cargo_check_command: None, - cargo_check_args: vec![], + cargo_watch_enable: true, + cargo_watch_args: Vec::new(), + cargo_watch_command: "check".to_string(), + cargo_watch_all_targets: true, with_sysroot: true, feature_flags: FxHashMap::default(), cargo_features: Default::default(), diff --git a/crates/ra_lsp_server/src/main_loop.rs b/crates/ra_lsp_server/src/main_loop.rs index 045e4660ddd..c58af7e473f 100644 --- a/crates/ra_lsp_server/src/main_loop.rs +++ b/crates/ra_lsp_server/src/main_loop.rs @@ -127,9 +127,10 @@ pub fn main_loop( .and_then(|it| it.line_folding_only) .unwrap_or(false), max_inlay_hint_length: config.max_inlay_hint_length, - cargo_check_enable: config.cargo_check_enable, - cargo_check_command: config.cargo_check_command, - cargo_check_args: config.cargo_check_args, + cargo_watch_enable: config.cargo_watch_enable, + cargo_watch_args: config.cargo_watch_args, + cargo_watch_command: config.cargo_watch_command, + cargo_watch_all_targets: config.cargo_watch_all_targets, } }; diff --git a/crates/ra_lsp_server/src/world.rs b/crates/ra_lsp_server/src/world.rs index 47c3823fb18..39a07c01aca 100644 --- a/crates/ra_lsp_server/src/world.rs +++ b/crates/ra_lsp_server/src/world.rs @@ -35,9 +35,10 @@ pub struct Options { pub supports_location_link: bool, pub line_folding_only: bool, pub max_inlay_hint_length: Option, - pub cargo_check_enable: bool, - pub cargo_check_command: Option, - pub cargo_check_args: Vec, + pub cargo_watch_enable: bool, + pub cargo_watch_args: Vec, + pub cargo_watch_command: String, + pub cargo_watch_all_targets: bool, } /// `WorldState` is the primary mutable state of the language server diff --git a/editors/code/package.json b/editors/code/package.json index 5f4123397b2..69298e91785 100644 --- a/editors/code/package.json +++ b/editors/code/package.json @@ -188,11 +188,6 @@ "default": "ra_lsp_server", "description": "Path to ra_lsp_server executable" }, - "rust-analyzer.enableCargoCheck": { - "type": "boolean", - "default": true, - "description": "Run `cargo check` for diagnostics on save" - }, "rust-analyzer.excludeGlobs": { "type": "array", "default": [], @@ -203,16 +198,26 @@ "default": true, "description": "client provided file watching instead of notify watching." }, - "rust-analyzer.cargo-check.arguments": { + "rust-analyzer.cargo-watch.enable": { + "type": "boolean", + "default": true, + "description": "Run `cargo check` for diagnostics on save" + }, + "rust-analyzer.cargo-watch.arguments": { "type": "array", - "description": "`cargo-check` arguments. (e.g: `--features=\"shumway,pdf\"` will run as `cargo check --features=\"shumway,pdf\"` )", + "description": "`cargo-watch` arguments. (e.g: `--features=\"shumway,pdf\"` will run as `cargo watch -x \"check --features=\"shumway,pdf\"\"` )", "default": [] }, - "rust-analyzer.cargo-check.command": { + "rust-analyzer.cargo-watch.command": { "type": "string", - "description": "`cargo-check` command. (e.g: `clippy` will run as `cargo clippy` )", + "description": "`cargo-watch` command. (e.g: `clippy` will run as `cargo watch -x clippy` )", "default": "check" }, + "rust-analyzer.cargo-watch.allTargets": { + "type": "boolean", + "description": "Check all targets and tests (will be passed as `--all-targets`)", + "default": true + }, "rust-analyzer.trace.server": { "type": "string", "scope": "window", @@ -229,17 +234,6 @@ "default": "off", "description": "Trace requests to the ra_lsp_server" }, - "rust-analyzer.trace.cargo-watch": { - "type": "string", - "scope": "window", - "enum": [ - "off", - "error", - "verbose" - ], - "default": "off", - "description": "Trace output of cargo-watch" - }, "rust-analyzer.lruCapacity": { "type": "number", "default": null, diff --git a/editors/code/src/config.ts b/editors/code/src/config.ts index 96532e2c9d5..4b388b80c54 100644 --- a/editors/code/src/config.ts +++ b/editors/code/src/config.ts @@ -4,10 +4,11 @@ import { Server } from './server'; const RA_LSP_DEBUG = process.env.__RA_LSP_SERVER_DEBUG; -export interface CargoCheckOptions { - enabled: boolean; +export interface CargoWatchOptions { + enable: boolean; arguments: string[]; - command: null | string; + command: string; + allTargets: boolean; } export interface CargoFeatures { @@ -29,10 +30,11 @@ export class Config { public featureFlags = {}; // for internal use public withSysroot: null | boolean = null; - public cargoCheckOptions: CargoCheckOptions = { - enabled: true, + public cargoWatchOptions: CargoWatchOptions = { + enable: true, arguments: [], - command: null, + command: '', + allTargets: true, }; public cargoFeatures: CargoFeatures = { noDefaultFeatures: false, @@ -91,27 +93,34 @@ export class Config { RA_LSP_DEBUG || (config.get('raLspServerPath') as string); } - if (config.has('enableCargoCheck')) { - this.cargoCheckOptions.enabled = config.get( - 'enableCargoCheck', + if (config.has('cargo-watch.enable')) { + this.cargoWatchOptions.enable = config.get( + 'cargo-watch.enable', true, ); } if (config.has('cargo-watch.arguments')) { - this.cargoCheckOptions.arguments = config.get( + this.cargoWatchOptions.arguments = config.get( 'cargo-watch.arguments', [], ); } if (config.has('cargo-watch.command')) { - this.cargoCheckOptions.command = config.get( + this.cargoWatchOptions.command = config.get( 'cargo-watch.command', '', ); } + if (config.has('cargo-watch.allTargets')) { + this.cargoWatchOptions.allTargets = config.get( + 'cargo-watch.allTargets', + true, + ); + } + if (config.has('lruCapacity')) { this.lruCapacity = config.get('lruCapacity') as number; } diff --git a/editors/code/src/extension.ts b/editors/code/src/extension.ts index 36163b6bb61..1da10ebd06f 100644 --- a/editors/code/src/extension.ts +++ b/editors/code/src/extension.ts @@ -85,7 +85,7 @@ export async function activate(context: vscode.ExtensionContext) { } const watchStatus = new StatusDisplay( - Server.config.cargoCheckOptions.command || 'check', + Server.config.cargoWatchOptions.command, ); disposeOnDeactivation(watchStatus); diff --git a/editors/code/src/server.ts b/editors/code/src/server.ts index 409d3b4b738..ae81af84835 100644 --- a/editors/code/src/server.ts +++ b/editors/code/src/server.ts @@ -55,9 +55,11 @@ export class Server { publishDecorations: true, lruCapacity: Server.config.lruCapacity, maxInlayHintLength: Server.config.maxInlayHintLength, - cargoCheckEnable: Server.config.cargoCheckOptions.enabled, - cargoCheckCommand: Server.config.cargoCheckOptions.command, - cargoCheckArgs: Server.config.cargoCheckOptions.arguments, + cargoWatchEnable: Server.config.cargoWatchOptions.enable, + cargoWatchArgumets: Server.config.cargoWatchOptions.arguments, + cargoWatchCommand: Server.config.cargoWatchOptions.command, + cargoWatchAllTargets: + Server.config.cargoWatchOptions.allTargets, excludeGlobs: Server.config.excludeGlobs, useClientWatching: Server.config.useClientWatching, featureFlags: Server.config.featureFlags,