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:
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user