fix: check for client support of relative glob patterns before using them

This commit is contained in:
Alexis (Poliorcetics) Bourget 2024-03-27 02:29:03 +01:00
parent 4b33850c39
commit 8f9a58c73d
No known key found for this signature in database
2 changed files with 37 additions and 10 deletions

View File

@ -1013,6 +1013,17 @@ pub fn did_change_watched_files_dynamic_registration(&self) -> bool {
) )
} }
pub fn did_change_watched_files_relative_pattern_support(&self) -> bool {
try_or_def!(
self.caps
.workspace
.as_ref()?
.did_change_watched_files
.as_ref()?
.relative_pattern_support?
)
}
pub fn prefill_caches(&self) -> bool { pub fn prefill_caches(&self) -> bool {
self.data.cachePriming_enable self.data.cachePriming_enable
} }

View File

@ -428,16 +428,16 @@ pub(crate) fn switch_workspaces(&mut self, cause: Cause) {
} }
if let FilesWatcher::Client = self.config.files().watcher { if let FilesWatcher::Client = self.config.files().watcher {
let registration_options = lsp_types::DidChangeWatchedFilesRegistrationOptions { let filter =
watchers: self self.workspaces.iter().flat_map(|ws| ws.to_roots()).filter(|it| it.is_local);
.workspaces
.iter() let watchers = if self.config.did_change_watched_files_relative_pattern_support() {
.flat_map(|ws| ws.to_roots()) // When relative patterns are supported by the client, prefer using them
.filter(|it| it.is_local) filter
.flat_map(|root| { .flat_map(|root| {
root.include root.include.into_iter().flat_map(|base| {
.into_iter() [(base.clone(), "**/*.rs"), (base, "**/Cargo.{lock,toml}")]
.flat_map(|it| [(it.clone(), "**/*.rs"), (it, "**/Cargo.{lock,toml}")]) })
}) })
.map(|(base, pat)| lsp_types::FileSystemWatcher { .map(|(base, pat)| lsp_types::FileSystemWatcher {
glob_pattern: lsp_types::GlobPattern::Relative( glob_pattern: lsp_types::GlobPattern::Relative(
@ -450,8 +450,24 @@ pub(crate) fn switch_workspaces(&mut self, cause: Cause) {
), ),
kind: None, kind: None,
}) })
.collect(), .collect()
} else {
// When they're not, integrate the base to make them into absolute patterns
filter
.flat_map(|root| {
root.include.into_iter().flat_map(|base| {
[format!("{base}/**/*.rs"), format!("{base}/**/Cargo.{{lock,toml}}")]
})
})
.map(|glob_pattern| lsp_types::FileSystemWatcher {
glob_pattern: lsp_types::GlobPattern::String(glob_pattern),
kind: None,
})
.collect()
}; };
let registration_options =
lsp_types::DidChangeWatchedFilesRegistrationOptions { watchers };
let registration = lsp_types::Registration { let registration = lsp_types::Registration {
id: "workspace/didChangeWatchedFiles".to_owned(), id: "workspace/didChangeWatchedFiles".to_owned(),
method: "workspace/didChangeWatchedFiles".to_owned(), method: "workspace/didChangeWatchedFiles".to_owned(),