From a6b177d8067cb7a9dd7501f33fbdc6d2cac15067 Mon Sep 17 00:00:00 2001 From: Karl-Erik Enkelmann <110300169+playdohface@users.noreply.github.com> Date: Mon, 3 Nov 2025 17:28:30 +0100 Subject: [PATCH] Update open buffers with newly registered completion trigger characters (#41243) Closes https://github.com/zed-extensions/java/issues/108 Previously, when language servers dynamically register completion capabilities with trigger characters for completions (hello JDTLS), this would not get updated in buffers for that language server that were already open. This change is to find open buffers for the language server and update the trigger characters in each of them when the new capability is being registered. Release Notes: - N/A --- crates/project/src/lsp_store.rs | 46 ++++++++++++++++++++++++++------- 1 file changed, 36 insertions(+), 10 deletions(-) diff --git a/crates/project/src/lsp_store.rs b/crates/project/src/lsp_store.rs index 02c1aca737ee63e83334e172767539a256df7c90..2be2d20253bb4257fe00dbf4c3ce4f309d40e1e8 100644 --- a/crates/project/src/lsp_store.rs +++ b/crates/project/src/lsp_store.rs @@ -75,14 +75,14 @@ use language::{ range_from_lsp, range_to_lsp, }; use lsp::{ - AdapterServerCapabilities, CodeActionKind, CompletionContext, DiagnosticServerCapabilities, - DiagnosticSeverity, DiagnosticTag, DidChangeWatchedFilesRegistrationOptions, Edit, - FileOperationFilter, FileOperationPatternKind, FileOperationRegistrationOptions, FileRename, - FileSystemWatcher, LSP_REQUEST_TIMEOUT, LanguageServer, LanguageServerBinary, - LanguageServerBinaryOptions, LanguageServerId, LanguageServerName, LanguageServerSelector, - LspRequestFuture, MessageActionItem, MessageType, OneOf, RenameFilesParams, SymbolKind, - TextDocumentSyncSaveOptions, TextEdit, Uri, WillRenameFiles, WorkDoneProgressCancelParams, - WorkspaceFolder, notification::DidRenameFiles, + AdapterServerCapabilities, CodeActionKind, CompletionContext, CompletionOptions, + DiagnosticServerCapabilities, DiagnosticSeverity, DiagnosticTag, + DidChangeWatchedFilesRegistrationOptions, Edit, FileOperationFilter, FileOperationPatternKind, + FileOperationRegistrationOptions, FileRename, FileSystemWatcher, LSP_REQUEST_TIMEOUT, + LanguageServer, LanguageServerBinary, LanguageServerBinaryOptions, LanguageServerId, + LanguageServerName, LanguageServerSelector, LspRequestFuture, MessageActionItem, MessageType, + OneOf, RenameFilesParams, SymbolKind, TextDocumentSyncSaveOptions, TextEdit, Uri, + WillRenameFiles, WorkDoneProgressCancelParams, WorkspaceFolder, notification::DidRenameFiles, }; use node_runtime::read_package_installed_version; use parking_lot::Mutex; @@ -11931,12 +11931,38 @@ impl LspStore { "textDocument/completion" => { if let Some(caps) = reg .register_options - .map(serde_json::from_value) + .map(serde_json::from_value::) .transpose()? { server.update_capabilities(|capabilities| { - capabilities.completion_provider = Some(caps); + capabilities.completion_provider = Some(caps.clone()); }); + + if let Some(local) = self.as_local() { + let mut buffers_with_language_server = Vec::new(); + for handle in self.buffer_store.read(cx).buffers() { + let buffer_id = handle.read(cx).remote_id(); + if local + .buffers_opened_in_servers + .get(&buffer_id) + .filter(|s| s.contains(&server_id)) + .is_some() + { + buffers_with_language_server.push(handle); + } + } + let triggers = caps + .trigger_characters + .unwrap_or_default() + .into_iter() + .collect::>(); + for handle in buffers_with_language_server { + let triggers = triggers.clone(); + let _ = handle.update(cx, move |buffer, cx| { + buffer.set_completion_triggers(server_id, triggers, cx); + }); + } + } notify_server_capabilities_updated(&server, cx); } }