LanguageClient: use less magic when changing settings

Change-Id: I8c5f5a85bff7cf0cf0545199358c306f7f9b539e
Reviewed-by: Christian Stenger <christian.stenger@qt.io>
This commit is contained in:
David Schulz
2021-01-22 13:57:15 +01:00
parent 785932f0f1
commit 71da9d340d
5 changed files with 79 additions and 58 deletions

View File

@@ -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<Diagnostic> Client::diagnosticsAt(const DocumentUri &uri, const Range &range) const
{
return m_diagnosticManager.diagnosticsAt(uri, range);

View File

@@ -150,8 +150,6 @@ public:
Utils::Id id() const { return m_id; }
bool needsRestart(const BaseSettings *) const;
QList<LanguageServerProtocol::Diagnostic> diagnosticsAt(
const LanguageServerProtocol::DocumentUri &uri,
const LanguageServerProtocol::Range &range) const;

View File

@@ -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<BaseSettings *> restarts = LanguageClientSettings::changedSettings();
LanguageClientSettings::toSettings(Core::ICore::settings(), managerInstance->m_currentSettings);
const QList<BaseSettings *> restarts = Utils::filtered(managerInstance->m_currentSettings,
&BaseSettings::needsRestart);
for (BaseSettings *setting : restarts) {
QList<TextEditor::TextDocument *> 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<BaseSettings *> settings = LanguageClientSettings::pageSettings();
for (BaseSettings *setting : settings) {
QVector<Client *> clients = clientForSetting(setting);
if (setting->isValid() && setting->m_enabled
&& setting->m_languageFilter.isSupported(document)) {

View File

@@ -153,11 +153,13 @@ public:
void finish() override;
QList<BaseSettings *> settings() const;
QList<BaseSettings *> changedSettings() const;
void addSettings(BaseSettings *settings);
void enableSettings(const QString &id);
private:
LanguageClientSettingsModel m_model;
QSet<QString> m_changedSettings;
QPointer<LanguageClientSettingsPageWidget> 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<BaseSettings *> LanguageClientSettingsPage::settings() const
@@ -312,6 +320,17 @@ QList<BaseSettings *> LanguageClientSettingsPage::settings() const
return m_model.settings();
}
QList<BaseSettings *> LanguageClientSettingsPage::changedSettings() const
{
QList<BaseSettings *> result;
const QList<BaseSettings *> &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<BaseSettingsWidget *>(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<Client *> 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<BaseSettings *> LanguageClientSettings::fromSettings(QSettings *settingsIn
return settings;
}
QList<BaseSettings *> LanguageClientSettings::currentPageSettings()
QList<BaseSettings *> LanguageClientSettings::pageSettings()
{
return settingsPage().settings();
}
QList<BaseSettings *> 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<StdIOSettingsWidget *>(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> client) {
if (auto stdIOInterface = qobject_cast<const StdIOClientInterface *>(
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

View File

@@ -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<BaseSettings *> fromSettings(QSettings *settings);
static QList<BaseSettings *> currentPageSettings();
static QList<BaseSettings *> pageSettings();
static QList<BaseSettings *> changedSettings();
static void addSettings(BaseSettings *settings);
static void enableSettings(const QString &id);
static void toSettings(QSettings *settings, const QList<BaseSettings *> &languageClientSettings);