diff options
author | David Schulz <[email protected]> | 2019-03-28 11:59:32 +0100 |
---|---|---|
committer | David Schulz <[email protected]> | 2019-04-24 09:01:11 +0000 |
commit | 5c7d8a20c7fd46b89d8d5c7b5e57d868375bede3 (patch) | |
tree | d2ec5afb6855514beb60d7ae7f6688d07e630a7d | |
parent | 4dcea384ddc8d3d37cf3df2ffd8f8178c2f4a7d6 (diff) |
LanguageClient: move setting client relationship to manager
Change-Id: I9bf712227d44eada28abb18bbf641a2bfa835914
Reviewed-by: Christian Stenger <[email protected]>
4 files changed, 68 insertions, 39 deletions
diff --git a/src/plugins/languageclient/languageclientmanager.cpp b/src/plugins/languageclient/languageclientmanager.cpp index 26603aa5845..6f3249b9ec0 100644 --- a/src/plugins/languageclient/languageclientmanager.cpp +++ b/src/plugins/languageclient/languageclientmanager.cpp @@ -112,6 +112,17 @@ void LanguageClientManager::startClient(Client *client) managerInstance->clientFinished(client); } +void LanguageClientManager::startClient(BaseSettings *setting) +{ + QTC_ASSERT(managerInstance, return); + QTC_ASSERT(setting, return); + QTC_ASSERT(setting->isValid(), return); + Client *client = setting->createClient(); + QTC_ASSERT(client, return); + startClient(client); + managerInstance->m_clientsForSetting[setting->m_id] = client; +} + QVector<Client *> LanguageClientManager::clients() { QTC_ASSERT(managerInstance, return {}); @@ -182,41 +193,41 @@ QList<Client *> LanguageClientManager::clientsSupportingDocument( void LanguageClientManager::applySettings() { - QTC_ASSERT(instance(), return); - qDeleteAll(instance()->m_currentSettings); - instance()->m_currentSettings = Utils::transform(LanguageClientSettings::currentPageSettings(), - [](BaseSettings *settings) { - return settings->copy(); - }); - LanguageClientSettings::toSettings(Core::ICore::settings(), instance()->m_currentSettings); + QTC_ASSERT(managerInstance, return); + qDeleteAll(managerInstance->m_currentSettings); + managerInstance->m_currentSettings = Utils::transform(LanguageClientSettings::currentPageSettings(), + [](BaseSettings *settings) { + return settings->copy(); + }); + LanguageClientSettings::toSettings(Core::ICore::settings(), managerInstance->m_currentSettings); - const QList<BaseSettings *> restarts = Utils::filtered(LanguageClientManager::currentSettings(), - &BaseSettings::needsRestart); + const QList<BaseSettings *> restarts = Utils::filtered(managerInstance->m_currentSettings, + [](BaseSettings *settings) { + return settings->needsRestart(); + }); for (BaseSettings *setting : restarts) { - if (auto client = setting->m_client) { + if (auto client = clientForSetting(setting)) { if (client->reachable()) client->shutdown(); else deleteClient(client); } - if (setting->isValid() && setting->m_enabled) { - const bool start = setting->m_alwaysOn - || Utils::anyOf(Core::DocumentModel::openedDocuments(), - [filter = setting->m_languageFilter]( - Core::IDocument *doc) { - return filter.isSupported(doc); - }); - if (start) - setting->startClient(); - } + if (setting->canStartClient()) + startClient(setting); } } QList<BaseSettings *> LanguageClientManager::currentSettings() { - QTC_ASSERT(instance(), return {}); - return instance()->m_currentSettings; + QTC_ASSERT(managerInstance, return {}); + return managerInstance->m_currentSettings; +} + +Client *LanguageClientManager::clientForSetting(const BaseSettings *setting) +{ + QTC_ASSERT(managerInstance, return nullptr); + return managerInstance->m_clientsForSetting.value(setting->m_id, nullptr); } QVector<Client *> LanguageClientManager::reachableClients() @@ -289,8 +300,8 @@ void LanguageClientManager::editorOpened(Core::IEditor *editor) void LanguageClientManager::documentOpened(Core::IDocument *document) { for (BaseSettings *setting : LanguageClientSettings::currentPageSettings()) { - if (setting->m_client.isNull() && setting->m_languageFilter.isSupported(document)) - setting->startClient(); + if (clientForSetting(setting) == nullptr && setting->canStartClient()) + startClient(setting); } for (Client *interface : reachableClients()) interface->openDocument(document); diff --git a/src/plugins/languageclient/languageclientmanager.h b/src/plugins/languageclient/languageclientmanager.h index 7a2fcc175d9..93273e1595a 100644 --- a/src/plugins/languageclient/languageclientmanager.h +++ b/src/plugins/languageclient/languageclientmanager.h @@ -56,6 +56,7 @@ public: static void init(); static void startClient(Client *client); + static void startClient(BaseSettings *setting); static QVector<Client *> clients(); static void addExclusiveRequest(const LanguageServerProtocol::MessageId &id, Client *client); @@ -71,6 +72,7 @@ public: static void applySettings(); static QList<BaseSettings *> currentSettings(); + static Client *clientForSetting(const BaseSettings *setting); signals: void shutdownFinished(); @@ -98,6 +100,7 @@ private: bool m_shuttingDown = false; QVector<Client *> m_clients; QList<BaseSettings *> m_currentSettings; // owned + QMap<QString, QPointer<Client>> m_clientsForSetting; QHash<LanguageServerProtocol::MessageId, QList<Client *>> m_exclusiveRequests; }; } // namespace LanguageClient diff --git a/src/plugins/languageclient/languageclientsettings.cpp b/src/plugins/languageclient/languageclientsettings.cpp index c67b9a97a96..f39ccade062 100644 --- a/src/plugins/languageclient/languageclientsettings.cpp +++ b/src/plugins/languageclient/languageclientsettings.cpp @@ -59,6 +59,7 @@ #include <QTreeView> constexpr char nameKey[] = "name"; +constexpr char idKey[] = "id"; constexpr char enabledKey[] = "enabled"; constexpr char alwaysOnKey[] = "alwaysOn"; constexpr char mimeTypeKey[] = "mimeType"; @@ -260,7 +261,7 @@ void LanguageClientSettingsPage::apply() LanguageClientManager::applySettings(); for (BaseSettings *setting : m_model.removed()) { - if (Client *client = setting->m_client) { + if (Client *client = LanguageClientManager::clientForSetting(setting)) { if (client->reachable()) client->shutdown(); else @@ -384,7 +385,18 @@ QWidget *BaseSettings::createSettingsWidget(QWidget *parent) const bool BaseSettings::needsRestart() const { - return m_client ? !m_enabled || m_client->needsRestart(this) : m_enabled; + Client *client = LanguageClientManager::clientForSetting(this); + return client ? !m_enabled || client->needsRestart(this) : m_enabled; +} + +bool BaseSettings::canStartClient() const +{ + using namespace Core; + if (!isValid() || !m_enabled) + return false; + return m_alwaysOn || Utils::anyOf(DocumentModel::openedDocuments(), [this](IDocument *doc) { + return m_languageFilter.isSupported(doc); + }); } bool BaseSettings::isValid() const @@ -392,23 +404,23 @@ bool BaseSettings::isValid() const return !m_name.isEmpty(); } -void BaseSettings::startClient() +Client *BaseSettings::createClient() { if (!isValid() || !m_enabled) - return; + return nullptr; BaseClientInterface *interface = createInterface(); - QTC_ASSERT(interface, return); + QTC_ASSERT(interface, return nullptr); auto *client = new Client(interface); client->setName(Utils::globalMacroExpander()->expand(m_name)); client->setSupportedLanguage(m_languageFilter); - m_client = client; - LanguageClientManager::startClient(client); + return client; } QVariantMap BaseSettings::toMap() const { QVariantMap map; map.insert(nameKey, m_name); + map.insert(idKey, m_id); map.insert(enabledKey, m_enabled); map.insert(alwaysOnKey, m_alwaysOn); map.insert(mimeTypeKey, m_languageFilter.mimeTypes); @@ -419,6 +431,7 @@ QVariantMap BaseSettings::toMap() const void BaseSettings::fromMap(const QVariantMap &map) { m_name = map[nameKey].toString(); + m_id = map.value(idKey, QUuid::createUuid().toString()).toString(); m_enabled = map[enabledKey].toBool(); m_alwaysOn = map.value(alwaysOnKey, false).toBool(); m_languageFilter.mimeTypes = map[mimeTypeKey].toStringList(); @@ -483,10 +496,10 @@ bool StdIOSettings::needsRestart() const { if (BaseSettings::needsRestart()) return true; - if (m_client.isNull()) - return false; - if (auto stdIOInterface = qobject_cast<const StdIOClientInterface *>(m_client->clientInterface())) - return stdIOInterface->needsRestart(this); + if (Client *client = LanguageClientManager::clientForSetting(this)) + if (auto stdIOInterface = qobject_cast<const StdIOClientInterface *>( + client->clientInterface())) + return stdIOInterface->needsRestart(this); return false; } @@ -572,7 +585,7 @@ BaseSettingsWidget::BaseSettingsWidget(const BaseSettings *settings, QWidget *pa }; mainLayout->addWidget(new QLabel(tr("Capabilities:")), ++row, 0, Qt::AlignTop); - if (Client *client = settings->m_client.data()) { + if (Client *client = LanguageClientManager::clientForSetting(settings)) { if (client->state() == Client::Initialized) mainLayout->addWidget(createCapabilitiesView(client->capabilities())); else diff --git a/src/plugins/languageclient/languageclientsettings.h b/src/plugins/languageclient/languageclientsettings.h index ddc0a2e386d..ac6d2e23c0f 100644 --- a/src/plugins/languageclient/languageclientsettings.h +++ b/src/plugins/languageclient/languageclientsettings.h @@ -30,6 +30,7 @@ #include <QAbstractItemModel> #include <QLabel> #include <QPointer> +#include <QUuid> #include <QWidget> QT_BEGIN_NAMESPACE @@ -67,17 +68,18 @@ public: virtual ~BaseSettings() = default; QString m_name = QString("New Language Server"); + QString m_id = QUuid::createUuid().toString(); bool m_enabled = true; bool m_alwaysOn = false; LanguageFilter m_languageFilter; - QPointer<Client> m_client; // not owned virtual void applyFromSettingsWidget(QWidget *widget); virtual QWidget *createSettingsWidget(QWidget *parent = nullptr) const; virtual BaseSettings *copy() const { return new BaseSettings(*this); } virtual bool needsRestart() const; - virtual bool isValid() const ; - void startClient(); + virtual bool canStartClient() const; + virtual bool isValid() const; + Client *createClient(); virtual QVariantMap toMap() const; virtual void fromMap(const QVariantMap &map); |