refactor(language_server): add intern capability for didChangeWatchedFiles.dynamicRegistration (#11075)

Current State: The client initializes the file watchers and tells the client for changes.
Goal: The Server should tell clients to watch for specific files.
This will help for other editors which does not have a custom implementation like VSCode does.

See https://github.com/oxc-project/oxc/pull/11078 how to use this capability.
This commit is contained in:
Sysix committed 2025-05-18 12:11:07 +00:00
1 parent f0793380af
commit 6b68de0daa
1 file changed
+44 -2
+44 -2
View File
@@ -13,6 +13,7 @@ pub struct Capabilities {
pub workspace_apply_edit: bool,
pub workspace_execute_command: bool,
pub workspace_configuration: bool,
pub dynamic_watchers: bool,
}
impl From<ClientCapabilities> for Capabilities {
@@ -33,12 +34,18 @@ impl From<ClientCapabilities> for Capabilities {
.workspace
.as_ref()
.is_some_and(|workspace| workspace.configuration.is_some_and(|config| config));
let dynamic_watchers = value.workspace.is_some_and(|workspace| {
workspace.did_change_watched_files.is_some_and(|watched_files| {
watched_files.dynamic_registration.is_some_and(|dynamic| dynamic)
})
});
Self {
code_action_provider,
workspace_apply_edit,
workspace_execute_command,
workspace_configuration,
dynamic_watchers,
}
}
}
@@ -85,8 +92,9 @@ impl From<Capabilities> for ServerCapabilities {
mod test {
use tower_lsp_server::lsp_types::{
ClientCapabilities, CodeActionClientCapabilities, CodeActionKindLiteralSupport,
CodeActionLiteralSupport, DynamicRegistrationClientCapabilities,
TextDocumentClientCapabilities, WorkspaceClientCapabilities,
CodeActionLiteralSupport, DidChangeWatchedFilesClientCapabilities,
DynamicRegistrationClientCapabilities, TextDocumentClientCapabilities,
WorkspaceClientCapabilities,
};
use super::Capabilities;
@@ -222,4 +230,38 @@ mod test {
assert!(capabilities.workspace_apply_edit);
}
#[test]
fn test_dynamic_watchers_vscode() {
let client_capabilities = ClientCapabilities {
workspace: Some(WorkspaceClientCapabilities {
did_change_watched_files: Some(DidChangeWatchedFilesClientCapabilities {
dynamic_registration: Some(true),
..Default::default()
}),
..Default::default()
}),
..Default::default()
};
let capabilities = Capabilities::from(client_capabilities);
assert!(capabilities.dynamic_watchers);
}
#[test]
fn test_dynamic_watchers_intellij() {
let client_capabilities = ClientCapabilities {
workspace: Some(WorkspaceClientCapabilities {
did_change_watched_files: Some(DidChangeWatchedFilesClientCapabilities {
dynamic_registration: Some(true),
..Default::default()
}),
..Default::default()
}),
..Default::default()
};
let capabilities = Capabilities::from(client_capabilities);
assert!(capabilities.dynamic_watchers);
}
}