aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_lsp_server
diff options
context:
space:
mode:
Diffstat (limited to 'crates/ra_lsp_server')
-rw-r--r--crates/ra_lsp_server/src/cargo_check.rs52
-rw-r--r--crates/ra_lsp_server/src/config.rs14
-rw-r--r--crates/ra_lsp_server/src/main_loop.rs7
-rw-r--r--crates/ra_lsp_server/src/world.rs7
4 files changed, 31 insertions, 49 deletions
diff --git a/crates/ra_lsp_server/src/cargo_check.rs b/crates/ra_lsp_server/src/cargo_check.rs
index fa0409ee0..70c723b19 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 {
39 39
40impl CheckWatcher { 40impl CheckWatcher {
41 pub fn new(options: &Options, workspace_root: PathBuf) -> CheckWatcher { 41 pub fn new(options: &Options, workspace_root: PathBuf) -> CheckWatcher {
42 let check_enabled = options.cargo_check_enable; 42 let options = options.clone();
43 let check_command = options.cargo_check_command.clone();
44 let check_args = options.cargo_check_args.clone();
45 let shared = Arc::new(RwLock::new(CheckWatcherSharedState::new())); 43 let shared = Arc::new(RwLock::new(CheckWatcherSharedState::new()));
46 44
47 let (task_send, task_recv) = unbounded::<CheckTask>(); 45 let (task_send, task_recv) = unbounded::<CheckTask>();
48 let (cmd_send, cmd_recv) = unbounded::<CheckCommand>(); 46 let (cmd_send, cmd_recv) = unbounded::<CheckCommand>();
49 let shared_ = shared.clone(); 47 let shared_ = shared.clone();
50 let handle = std::thread::spawn(move || { 48 let handle = std::thread::spawn(move || {
51 let mut check = CheckWatcherState::new( 49 let mut check = CheckWatcherState::new(options, workspace_root, shared_);
52 check_enabled,
53 check_command,
54 check_args,
55 workspace_root,
56 shared_,
57 );
58 check.run(&task_send, &cmd_recv); 50 check.run(&task_send, &cmd_recv);
59 }); 51 });
60 52
@@ -68,9 +60,7 @@ impl CheckWatcher {
68} 60}
69 61
70pub struct CheckWatcherState { 62pub struct CheckWatcherState {
71 check_enabled: bool, 63 options: Options,
72 check_command: Option<String>,
73 check_args: Vec<String>,
74 workspace_root: PathBuf, 64 workspace_root: PathBuf,
75 running: bool, 65 running: bool,
76 watcher: WatchThread, 66 watcher: WatchThread,
@@ -162,18 +152,13 @@ pub enum CheckCommand {
162 152
163impl CheckWatcherState { 153impl CheckWatcherState {
164 pub fn new( 154 pub fn new(
165 check_enabled: bool, 155 options: Options,
166 check_command: Option<String>,
167 check_args: Vec<String>,
168 workspace_root: PathBuf, 156 workspace_root: PathBuf,
169 shared: Arc<RwLock<CheckWatcherSharedState>>, 157 shared: Arc<RwLock<CheckWatcherSharedState>>,
170 ) -> CheckWatcherState { 158 ) -> CheckWatcherState {
171 let watcher = 159 let watcher = WatchThread::new(&options, &workspace_root);
172 WatchThread::new(check_enabled, check_command.as_ref(), &check_args, &workspace_root);
173 CheckWatcherState { 160 CheckWatcherState {
174 check_enabled, 161 options,
175 check_command,
176 check_args,
177 workspace_root, 162 workspace_root,
178 running: false, 163 running: false,
179 watcher, 164 watcher,
@@ -204,12 +189,7 @@ impl CheckWatcherState {
204 self.shared.write().clear(task_send); 189 self.shared.write().clear(task_send);
205 190
206 self.watcher.cancel(); 191 self.watcher.cancel();
207 self.watcher = WatchThread::new( 192 self.watcher = WatchThread::new(&self.options, &self.workspace_root);
208 self.check_enabled,
209 self.check_command.as_ref(),
210 &self.check_args,
211 &self.workspace_root,
212 );
213 } 193 }
214 } 194 }
215 } 195 }
@@ -306,25 +286,23 @@ enum CheckEvent {
306} 286}
307 287
308impl WatchThread { 288impl WatchThread {
309 fn new( 289 fn new(options: &Options, workspace_root: &PathBuf) -> WatchThread {
310 check_enabled: bool,
311 check_command: Option<&String>,
312 check_args: &[String],
313 workspace_root: &PathBuf,
314 ) -> WatchThread {
315 let check_command = check_command.cloned().unwrap_or("check".to_string());
316 let mut args: Vec<String> = vec![ 290 let mut args: Vec<String> = vec![
317 check_command, 291 options.cargo_watch_command.clone(),
318 "--message-format=json".to_string(), 292 "--message-format=json".to_string(),
319 "--manifest-path".to_string(), 293 "--manifest-path".to_string(),
320 format!("{}/Cargo.toml", workspace_root.to_string_lossy()), 294 format!("{}/Cargo.toml", workspace_root.to_string_lossy()),
321 ]; 295 ];
322 args.extend(check_args.iter().cloned()); 296 if options.cargo_watch_all_targets {
297 args.push("--all-targets".to_string());
298 }
299 args.extend(options.cargo_watch_args.iter().cloned());
323 300
324 let (message_send, message_recv) = unbounded(); 301 let (message_send, message_recv) = unbounded();
325 let (cancel_send, cancel_recv) = unbounded(); 302 let (cancel_send, cancel_recv) = unbounded();
303 let enabled = options.cargo_watch_enable;
326 std::thread::spawn(move || { 304 std::thread::spawn(move || {
327 if !check_enabled { 305 if !enabled {
328 return; 306 return;
329 } 307 }
330 308
diff --git a/crates/ra_lsp_server/src/config.rs b/crates/ra_lsp_server/src/config.rs
index 621f2238c..2d7948d74 100644
--- a/crates/ra_lsp_server/src/config.rs
+++ b/crates/ra_lsp_server/src/config.rs
@@ -32,9 +32,10 @@ pub struct ServerConfig {
32 32
33 pub max_inlay_hint_length: Option<usize>, 33 pub max_inlay_hint_length: Option<usize>,
34 34
35 pub cargo_check_enable: bool, 35 pub cargo_watch_enable: bool,
36 pub cargo_check_command: Option<String>, 36 pub cargo_watch_args: Vec<String>,
37 pub cargo_check_args: Vec<String>, 37 pub cargo_watch_command: String,
38 pub cargo_watch_all_targets: bool,
38 39
39 /// For internal usage to make integrated tests faster. 40 /// For internal usage to make integrated tests faster.
40 #[serde(deserialize_with = "nullable_bool_true")] 41 #[serde(deserialize_with = "nullable_bool_true")]
@@ -55,9 +56,10 @@ impl Default for ServerConfig {
55 use_client_watching: false, 56 use_client_watching: false,
56 lru_capacity: None, 57 lru_capacity: None,
57 max_inlay_hint_length: None, 58 max_inlay_hint_length: None,
58 cargo_check_enable: true, 59 cargo_watch_enable: true,
59 cargo_check_command: None, 60 cargo_watch_args: Vec::new(),
60 cargo_check_args: vec![], 61 cargo_watch_command: "check".to_string(),
62 cargo_watch_all_targets: true,
61 with_sysroot: true, 63 with_sysroot: true,
62 feature_flags: FxHashMap::default(), 64 feature_flags: FxHashMap::default(),
63 cargo_features: Default::default(), 65 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 045e4660d..c58af7e47 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(
127 .and_then(|it| it.line_folding_only) 127 .and_then(|it| it.line_folding_only)
128 .unwrap_or(false), 128 .unwrap_or(false),
129 max_inlay_hint_length: config.max_inlay_hint_length, 129 max_inlay_hint_length: config.max_inlay_hint_length,
130 cargo_check_enable: config.cargo_check_enable, 130 cargo_watch_enable: config.cargo_watch_enable,
131 cargo_check_command: config.cargo_check_command, 131 cargo_watch_args: config.cargo_watch_args,
132 cargo_check_args: config.cargo_check_args, 132 cargo_watch_command: config.cargo_watch_command,
133 cargo_watch_all_targets: config.cargo_watch_all_targets,
133 } 134 }
134 }; 135 };
135 136
diff --git a/crates/ra_lsp_server/src/world.rs b/crates/ra_lsp_server/src/world.rs
index 47c3823fb..39a07c01a 100644
--- a/crates/ra_lsp_server/src/world.rs
+++ b/crates/ra_lsp_server/src/world.rs
@@ -35,9 +35,10 @@ pub struct Options {
35 pub supports_location_link: bool, 35 pub supports_location_link: bool,
36 pub line_folding_only: bool, 36 pub line_folding_only: bool,
37 pub max_inlay_hint_length: Option<usize>, 37 pub max_inlay_hint_length: Option<usize>,
38 pub cargo_check_enable: bool, 38 pub cargo_watch_enable: bool,
39 pub cargo_check_command: Option<String>, 39 pub cargo_watch_args: Vec<String>,
40 pub cargo_check_args: Vec<String>, 40 pub cargo_watch_command: String,
41 pub cargo_watch_all_targets: bool,
41} 42}
42 43
43/// `WorldState` is the primary mutable state of the language server 44/// `WorldState` is the primary mutable state of the language server