From 71da9d340dafbf4710d52579f8d5aaf4b751b756 Mon Sep 17 00:00:00 2001 From: David Schulz Date: Fri, 22 Jan 2021 13:57:15 +0100 Subject: [PATCH] LanguageClient: use less magic when changing settings Change-Id: I8c5f5a85bff7cf0cf0545199358c306f7f9b539e Reviewed-by: Christian Stenger --- src/plugins/languageclient/client.cpp | 8 -- src/plugins/languageclient/client.h | 2 - .../languageclient/languageclientmanager.cpp | 9 +- .../languageclient/languageclientsettings.cpp | 107 +++++++++++------- .../languageclient/languageclientsettings.h | 11 +- 5 files changed, 79 insertions(+), 58 deletions(-) diff --git a/src/plugins/languageclient/client.cpp b/src/plugins/languageclient/client.cpp index 664e332cef7..9392f848964 100644 --- a/src/plugins/languageclient/client.cpp +++ b/src/plugins/languageclient/client.cpp @@ -943,14 +943,6 @@ void Client::removeAssistProcessor(TextEditor::IAssistProcessor *processor) m_runningAssistProcessors.remove(processor); } -bool Client::needsRestart(const BaseSettings *settings) const -{ - QTC_ASSERT(settings, return false); - return m_languagFilter.mimeTypes != settings->m_languageFilter.mimeTypes - || m_languagFilter.filePattern != settings->m_languageFilter.filePattern - || m_initializationOptions != settings->initializationOptions(); -} - QList Client::diagnosticsAt(const DocumentUri &uri, const Range &range) const { return m_diagnosticManager.diagnosticsAt(uri, range); diff --git a/src/plugins/languageclient/client.h b/src/plugins/languageclient/client.h index 29cf89a5365..ea804ce6ffe 100644 --- a/src/plugins/languageclient/client.h +++ b/src/plugins/languageclient/client.h @@ -150,8 +150,6 @@ public: Utils::Id id() const { return m_id; } - bool needsRestart(const BaseSettings *) const; - QList diagnosticsAt( const LanguageServerProtocol::DocumentUri &uri, const LanguageServerProtocol::Range &range) const; diff --git a/src/plugins/languageclient/languageclientmanager.cpp b/src/plugins/languageclient/languageclientmanager.cpp index d8c55a12d8d..64f23ddc4f7 100644 --- a/src/plugins/languageclient/languageclientmanager.cpp +++ b/src/plugins/languageclient/languageclientmanager.cpp @@ -215,12 +215,10 @@ void LanguageClientManager::applySettings() QTC_ASSERT(managerInstance, return); qDeleteAll(managerInstance->m_currentSettings); managerInstance->m_currentSettings - = Utils::transform(LanguageClientSettings::currentPageSettings(), &BaseSettings::copy); + = Utils::transform(LanguageClientSettings::pageSettings(), &BaseSettings::copy); + const QList restarts = LanguageClientSettings::changedSettings(); LanguageClientSettings::toSettings(Core::ICore::settings(), managerInstance->m_currentSettings); - const QList restarts = Utils::filtered(managerInstance->m_currentSettings, - &BaseSettings::needsRestart); - for (BaseSettings *setting : restarts) { QList documents; for (Client *client : clientForSetting(setting)) { @@ -460,7 +458,8 @@ void LanguageClientManager::documentOpened(Core::IDocument *document) return; // check whether we have to start servers for this document - for (BaseSettings *setting : LanguageClientSettings::currentPageSettings()) { + const QList settings = LanguageClientSettings::pageSettings(); + for (BaseSettings *setting : settings) { QVector clients = clientForSetting(setting); if (setting->isValid() && setting->m_enabled && setting->m_languageFilter.isSupported(document)) { diff --git a/src/plugins/languageclient/languageclientsettings.cpp b/src/plugins/languageclient/languageclientsettings.cpp index 6c13a71f6b8..d2ade88b85e 100644 --- a/src/plugins/languageclient/languageclientsettings.cpp +++ b/src/plugins/languageclient/languageclientsettings.cpp @@ -153,11 +153,13 @@ public: void finish() override; QList settings() const; + QList changedSettings() const; void addSettings(BaseSettings *settings); void enableSettings(const QString &id); private: LanguageClientSettingsModel m_model; + QSet m_changedSettings; QPointer m_widget; }; @@ -231,9 +233,10 @@ void LanguageClientSettingsPageWidget::applyCurrentSettings() if (!m_currentSettings.setting) return; - m_currentSettings.setting->applyFromSettingsWidget(m_currentSettings.widget); - auto index = m_settings.indexForSetting(m_currentSettings.setting); - emit m_settings.dataChanged(index, index); + if (m_currentSettings.setting->applyFromSettingsWidget(m_currentSettings.widget)) { + auto index = m_settings.indexForSetting(m_currentSettings.setting); + emit m_settings.dataChanged(index, index); + } } void LanguageClientSettingsPageWidget::addItem() @@ -260,6 +263,10 @@ LanguageClientSettingsPage::LanguageClientSettingsPage() setDisplayCategory(QCoreApplication::translate("LanguageClient", Constants::LANGUAGECLIENT_SETTINGS_TR)); setCategoryIconPath(":/languageclient/images/settingscategory_languageclient.png"); + connect(&m_model, &LanguageClientSettingsModel::dataChanged, [this](const QModelIndex &index) { + if (BaseSettings *setting = m_model.settingForIndex(index)) + m_changedSettings << setting->m_id; + }); } LanguageClientSettingsPage::~LanguageClientSettingsPage() @@ -305,6 +312,7 @@ void LanguageClientSettingsPage::apply() void LanguageClientSettingsPage::finish() { m_model.reset(LanguageClientManager::currentSettings()); + m_changedSettings.clear(); } QList LanguageClientSettingsPage::settings() const @@ -312,6 +320,17 @@ QList LanguageClientSettingsPage::settings() const return m_model.settings(); } +QList LanguageClientSettingsPage::changedSettings() const +{ + QList result; + const QList &all = settings(); + for (BaseSettings *setting : all) { + if (m_changedSettings.contains(setting->m_id)) + result << setting; + } + return result; +} + void LanguageClientSettingsPage::addSettings(BaseSettings *settings) { m_model.insertSettings(settings); @@ -476,14 +495,28 @@ QJsonObject BaseSettings::initializationOptions() const expand(m_initializationOptions).toUtf8()).object(); } -void BaseSettings::applyFromSettingsWidget(QWidget *widget) +bool BaseSettings::applyFromSettingsWidget(QWidget *widget) { + bool changed = false; if (auto settingsWidget = qobject_cast(widget)) { - m_name = settingsWidget->name(); - m_languageFilter = settingsWidget->filter(); - m_startBehavior = settingsWidget->startupBehavior(); - m_initializationOptions = settingsWidget->initializationOptions(); + if (m_name != settingsWidget->name()) { + m_name = settingsWidget->name(); + changed = true; + } + if (m_languageFilter != settingsWidget->filter()) { + m_languageFilter = settingsWidget->filter(); + changed = true; + } + if (m_startBehavior != settingsWidget->startupBehavior()) { + m_startBehavior = settingsWidget->startupBehavior(); + changed = true; + } + if (m_initializationOptions != settingsWidget->initializationOptions()) { + m_initializationOptions = settingsWidget->initializationOptions(); + changed = true; + } } + return changed; } QWidget *BaseSettings::createSettingsWidget(QWidget *parent) const @@ -491,18 +524,6 @@ QWidget *BaseSettings::createSettingsWidget(QWidget *parent) const return new BaseSettingsWidget(this, parent); } -bool BaseSettings::needsRestart() const -{ - const QVector clients = LanguageClientManager::clientForSetting(this); - if (clients.isEmpty()) - return m_enabled; - if (!m_enabled) - return true; - return Utils::anyOf(clients, [this](const Client *client) { - return client->needsRestart(this); - }); -} - bool BaseSettings::isValid() const { return !m_name.isEmpty(); @@ -571,11 +592,16 @@ QList LanguageClientSettings::fromSettings(QSettings *settingsIn return settings; } -QList LanguageClientSettings::currentPageSettings() +QList LanguageClientSettings::pageSettings() { return settingsPage().settings(); } +QList LanguageClientSettings::changedSettings() +{ + return settingsPage().changedSettings(); +} + void LanguageClientSettings::addSettings(BaseSettings *settings) { settingsPage().addSettings(settings); @@ -597,13 +623,21 @@ void LanguageClientSettings::toSettings(QSettings *settings, settings->endGroup(); } -void StdIOSettings::applyFromSettingsWidget(QWidget *widget) +bool StdIOSettings::applyFromSettingsWidget(QWidget *widget) { + bool changed = false; if (auto settingsWidget = qobject_cast(widget)) { - BaseSettings::applyFromSettingsWidget(settingsWidget); - m_executable = settingsWidget->executable(); - m_arguments = settingsWidget->arguments(); + changed = BaseSettings::applyFromSettingsWidget(settingsWidget); + if (m_executable != settingsWidget->executable()) { + m_executable = settingsWidget->executable(); + changed = true; + } + if (m_arguments != settingsWidget->arguments()) { + m_arguments = settingsWidget->arguments(); + changed = true; + } } + return changed; } QWidget *StdIOSettings::createSettingsWidget(QWidget *parent) const @@ -611,19 +645,6 @@ QWidget *StdIOSettings::createSettingsWidget(QWidget *parent) const return new StdIOSettingsWidget(this, parent); } -bool StdIOSettings::needsRestart() const -{ - if (BaseSettings::needsRestart()) - return true; - return Utils::anyOf(LanguageClientManager::clientForSetting(this), - [this](QPointer client) { - if (auto stdIOInterface = qobject_cast( - client->clientInterface())) - return stdIOInterface->needsRestart(this); - return false; - }); -} - bool StdIOSettings::isValid() const { return BaseSettings::isValid() && !m_executable.isEmpty(); @@ -973,4 +994,14 @@ bool LanguageFilter::isSupported(const Core::IDocument *document) const return isSupported(document->filePath(), document->mimeType()); } +bool LanguageFilter::operator==(const LanguageFilter &other) const +{ + return this->filePattern == other.filePattern && this->mimeTypes == other.mimeTypes; +} + +bool LanguageFilter::operator!=(const LanguageFilter &other) const +{ + return this->filePattern != other.filePattern || this->mimeTypes != other.mimeTypes; +} + } // namespace LanguageClient diff --git a/src/plugins/languageclient/languageclientsettings.h b/src/plugins/languageclient/languageclientsettings.h index 6e7b5589ef4..c9efb78e48d 100644 --- a/src/plugins/languageclient/languageclientsettings.h +++ b/src/plugins/languageclient/languageclientsettings.h @@ -63,6 +63,8 @@ struct LANGUAGECLIENT_EXPORT LanguageFilter QStringList filePattern; bool isSupported(const Utils::FilePath &filePath, const QString &mimeType) const; bool isSupported(const Core::IDocument *document) const; + bool operator==(const LanguageFilter &other) const; + bool operator!=(const LanguageFilter &other) const; }; class LANGUAGECLIENT_EXPORT BaseSettings @@ -88,10 +90,9 @@ public: QJsonObject initializationOptions() const; - virtual void applyFromSettingsWidget(QWidget *widget); + virtual bool 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; Client *createClient(); virtual QVariantMap toMap() const; @@ -118,10 +119,9 @@ public: QString m_executable; QString m_arguments; - void applyFromSettingsWidget(QWidget *widget) override; + bool applyFromSettingsWidget(QWidget *widget) override; QWidget *createSettingsWidget(QWidget *parent = nullptr) const override; BaseSettings *copy() const override { return new StdIOSettings(*this); } - bool needsRestart() const override; bool isValid() const override; QVariantMap toMap() const override; void fromMap(const QVariantMap &map) override; @@ -142,7 +142,8 @@ class LanguageClientSettings public: static void init(); static QList fromSettings(QSettings *settings); - static QList currentPageSettings(); + static QList pageSettings(); + static QList changedSettings(); static void addSettings(BaseSettings *settings); static void enableSettings(const QString &id); static void toSettings(QSettings *settings, const QList &languageClientSettings);