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
This commit is contained in:
Karl-Erik Enkelmann
2025-11-03 17:28:30 +01:00
committed by GitHub
parent 73366bef62
commit a6b177d806
+36 -10
View File
@@ -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::<CompletionOptions>)
.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::<BTreeSet<_>>();
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);
}
}