LSP: store settings on the heap

In preperation for specialized settings other than the stdio client

Change-Id: I20ca33fd1d714e4e0ca527de86261c0a58740d15
Reviewed-by: Eike Ziller <eike.ziller@qt.io>
This commit is contained in:
David Schulz
2018-09-17 14:37:34 +02:00
parent 1b2ad0e989
commit d7b4f3fcf2
4 changed files with 33 additions and 43 deletions

View File

@@ -771,10 +771,9 @@ void StdIOClient::setWorkingDirectory(const QString &workingDirectory)
m_process.setWorkingDirectory(workingDirectory); m_process.setWorkingDirectory(workingDirectory);
} }
bool StdIOClient::matches(const LanguageClientSettings &setting) bool StdIOClient::matches(const LanguageClientSettings *setting)
{ {
return setting.m_executable == m_executable return setting->m_executable == m_executable && setting->m_arguments == m_executable;
&& setting.m_arguments == m_executable;
} }
void StdIOClient::sendData(const QByteArray &data) void StdIOClient::sendData(const QByteArray &data)

View File

@@ -113,7 +113,7 @@ public:
Core::Id id() const { return m_id; } Core::Id id() const { return m_id; }
virtual bool start() { return true; } virtual bool start() { return true; }
virtual bool matches(const LanguageClientSettings &/*setting*/) { return false; } virtual bool matches(const LanguageClientSettings * /*setting*/) { return false; }
virtual bool reset(); virtual bool reset();
void log(const QString &message, void log(const QString &message,
@@ -179,7 +179,7 @@ public:
void setWorkingDirectory(const QString &workingDirectory); void setWorkingDirectory(const QString &workingDirectory);
bool matches(const LanguageClientSettings &setting) override; bool matches(const LanguageClientSettings *setting) override;
protected: protected:
void sendData(const QByteArray &data) final; void sendData(const QByteArray &data) final;

View File

@@ -85,7 +85,7 @@ public:
}; };
private: private:
QList<LanguageClientSettings> m_settings; QList<LanguageClientSettings *> m_settings;
}; };
class LanguageClientSettingsPageWidget : public QWidget class LanguageClientSettingsPageWidget : public QWidget
@@ -238,16 +238,17 @@ QVariant LanguageClientSettingsModel::data(const QModelIndex &index, int role) c
{ {
if (!index.isValid()) if (!index.isValid())
return QVariant(); return QVariant();
LanguageClientSettings setting = m_settings[index.row()]; LanguageClientSettings *setting = m_settings[index.row()];
QTC_ASSERT(setting, return false);
if (role == Qt::DisplayRole || role == Qt::EditRole) { if (role == Qt::DisplayRole || role == Qt::EditRole) {
switch (index.column()) { switch (index.column()) {
case DisplayNameColumn: return setting.m_name; case DisplayNameColumn: return setting->m_name;
case MimeTypeColumn: return setting.m_mimeType; case MimeTypeColumn: return setting->m_mimeType;
case ExecutableColumn: return setting.m_executable; case ExecutableColumn: return setting->m_executable;
case ArgumentsColumn: return setting.m_arguments; case ArgumentsColumn: return setting->m_arguments;
} }
} else if (role == Qt::CheckStateRole && index.column() == EnabledColumn) { } else if (role == Qt::CheckStateRole && index.column() == EnabledColumn) {
return setting.m_enabled ? Qt::Checked : Qt::Unchecked; return setting->m_enabled ? Qt::Checked : Qt::Unchecked;
} }
return QVariant(); return QVariant();
} }
@@ -271,10 +272,10 @@ bool LanguageClientSettingsModel::removeRows(int row, int count, const QModelInd
{ {
if (row >= int(m_settings.size())) if (row >= int(m_settings.size()))
return false; return false;
const auto first = m_settings.begin() + row;
const int end = qMin(row + count - 1, int(m_settings.size()) - 1); const int end = qMin(row + count - 1, int(m_settings.size()) - 1);
beginRemoveRows(parent, row, end); beginRemoveRows(parent, row, end);
m_settings.erase(first, first + count); for (auto i = end; i >= row; --i)
delete m_settings.takeAt(i);
endRemoveRows(); endRemoveRows();
return true; return true;
} }
@@ -285,7 +286,7 @@ bool LanguageClientSettingsModel::insertRows(int row, int count, const QModelInd
return false; return false;
beginInsertRows(parent, row, row + count - 1); beginInsertRows(parent, row, row + count - 1);
for (int i = 0; i < count; ++i) for (int i = 0; i < count; ++i)
m_settings.insert(row + i, {}); m_settings.insert(row + i, new LanguageClientSettings());
endInsertRows(); endInsertRows();
return true; return true;
} }
@@ -294,13 +295,14 @@ bool LanguageClientSettingsModel::setData(const QModelIndex &index, const QVaria
{ {
if (!index.isValid()) if (!index.isValid())
return false; return false;
LanguageClientSettings &setting = m_settings[index.row()]; LanguageClientSettings *setting = m_settings[index.row()];
QTC_ASSERT(setting, return false);
if (role == Qt::DisplayRole || role == Qt::EditRole) { if (role == Qt::DisplayRole || role == Qt::EditRole) {
switch (index.column()) { switch (index.column()) {
case DisplayNameColumn: setting.m_name = value.toString(); break; case DisplayNameColumn: setting->m_name = value.toString(); break;
case MimeTypeColumn: setting.m_mimeType = value.toString(); break; case MimeTypeColumn: setting->m_mimeType = value.toString(); break;
case ExecutableColumn: setting.m_executable = value.toString(); break; case ExecutableColumn: setting->m_executable = value.toString(); break;
case ArgumentsColumn: setting.m_arguments = value.toString(); break; case ArgumentsColumn: setting->m_arguments = value.toString(); break;
default: default:
return false; return false;
} }
@@ -308,7 +310,7 @@ bool LanguageClientSettingsModel::setData(const QModelIndex &index, const QVaria
return true; return true;
} }
if (role == Qt::CheckStateRole && index.column() == EnabledColumn) { if (role == Qt::CheckStateRole && index.column() == EnabledColumn) {
setting.m_enabled = value.toBool(); setting->m_enabled = value.toBool();
emit dataChanged(index, index, { Qt::CheckStateRole }); emit dataChanged(index, index, { Qt::CheckStateRole });
return true; return true;
} }
@@ -327,8 +329,8 @@ void LanguageClientSettingsModel::toSettings(QSettings *settings) const
{ {
settings->beginGroup(settingsGroupKey); settings->beginGroup(settingsGroupKey);
settings->setValue(clientsKey, Utils::transform(m_settings, settings->setValue(clientsKey, Utils::transform(m_settings,
[](const LanguageClientSettings & setting){ [](const LanguageClientSettings *setting){
return QVariant(setting.toMap()); return QVariant(setting->toMap());
})); }));
settings->endGroup(); settings->endGroup();
} }
@@ -339,7 +341,7 @@ void LanguageClientSettingsModel::fromSettings(QSettings *settings)
auto variants = settings->value(clientsKey).toList(); auto variants = settings->value(clientsKey).toList();
m_settings.reserve(variants.size()); m_settings.reserve(variants.size());
m_settings = Utils::transform(variants, [](const QVariant& var){ m_settings = Utils::transform(variants, [](const QVariant& var){
return LanguageClientSettings::fromMap(var.toMap()); return new LanguageClientSettings(LanguageClientSettings::fromMap(var.toMap()));
}); });
settings->endGroup(); settings->endGroup();
} }
@@ -348,17 +350,17 @@ void LanguageClientSettingsModel::applyChanges()
{ {
const QVector<BaseClient *> interfaces(LanguageClientManager::clients()); const QVector<BaseClient *> interfaces(LanguageClientManager::clients());
QVector<BaseClient *> toShutdown; QVector<BaseClient *> toShutdown;
QList<LanguageClientSettings> toStart = m_settings; QList<LanguageClientSettings *> toStart = m_settings;
// check currently registered interfaces // check currently registered interfaces
for (auto interface : interfaces) { for (auto interface : interfaces) {
auto setting = Utils::findOr(m_settings, LanguageClientSettings(), auto setting = Utils::findOr(m_settings, nullptr,
[interface](const LanguageClientSettings &setting){ [interface](const LanguageClientSettings *setting){
return interface->matches(setting); return interface->matches(setting);
}); });
if (setting.isValid() && setting.m_enabled) { if (setting && setting->isValid() && setting->m_enabled) {
toStart.removeAll(setting); toStart.removeAll(setting);
if (!interface->isSupportedMimeType(setting.m_mimeType)) if (!interface->isSupportedMimeType(setting->m_mimeType))
interface->setSupportedMimeType({setting.m_mimeType}); interface->setSupportedMimeType({setting->m_mimeType});
} else { } else {
toShutdown << interface; toShutdown << interface;
} }
@@ -370,8 +372,8 @@ void LanguageClientSettingsModel::applyChanges()
LanguageClientManager::deleteClient(interface); LanguageClientManager::deleteClient(interface);
} }
for (auto setting : toStart) { for (auto setting : toStart) {
if (setting.isValid() && setting.m_enabled) if (setting && setting->isValid() && setting->m_enabled)
LanguageClientManager::startClient(setting.createClient()); LanguageClientManager::startClient(setting->createClient());
} }
} }
@@ -380,15 +382,6 @@ bool LanguageClientSettings::isValid()
return !m_name.isEmpty() && !m_executable.isEmpty() && QFile::exists(m_executable); return !m_name.isEmpty() && !m_executable.isEmpty() && QFile::exists(m_executable);
} }
bool LanguageClientSettings::operator==(const LanguageClientSettings &other) const
{
return m_name == other.m_name
&& m_enabled == other.m_enabled
&& m_mimeType == other.m_mimeType
&& m_executable == other.m_executable
&& m_arguments == other.m_arguments;
}
BaseClient *LanguageClientSettings::createClient() BaseClient *LanguageClientSettings::createClient()
{ {
auto client = new StdIOClient(m_executable, m_arguments); auto client = new StdIOClient(m_executable, m_arguments);

View File

@@ -57,8 +57,6 @@ public:
bool isValid(); bool isValid();
bool operator==(const LanguageClientSettings &other) const;
BaseClient *createClient(); BaseClient *createClient();
QVariantMap toMap() const; QVariantMap toMap() const;