Python: automatically disable outdated pyls settings

Change-Id: I301c6df3fdd9cf634a1abff20c6f24b9bc5fc23b
Reviewed-by: Christian Stenger <christian.stenger@qt.io>
This commit is contained in:
David Schulz
2022-06-22 13:46:50 +02:00
parent e2b99e6b31
commit 6c8605ced2
5 changed files with 48 additions and 13 deletions

View File

@@ -349,10 +349,10 @@ void LanguageClientManager::registerClientSettings(BaseSettings *settings)
managerInstance->applySettings(); managerInstance->applySettings();
} }
void LanguageClientManager::enableClientSettings(const QString &settingsId) void LanguageClientManager::enableClientSettings(const QString &settingsId, bool enable)
{ {
QTC_ASSERT(managerInstance, return); QTC_ASSERT(managerInstance, return);
LanguageClientSettings::enableSettings(settingsId); LanguageClientSettings::enableSettings(settingsId, enable);
managerInstance->applySettings(); managerInstance->applySettings();
} }

View File

@@ -80,7 +80,7 @@ public:
static void applySettings(); static void applySettings();
static QList<BaseSettings *> currentSettings(); static QList<BaseSettings *> currentSettings();
static void registerClientSettings(BaseSettings *settings); static void registerClientSettings(BaseSettings *settings);
static void enableClientSettings(const QString &settingsId); static void enableClientSettings(const QString &settingsId, bool enable = true);
static QList<Client *> clientsForSetting(const BaseSettings *setting); static QList<Client *> clientsForSetting(const BaseSettings *setting);
static const BaseSettings *settingForClient(Client *setting); static const BaseSettings *settingForClient(Client *setting);
static Client *clientForDocument(TextEditor::TextDocument *document); static Client *clientForDocument(TextEditor::TextDocument *document);

View File

@@ -114,7 +114,7 @@ public:
void reset(const QList<BaseSettings *> &settings); void reset(const QList<BaseSettings *> &settings);
QList<BaseSettings *> settings() const { return m_settings; } QList<BaseSettings *> settings() const { return m_settings; }
int insertSettings(BaseSettings *settings); int insertSettings(BaseSettings *settings);
void enableSetting(const QString &id); void enableSetting(const QString &id, bool enable = true);
QList<BaseSettings *> removed() const { return m_removed; } QList<BaseSettings *> removed() const { return m_removed; }
BaseSettings *settingForIndex(const QModelIndex &index) const; BaseSettings *settingForIndex(const QModelIndex &index) const;
QModelIndex indexForSetting(BaseSettings *setting) const; QModelIndex indexForSetting(BaseSettings *setting) const;
@@ -163,7 +163,7 @@ public:
QList<BaseSettings *> settings() const; QList<BaseSettings *> settings() const;
QList<BaseSettings *> changedSettings() const; QList<BaseSettings *> changedSettings() const;
void addSettings(BaseSettings *settings); void addSettings(BaseSettings *settings);
void enableSettings(const QString &id); void enableSettings(const QString &id, bool enable = true);
private: private:
LanguageClientSettingsModel m_model; LanguageClientSettingsModel m_model;
@@ -368,9 +368,9 @@ void LanguageClientSettingsPage::addSettings(BaseSettings *settings)
m_changedSettings << settings->m_id; 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() LanguageClientSettingsModel::~LanguageClientSettingsModel()
@@ -498,12 +498,14 @@ int LanguageClientSettingsModel::insertSettings(BaseSettings *settings)
return row; 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)); BaseSettings *setting = Utils::findOrDefault(m_settings, Utils::equal(&BaseSettings::m_id, id));
if (!setting) if (!setting)
return; return;
setting->m_enabled = true; if (setting->m_enabled == enable)
return;
setting->m_enabled = enable;
const QModelIndex &index = indexForSetting(setting); const QModelIndex &index = indexForSetting(setting);
if (index.isValid()) if (index.isValid())
emit dataChanged(index, index, {Qt::CheckStateRole}); emit dataChanged(index, index, {Qt::CheckStateRole});
@@ -687,9 +689,9 @@ void LanguageClientSettings::addSettings(BaseSettings *settings)
settingsPage().addSettings(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, void LanguageClientSettings::toSettings(QSettings *settings,

View File

@@ -166,7 +166,7 @@ public:
*/ */
static void registerClientType(const ClientType &type); static void registerClientType(const ClientType &type);
static void addSettings(BaseSettings *settings); 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<BaseSettings *> &languageClientSettings); static void toSettings(QSettings *settings, const QList<BaseSettings *> &languageClientSettings);
static bool outlineComboBoxIsSorted(); static bool outlineComboBoxIsSorted();

View File

@@ -26,10 +26,14 @@
#include "pythonsettings.h" #include "pythonsettings.h"
#include "pythonconstants.h" #include "pythonconstants.h"
#include "pythonplugin.h"
#include <coreplugin/dialogs/ioptionspage.h> #include <coreplugin/dialogs/ioptionspage.h>
#include <coreplugin/icore.h> #include <coreplugin/icore.h>
#include <extensionsystem/pluginmanager.h>
#include <languageclient/languageclient_global.h>
#include <languageclient/languageclientsettings.h> #include <languageclient/languageclientsettings.h>
#include <languageclient/languageclientmanager.h>
#include <texteditor/textdocument.h> #include <texteditor/textdocument.h>
#include <texteditor/texteditor.h> #include <texteditor/texteditor.h>
#include <utils/algorithm.h> #include <utils/algorithm.h>
@@ -643,6 +647,33 @@ static QString defaultPylsConfiguration()
return QString::fromUtf8(QJsonDocument(configuration).toJson()); return QString::fromUtf8(QJsonDocument(configuration).toJson());
} }
static void disableOutdatedPylsNow()
{
using namespace LanguageClient;
const QList<BaseSettings *>
settings = LanguageClientSettings::pageSettings();
for (const BaseSettings *setting : settings) {
if (setting->m_settingsTypeId != LanguageClient::Constants::LANGUAGECLIENT_STDIO_SETTINGS_ID)
continue;
auto stdioSetting = static_cast<const StdIOSettings *>(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) static SavedSettings fromSettings(QSettings *settings)
{ {
SavedSettings result; SavedSettings result;
@@ -674,7 +705,9 @@ static SavedSettings fromSettings(QSettings *settings)
result.defaultId = settings->value(defaultKey).toString(); result.defaultId = settings->value(defaultKey).toString();
QVariant pylsEnabled = settings->value(pylsEnabledKey); QVariant pylsEnabled = settings->value(pylsEnabledKey);
if (!pylsEnabled.isNull()) if (pylsEnabled.isNull())
disableOutdatedPyls();
else
result.pylsEnabled = pylsEnabled.toBool(); result.pylsEnabled = pylsEnabled.toBool();
const QVariant pylsConfiguration = settings->value(pylsConfigurationKey); const QVariant pylsConfiguration = settings->value(pylsConfigurationKey);
if (!pylsConfiguration.isNull()) if (!pylsConfiguration.isNull())