aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_lsp_server/src/cargo_check.rs
diff options
context:
space:
mode:
Diffstat (limited to 'crates/ra_lsp_server/src/cargo_check.rs')
-rw-r--r--crates/ra_lsp_server/src/cargo_check.rs50
1 files changed, 41 insertions, 9 deletions
diff --git a/crates/ra_lsp_server/src/cargo_check.rs b/crates/ra_lsp_server/src/cargo_check.rs
index d5ff02154..f98b4f69c 100644
--- a/crates/ra_lsp_server/src/cargo_check.rs
+++ b/crates/ra_lsp_server/src/cargo_check.rs
@@ -1,3 +1,4 @@
1use crate::world::Options;
1use cargo_metadata::{ 2use cargo_metadata::{
2 diagnostic::{ 3 diagnostic::{
3 Applicability, Diagnostic as RustDiagnostic, DiagnosticLevel, DiagnosticSpan, 4 Applicability, Diagnostic as RustDiagnostic, DiagnosticLevel, DiagnosticSpan,
@@ -30,14 +31,17 @@ pub struct CheckWatcher {
30} 31}
31 32
32impl CheckWatcher { 33impl CheckWatcher {
33 pub fn new(workspace_root: PathBuf) -> CheckWatcher { 34 pub fn new(options: &Options, workspace_root: PathBuf) -> CheckWatcher {
35 let check_command = options.cargo_check_command.clone();
36 let check_args = options.cargo_check_args.clone();
34 let shared = Arc::new(RwLock::new(CheckWatcherSharedState::new())); 37 let shared = Arc::new(RwLock::new(CheckWatcherSharedState::new()));
35 38
36 let (task_send, task_recv) = unbounded::<CheckTask>(); 39 let (task_send, task_recv) = unbounded::<CheckTask>();
37 let (cmd_send, cmd_recv) = unbounded::<CheckCommand>(); 40 let (cmd_send, cmd_recv) = unbounded::<CheckCommand>();
38 let shared_ = shared.clone(); 41 let shared_ = shared.clone();
39 let handle = std::thread::spawn(move || { 42 let handle = std::thread::spawn(move || {
40 let mut check = CheckWatcherState::new(shared_, workspace_root); 43 let mut check =
44 CheckWatcherState::new(check_command, check_args, workspace_root, shared_);
41 check.run(&task_send, &cmd_recv); 45 check.run(&task_send, &cmd_recv);
42 }); 46 });
43 47
@@ -50,6 +54,8 @@ impl CheckWatcher {
50} 54}
51 55
52pub struct CheckWatcherState { 56pub struct CheckWatcherState {
57 check_command: Option<String>,
58 check_args: Vec<String>,
53 workspace_root: PathBuf, 59 workspace_root: PathBuf,
54 running: bool, 60 running: bool,
55 watcher: WatchThread, 61 watcher: WatchThread,
@@ -134,11 +140,21 @@ pub enum CheckCommand {
134 140
135impl CheckWatcherState { 141impl CheckWatcherState {
136 pub fn new( 142 pub fn new(
137 shared: Arc<RwLock<CheckWatcherSharedState>>, 143 check_command: Option<String>,
144 check_args: Vec<String>,
138 workspace_root: PathBuf, 145 workspace_root: PathBuf,
146 shared: Arc<RwLock<CheckWatcherSharedState>>,
139 ) -> CheckWatcherState { 147 ) -> CheckWatcherState {
140 let watcher = WatchThread::new(&workspace_root); 148 let watcher = WatchThread::new(check_command.as_ref(), &check_args, &workspace_root);
141 CheckWatcherState { workspace_root, running: false, watcher, last_update_req: None, shared } 149 CheckWatcherState {
150 check_command,
151 check_args,
152 workspace_root,
153 running: false,
154 watcher,
155 last_update_req: None,
156 shared,
157 }
142 } 158 }
143 159
144 pub fn run(&mut self, task_send: &Sender<CheckTask>, cmd_recv: &Receiver<CheckCommand>) { 160 pub fn run(&mut self, task_send: &Sender<CheckTask>, cmd_recv: &Receiver<CheckCommand>) {
@@ -163,7 +179,11 @@ impl CheckWatcherState {
163 self.shared.write().clear(task_send); 179 self.shared.write().clear(task_send);
164 180
165 self.watcher.cancel(); 181 self.watcher.cancel();
166 self.watcher = WatchThread::new(&self.workspace_root); 182 self.watcher = WatchThread::new(
183 self.check_command.as_ref(),
184 &self.check_args,
185 &self.workspace_root,
186 );
167 } 187 }
168 } 188 }
169 } 189 }
@@ -229,13 +249,25 @@ struct WatchThread {
229} 249}
230 250
231impl WatchThread { 251impl WatchThread {
232 fn new(workspace_root: &PathBuf) -> WatchThread { 252 fn new(
233 let manifest_path = format!("{}/Cargo.toml", workspace_root.to_string_lossy()); 253 check_command: Option<&String>,
254 check_args: &[String],
255 workspace_root: &PathBuf,
256 ) -> WatchThread {
257 let check_command = check_command.cloned().unwrap_or("check".to_string());
258 let mut args: Vec<String> = vec![
259 check_command,
260 "--message-format=json".to_string(),
261 "--manifest-path".to_string(),
262 format!("{}/Cargo.toml", workspace_root.to_string_lossy()),
263 ];
264 args.extend(check_args.iter().cloned());
265
234 let (message_send, message_recv) = unbounded(); 266 let (message_send, message_recv) = unbounded();
235 let (cancel_send, cancel_recv) = unbounded(); 267 let (cancel_send, cancel_recv) = unbounded();
236 std::thread::spawn(move || { 268 std::thread::spawn(move || {
237 let mut command = Command::new("cargo") 269 let mut command = Command::new("cargo")
238 .args(&["check", "--message-format=json", "--manifest-path", &manifest_path]) 270 .args(&args)
239 .stdout(Stdio::piped()) 271 .stdout(Stdio::piped())
240 .stderr(Stdio::null()) 272 .stderr(Stdio::null())
241 .spawn() 273 .spawn()