diff --git a/src/plugins/languageclient/languageclientmanager.cpp b/src/plugins/languageclient/languageclientmanager.cpp index 857162903bf..5cecf79a411 100644 --- a/src/plugins/languageclient/languageclientmanager.cpp +++ b/src/plugins/languageclient/languageclientmanager.cpp @@ -294,74 +294,78 @@ void LanguageClientManager::applySettings() const QList restarts = LanguageClientSettings::changedSettings(); LanguageClientSettings::toSettings(Core::ICore::settings(), managerInstance->m_currentSettings); - for (BaseSettings *setting : restarts) { - QList documents; - const QList currentClients = clientsForSetting(setting); - for (Client *client : currentClients) { - documents << managerInstance->m_clientForDocument.keys(client); - shutdownClient(client); + for (BaseSettings *settings : restarts) + applySettings(settings); +} + +void LanguageClientManager::applySettings(BaseSettings *setting) +{ + QList documents; + const QList currentClients = clientsForSetting(setting); + for (Client *client : currentClients) { + documents << managerInstance->m_clientForDocument.keys(client); + shutdownClient(client); + } + for (auto document : std::as_const(documents)) + managerInstance->m_clientForDocument.remove(document); + if (!setting->isValid() || !setting->m_enabled) + return; + switch (setting->m_startBehavior) { + case BaseSettings::AlwaysOn: { + Client *client = startClient(setting); + for (TextEditor::TextDocument *document : std::as_const(documents)) + managerInstance->m_clientForDocument[document] = client; + break; + } + case BaseSettings::RequiresFile: { + Client *client = nullptr; + for (TextEditor::TextDocument *previousDocument : std::as_const(documents)) { + if (setting->m_languageFilter.isSupported(previousDocument)) { + if (!client) + client = startClient(setting); + openDocumentWithClient(previousDocument, client); + } } - for (auto document : std::as_const(documents)) - managerInstance->m_clientForDocument.remove(document); - if (!setting->isValid() || !setting->m_enabled) - continue; - switch (setting->m_startBehavior) { - case BaseSettings::AlwaysOn: { - Client *client = startClient(setting); - for (TextEditor::TextDocument *document : std::as_const(documents)) - managerInstance->m_clientForDocument[document] = client; - break; - } - case BaseSettings::RequiresFile: { - Client *client = nullptr; - for (TextEditor::TextDocument *previousDocument : std::as_const(documents)) { - if (setting->m_languageFilter.isSupported(previousDocument)) { + const QList &openedDocuments = Core::DocumentModel::openedDocuments(); + for (Core::IDocument *document : openedDocuments) { + if (documents.contains(document)) + continue; // already handled above + if (auto textDocument = qobject_cast(document)) { + if (setting->m_languageFilter.isSupported(document)) { if (!client) client = startClient(setting); - openDocumentWithClient(previousDocument, client); + client->openDocument(textDocument); } } - const QList &openedDocuments = Core::DocumentModel::openedDocuments(); - for (Core::IDocument *document : openedDocuments) { - if (documents.contains(document)) - continue; // already handled above - if (auto textDocument = qobject_cast(document)) { - if (setting->m_languageFilter.isSupported(document)) { + } + break; + } + case BaseSettings::RequiresProject: { + const QList &openedDocuments = Core::DocumentModel::openedDocuments(); + QHash clientForProject; + for (Core::IDocument *document : openedDocuments) { + auto textDocument = qobject_cast(document); + if (!textDocument || !setting->m_languageFilter.isSupported(textDocument)) + continue; + const Utils::FilePath filePath = textDocument->filePath(); + for (ProjectExplorer::Project *project : + ProjectExplorer::ProjectManager::projects()) { + if (project->isKnownFile(filePath)) { + Client *client = clientForProject[project]; + if (!client) { + client = startClient(setting, project); if (!client) - client = startClient(setting); - client->openDocument(textDocument); + continue; + clientForProject[project] = client; } + client->openDocument(textDocument); } } - break; - } - case BaseSettings::RequiresProject: { - const QList &openedDocuments = Core::DocumentModel::openedDocuments(); - QHash clientForProject; - for (Core::IDocument *document : openedDocuments) { - auto textDocument = qobject_cast(document); - if (!textDocument || !setting->m_languageFilter.isSupported(textDocument)) - continue; - const Utils::FilePath filePath = textDocument->filePath(); - for (ProjectExplorer::Project *project : - ProjectExplorer::ProjectManager::projects()) { - if (project->isKnownFile(filePath)) { - Client *client = clientForProject[project]; - if (!client) { - client = startClient(setting, project); - if (!client) - continue; - clientForProject[project] = client; - } - client->openDocument(textDocument); - } - } - } - break; - } - default: - break; } + break; + } + default: + break; } } diff --git a/src/plugins/languageclient/languageclientmanager.h b/src/plugins/languageclient/languageclientmanager.h index e14352881d2..d39844e16d0 100644 --- a/src/plugins/languageclient/languageclientmanager.h +++ b/src/plugins/languageclient/languageclientmanager.h @@ -52,6 +52,7 @@ public: const TextEditor::TextDocument *doc, bool onlyReachable = true); static void applySettings(); + static void applySettings(BaseSettings *settings); static QList currentSettings(); static void registerClientSettings(BaseSettings *settings); static void enableClientSettings(const QString &settingsId, bool enable = true);