From 20e6e84b1af26134eb9481ae93f1ca21ea858a90 Mon Sep 17 00:00:00 2001 From: David Schulz Date: Fri, 20 Sep 2019 07:41:21 +0200 Subject: LanguageClient: Add already open documents to starting client After settings are applied in the manager make sure to assign all open documents to the newly created clients if the document filter accepts them. Change-Id: I30e06e37bc4fde0bc7bab34a2de564a7df043edf Reviewed-by: Christian Stenger --- .../languageclient/languageclientmanager.cpp | 25 +++++++++++++++------- 1 file changed, 17 insertions(+), 8 deletions(-) diff --git a/src/plugins/languageclient/languageclientmanager.cpp b/src/plugins/languageclient/languageclientmanager.cpp index 923b521bfd..959f3150b9 100644 --- a/src/plugins/languageclient/languageclientmanager.cpp +++ b/src/plugins/languageclient/languageclientmanager.cpp @@ -224,6 +224,8 @@ void LanguageClientManager::applySettings() documents << managerInstance->m_clientForDocument.keys(client); shutdownClient(client); } + for (auto document : documents) + managerInstance->m_clientForDocument.remove(document); if (!setting->isValid() || !setting->m_enabled) continue; switch (setting->m_startBehavior) { @@ -234,13 +236,19 @@ void LanguageClientManager::applySettings() break; } case BaseSettings::RequiresFile: { - if (Utils::anyOf(Core::DocumentModel::openedDocuments(), - [filter = setting->m_languageFilter](Core::IDocument *doc) { - return filter.isSupported(doc); - })) { + for (Core::IDocument *document : Core::DocumentModel::openedDocuments()) { + if (auto textDocument = qobject_cast(document)) { + if (setting->m_languageFilter.isSupported(document)) + documents << textDocument; + } + } + if (!documents.isEmpty()) { Client *client = startClient(setting); - for (TextEditor::TextDocument *document : documents) - managerInstance->m_clientForDocument[document] = client; + for (TextEditor::TextDocument *document : documents) { + if (managerInstance->m_clientForDocument.value(document).isNull()) + managerInstance->m_clientForDocument[document] = client; + client->openDocument(document); + } } break; } @@ -295,7 +303,8 @@ const BaseSettings *LanguageClientManager::settingForClient(Client *client) Client *LanguageClientManager::clientForDocument(TextEditor::TextDocument *document) { QTC_ASSERT(managerInstance, return nullptr); - return document == nullptr ? nullptr : managerInstance->m_clientForDocument[document].data(); + return document == nullptr ? nullptr + : managerInstance->m_clientForDocument.value(document).data(); } Client *LanguageClientManager::clientForFilePath(const Utils::FilePath &filePath) @@ -419,7 +428,7 @@ void LanguageClientManager::documentOpened(Core::IDocument *document) } for (auto client : clients) { openDocumentWithClient(textDocument, client); - if (m_clientForDocument.value(textDocument).isNull()) + if (!m_clientForDocument.contains(textDocument)) m_clientForDocument[textDocument] = client; } } -- cgit v1.2.1