aboutsummaryrefslogtreecommitdiffstats
path: root/src/plugins/languageclient
diff options
context:
space:
mode:
authorDavid Schulz <david.schulz@qt.io>2019-03-28 11:59:32 +0100
committerDavid Schulz <david.schulz@qt.io>2019-04-24 09:01:11 +0000
commit5c7d8a20c7fd46b89d8d5c7b5e57d868375bede3 (patch)
treed2ec5afb6855514beb60d7ae7f6688d07e630a7d /src/plugins/languageclient
parent4dcea384ddc8d3d37cf3df2ffd8f8178c2f4a7d6 (diff)
LanguageClient: move setting client relationship to manager
Change-Id: I9bf712227d44eada28abb18bbf641a2bfa835914 Reviewed-by: Christian Stenger <christian.stenger@qt.io>
Diffstat (limited to 'src/plugins/languageclient')
-rw-r--r--src/plugins/languageclient/languageclientmanager.cpp59
-rw-r--r--src/plugins/languageclient/languageclientmanager.h3
-rw-r--r--src/plugins/languageclient/languageclientsettings.cpp37
-rw-r--r--src/plugins/languageclient/languageclientsettings.h8
4 files changed, 68 insertions, 39 deletions
diff --git a/src/plugins/languageclient/languageclientmanager.cpp b/src/plugins/languageclient/languageclientmanager.cpp
index 26603aa584..6f3249b9ec 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 7a2fcc175d..93273e1595 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 c67b9a97a9..f39ccade06 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 ddc0a2e386..ac6d2e23c0 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);