forked from qt-creator/qt-creator
LanguageClient: use less magic when changing settings
Change-Id: I8c5f5a85bff7cf0cf0545199358c306f7f9b539e Reviewed-by: Christian Stenger <christian.stenger@qt.io>
This commit is contained in:
@@ -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);
|
||||
|
@@ -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;
|
||||
|
@@ -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)) {
|
||||
|
@@ -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
|
||||
|
@@ -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);
|
||||
|
Reference in New Issue
Block a user