diff --git a/crates/rust-analyzer/src/config.rs b/crates/rust-analyzer/src/config.rs index 867f2bd1f0e..818aab35157 100644 --- a/crates/rust-analyzer/src/config.rs +++ b/crates/rust-analyzer/src/config.rs @@ -723,7 +723,10 @@ impl Config { FilesConfig { watcher: match self.data.files_watcher.as_str() { "notify" => FilesWatcher::Notify, - "client" | _ => FilesWatcher::Client, + "client" if self.did_change_watched_files_dynamic_registration() => { + FilesWatcher::Client + } + _ => FilesWatcher::Notify, }, exclude: self.data.files_excludeDirs.iter().map(|it| self.root_path.join(it)).collect(), } diff --git a/crates/rust-analyzer/src/reload.rs b/crates/rust-analyzer/src/reload.rs index 7ba56971762..b14b3dbcfa9 100644 --- a/crates/rust-analyzer/src/reload.rs +++ b/crates/rust-analyzer/src/reload.rs @@ -241,38 +241,33 @@ impl GlobalState { } if let FilesWatcher::Client = self.config.files().watcher { - if self.config.did_change_watched_files_dynamic_registration() { - let registration_options = lsp_types::DidChangeWatchedFilesRegistrationOptions { - watchers: self - .workspaces - .iter() - .flat_map(|ws| ws.to_roots()) - .filter(|it| it.is_local) - .flat_map(|root| { - root.include.into_iter().flat_map(|it| { - [ - format!("{}/**/*.rs", it.display()), - format!("{}/**/Cargo.toml", it.display()), - format!("{}/**/Cargo.lock", it.display()), - ] - }) + let registration_options = lsp_types::DidChangeWatchedFilesRegistrationOptions { + watchers: self + .workspaces + .iter() + .flat_map(|ws| ws.to_roots()) + .filter(|it| it.is_local) + .flat_map(|root| { + root.include.into_iter().flat_map(|it| { + [ + format!("{}/**/*.rs", it.display()), + format!("{}/**/Cargo.toml", it.display()), + format!("{}/**/Cargo.lock", it.display()), + ] }) - .map(|glob_pattern| lsp_types::FileSystemWatcher { - glob_pattern, - kind: None, - }) - .collect(), - }; - let registration = lsp_types::Registration { - id: "workspace/didChangeWatchedFiles".to_string(), - method: "workspace/didChangeWatchedFiles".to_string(), - register_options: Some(serde_json::to_value(registration_options).unwrap()), - }; - self.send_request::( - lsp_types::RegistrationParams { registrations: vec![registration] }, - |_, _| (), - ); - } + }) + .map(|glob_pattern| lsp_types::FileSystemWatcher { glob_pattern, kind: None }) + .collect(), + }; + let registration = lsp_types::Registration { + id: "workspace/didChangeWatchedFiles".to_string(), + method: "workspace/didChangeWatchedFiles".to_string(), + register_options: Some(serde_json::to_value(registration_options).unwrap()), + }; + self.send_request::( + lsp_types::RegistrationParams { registrations: vec![registration] }, + |_, _| (), + ); } let mut change = Change::new(); diff --git a/crates/rust-analyzer/tests/slow-tests/support.rs b/crates/rust-analyzer/tests/slow-tests/support.rs index a8c2a5bb615..6e7ecec5b2b 100644 --- a/crates/rust-analyzer/tests/slow-tests/support.rs +++ b/crates/rust-analyzer/tests/slow-tests/support.rs @@ -101,6 +101,14 @@ impl<'a> Project<'a> { let mut config = Config::new( tmp_dir_path, lsp_types::ClientCapabilities { + workspace: Some(lsp_types::WorkspaceClientCapabilities { + did_change_watched_files: Some( + lsp_types::DidChangeWatchedFilesClientCapabilities { + dynamic_registration: Some(true), + }, + ), + ..Default::default() + }), text_document: Some(lsp_types::TextDocumentClientCapabilities { definition: Some(lsp_types::GotoCapability { link_support: Some(true), diff --git a/crates/rust-analyzer/tests/slow-tests/testdir.rs b/crates/rust-analyzer/tests/slow-tests/testdir.rs index c7e5c218064..3bec23a9117 100644 --- a/crates/rust-analyzer/tests/slow-tests/testdir.rs +++ b/crates/rust-analyzer/tests/slow-tests/testdir.rs @@ -52,7 +52,9 @@ impl Drop for TestDir { if self.keep { return; } - remove_dir_all(&self.path).unwrap() + remove_dir_all(&self.path).unwrap_or_else(|err| { + panic!("failed to remove temporary directory {}: {}", self.path.display(), err) + }) } }