From 6c8605ced2a7bc0f41d3ddad2975d6f8c38b3da6 Mon Sep 17 00:00:00 2001 From: David Schulz Date: Wed, 22 Jun 2022 13:46:50 +0200 Subject: [PATCH] Python: automatically disable outdated pyls settings Change-Id: I301c6df3fdd9cf634a1abff20c6f24b9bc5fc23b Reviewed-by: Christian Stenger --- .../languageclient/languageclientmanager.cpp | 4 +-- .../languageclient/languageclientmanager.h | 2 +- .../languageclient/languageclientsettings.cpp | 18 +++++----- .../languageclient/languageclientsettings.h | 2 +- src/plugins/python/pythonsettings.cpp | 35 ++++++++++++++++++- 5 files changed, 48 insertions(+), 13 deletions(-) diff --git a/src/plugins/languageclient/languageclientmanager.cpp b/src/plugins/languageclient/languageclientmanager.cpp index 0c5872486c5..88f9257327b 100644 --- a/src/plugins/languageclient/languageclientmanager.cpp +++ b/src/plugins/languageclient/languageclientmanager.cpp @@ -349,10 +349,10 @@ void LanguageClientManager::registerClientSettings(BaseSettings *settings) managerInstance->applySettings(); } -void LanguageClientManager::enableClientSettings(const QString &settingsId) +void LanguageClientManager::enableClientSettings(const QString &settingsId, bool enable) { QTC_ASSERT(managerInstance, return); - LanguageClientSettings::enableSettings(settingsId); + LanguageClientSettings::enableSettings(settingsId, enable); managerInstance->applySettings(); } diff --git a/src/plugins/languageclient/languageclientmanager.h b/src/plugins/languageclient/languageclientmanager.h index d1b1467f6ab..7fb7c045512 100644 --- a/src/plugins/languageclient/languageclientmanager.h +++ b/src/plugins/languageclient/languageclientmanager.h @@ -80,7 +80,7 @@ public: static void applySettings(); static QList currentSettings(); static void registerClientSettings(BaseSettings *settings); - static void enableClientSettings(const QString &settingsId); + static void enableClientSettings(const QString &settingsId, bool enable = true); static QList clientsForSetting(const BaseSettings *setting); static const BaseSettings *settingForClient(Client *setting); static Client *clientForDocument(TextEditor::TextDocument *document); diff --git a/src/plugins/languageclient/languageclientsettings.cpp b/src/plugins/languageclient/languageclientsettings.cpp index b928e68e5a2..737fe23b8f1 100644 --- a/src/plugins/languageclient/languageclientsettings.cpp +++ b/src/plugins/languageclient/languageclientsettings.cpp @@ -114,7 +114,7 @@ public: void reset(const QList &settings); QList settings() const { return m_settings; } int insertSettings(BaseSettings *settings); - void enableSetting(const QString &id); + void enableSetting(const QString &id, bool enable = true); QList removed() const { return m_removed; } BaseSettings *settingForIndex(const QModelIndex &index) const; QModelIndex indexForSetting(BaseSettings *setting) const; @@ -163,7 +163,7 @@ public: QList settings() const; QList changedSettings() const; void addSettings(BaseSettings *settings); - void enableSettings(const QString &id); + void enableSettings(const QString &id, bool enable = true); private: LanguageClientSettingsModel m_model; @@ -368,9 +368,9 @@ void LanguageClientSettingsPage::addSettings(BaseSettings *settings) m_changedSettings << settings->m_id; } -void LanguageClientSettingsPage::enableSettings(const QString &id) +void LanguageClientSettingsPage::enableSettings(const QString &id, bool enable) { - m_model.enableSetting(id); + m_model.enableSetting(id, enable); } LanguageClientSettingsModel::~LanguageClientSettingsModel() @@ -498,12 +498,14 @@ int LanguageClientSettingsModel::insertSettings(BaseSettings *settings) return row; } -void LanguageClientSettingsModel::enableSetting(const QString &id) +void LanguageClientSettingsModel::enableSetting(const QString &id, bool enable) { BaseSettings *setting = Utils::findOrDefault(m_settings, Utils::equal(&BaseSettings::m_id, id)); if (!setting) return; - setting->m_enabled = true; + if (setting->m_enabled == enable) + return; + setting->m_enabled = enable; const QModelIndex &index = indexForSetting(setting); if (index.isValid()) emit dataChanged(index, index, {Qt::CheckStateRole}); @@ -687,9 +689,9 @@ void LanguageClientSettings::addSettings(BaseSettings *settings) settingsPage().addSettings(settings); } -void LanguageClientSettings::enableSettings(const QString &id) +void LanguageClientSettings::enableSettings(const QString &id, bool enable) { - settingsPage().enableSettings(id); + settingsPage().enableSettings(id, enable); } void LanguageClientSettings::toSettings(QSettings *settings, diff --git a/src/plugins/languageclient/languageclientsettings.h b/src/plugins/languageclient/languageclientsettings.h index c9a93414914..bd48eb368bc 100644 --- a/src/plugins/languageclient/languageclientsettings.h +++ b/src/plugins/languageclient/languageclientsettings.h @@ -166,7 +166,7 @@ public: */ static void registerClientType(const ClientType &type); static void addSettings(BaseSettings *settings); - static void enableSettings(const QString &id); + static void enableSettings(const QString &id, bool enable = true); static void toSettings(QSettings *settings, const QList &languageClientSettings); static bool outlineComboBoxIsSorted(); diff --git a/src/plugins/python/pythonsettings.cpp b/src/plugins/python/pythonsettings.cpp index c8e77b0e538..3e6dbf27d4c 100644 --- a/src/plugins/python/pythonsettings.cpp +++ b/src/plugins/python/pythonsettings.cpp @@ -26,10 +26,14 @@ #include "pythonsettings.h" #include "pythonconstants.h" +#include "pythonplugin.h" #include #include +#include +#include #include +#include #include #include #include @@ -643,6 +647,33 @@ static QString defaultPylsConfiguration() return QString::fromUtf8(QJsonDocument(configuration).toJson()); } +static void disableOutdatedPylsNow() +{ + using namespace LanguageClient; + const QList + settings = LanguageClientSettings::pageSettings(); + for (const BaseSettings *setting : settings) { + if (setting->m_settingsTypeId != LanguageClient::Constants::LANGUAGECLIENT_STDIO_SETTINGS_ID) + continue; + auto stdioSetting = static_cast(setting); + if (stdioSetting->arguments().startsWith("-m pyls") + && stdioSetting->m_languageFilter.isSupported("foo.py", Constants::C_PY_MIMETYPE)) { + LanguageClientManager::enableClientSettings(stdioSetting->m_id, false); + } + } +} + +static void disableOutdatedPyls() +{ + using namespace ExtensionSystem; + if (PluginManager::isInitializationDone()) { + disableOutdatedPylsNow(); + } else { + QObject::connect(PluginManager::instance(), &PluginManager::initializationDone, + PythonPlugin::instance(), &disableOutdatedPylsNow); + } +} + static SavedSettings fromSettings(QSettings *settings) { SavedSettings result; @@ -674,7 +705,9 @@ static SavedSettings fromSettings(QSettings *settings) result.defaultId = settings->value(defaultKey).toString(); QVariant pylsEnabled = settings->value(pylsEnabledKey); - if (!pylsEnabled.isNull()) + if (pylsEnabled.isNull()) + disableOutdatedPyls(); + else result.pylsEnabled = pylsEnabled.toBool(); const QVariant pylsConfiguration = settings->value(pylsConfigurationKey); if (!pylsConfiguration.isNull())