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); } }