Skip to content

Commit

Permalink
Auto merge of #16957 - poliorcetics:ab/push-tlzsqmqqurxs, r=lnicola
Browse files Browse the repository at this point in the history
fix: check for client support of relative glob patterns before using them

Fixes #16955
  • Loading branch information
bors committed Mar 28, 2024
2 parents 29a8e65 + 8f9a58c commit 899db83
Show file tree
Hide file tree
Showing 2 changed files with 37 additions and 10 deletions.
11 changes: 11 additions & 0 deletions crates/rust-analyzer/src/config.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1013,6 +1013,17 @@ impl Config {
)
}

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 {
self.data.cachePriming_enable
}
Expand Down
36 changes: 26 additions & 10 deletions crates/rust-analyzer/src/reload.rs
Original file line number Diff line number Diff line change
Expand Up @@ -428,16 +428,16 @@ impl GlobalState {
}

if let FilesWatcher::Client = self.config.files().watcher {
let registration_options = lsp_types::DidChangeWatchedFilesRegistrationOptions {
watchers: self
.workspaces
.iter()
.flat_map(|ws| ws.to_roots())
.filter(|it| it.is_local)
let filter =
self.workspaces.iter().flat_map(|ws| ws.to_roots()).filter(|it| it.is_local);

let watchers = if self.config.did_change_watched_files_relative_pattern_support() {
// When relative patterns are supported by the client, prefer using them
filter
.flat_map(|root| {
root.include
.into_iter()
.flat_map(|it| [(it.clone(), "**/*.rs"), (it, "**/Cargo.{lock,toml}")])
root.include.into_iter().flat_map(|base| {
[(base.clone(), "**/*.rs"), (base, "**/Cargo.{lock,toml}")]
})
})
.map(|(base, pat)| lsp_types::FileSystemWatcher {
glob_pattern: lsp_types::GlobPattern::Relative(
Expand All @@ -450,8 +450,24 @@ impl GlobalState {
),
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 {
id: "workspace/didChangeWatchedFiles".to_owned(),
method: "workspace/didChangeWatchedFiles".to_owned(),
Expand Down

0 comments on commit 899db83

Please sign in to comment.