diff --git a/src/plugins/languageclient/baseclient.cpp b/src/plugins/languageclient/baseclient.cpp index 3c5569266cb..eb4a30d13c8 100644 --- a/src/plugins/languageclient/baseclient.cpp +++ b/src/plugins/languageclient/baseclient.cpp @@ -40,6 +40,7 @@ #include #include #include +#include #include #include @@ -671,7 +672,9 @@ void BaseClient::parseData(const QByteArray &data) } } -StdIOClient::StdIOClient(const QString &command, const QStringList &args) +StdIOClient::StdIOClient(const QString &executable, const QString &arguments) + : m_executable(executable) + , m_arguments(arguments) { connect(&m_process, &QProcess::readyReadStandardError, this, &StdIOClient::readError); @@ -680,8 +683,8 @@ StdIOClient::StdIOClient(const QString &command, const QStringList &args) connect(&m_process, static_cast(&QProcess::finished), this, &StdIOClient::onProcessFinished); - m_process.setArguments(args); - m_process.setProgram(command); + m_process.setArguments(Utils::QtcProcess::splitArgs(m_arguments)); + m_process.setProgram(m_executable); } StdIOClient::~StdIOClient() @@ -706,8 +709,8 @@ void StdIOClient::setWorkingDirectory(const QString &workingDirectory) bool StdIOClient::matches(const LanguageClientSettings &setting) { - return setting.m_executable == m_process.program() - && setting.m_arguments == m_process.arguments(); + return setting.m_executable == m_executable + && setting.m_arguments == m_executable; } void StdIOClient::sendData(const QByteArray &data) diff --git a/src/plugins/languageclient/baseclient.h b/src/plugins/languageclient/baseclient.h index e0626bd7c78..4bd733dfdd8 100644 --- a/src/plugins/languageclient/baseclient.h +++ b/src/plugins/languageclient/baseclient.h @@ -162,7 +162,7 @@ class StdIOClient : public BaseClient { Q_OBJECT public: - StdIOClient(const QString &command, const QStringList &args = QStringList()); + StdIOClient(const QString &executable, const QString &arguments); ~StdIOClient() override; StdIOClient() = delete; @@ -185,6 +185,9 @@ private: void readError(); void readOutput(); void onProcessFinished(int exitCode, QProcess::ExitStatus exitStatus); + + const QString m_executable; + const QString m_arguments; }; } // namespace LanguageClient diff --git a/src/plugins/languageclient/languageclientmanager.cpp b/src/plugins/languageclient/languageclientmanager.cpp index 68fe3ac72ff..0377f7587ec 100644 --- a/src/plugins/languageclient/languageclientmanager.cpp +++ b/src/plugins/languageclient/languageclientmanager.cpp @@ -170,6 +170,15 @@ void LanguageClientManager::removeMarks(const Core::Id &id) removeMarks(fileName, id); } +void LanguageClientManager::startClient(LanguageClientSettings setting) +{ + auto client = new StdIOClient(setting.m_executable, setting.m_arguments); + client->setName(setting.m_name); + if (setting.m_mimeType != noLanguageFilter) + client->setSupportedMimeType({setting.m_mimeType}); + startClient(client); +} + void LanguageClientManager::startClient(BaseClient *client) { managerInstance->m_clients.append(client); diff --git a/src/plugins/languageclient/languageclientmanager.h b/src/plugins/languageclient/languageclientmanager.h index 5c115643fd9..3ccf56c765f 100644 --- a/src/plugins/languageclient/languageclientmanager.h +++ b/src/plugins/languageclient/languageclientmanager.h @@ -26,6 +26,7 @@ #pragma once #include "baseclient.h" +#include "languageclientsettings.h" #include @@ -60,6 +61,7 @@ public: static void removeMarks(const Utils::FileName &fileName, const Core::Id &id); static void removeMarks(const Core::Id &id); + static void startClient(LanguageClientSettings setting); static void startClient(BaseClient *client); static QVector clients(); diff --git a/src/plugins/languageclient/languageclientsettings.cpp b/src/plugins/languageclient/languageclientsettings.cpp index f2ee17ffc2a..e43d064f01a 100644 --- a/src/plugins/languageclient/languageclientsettings.cpp +++ b/src/plugins/languageclient/languageclientsettings.cpp @@ -30,6 +30,7 @@ #include #include #include +#include #include #include @@ -243,7 +244,7 @@ QVariant LanguageClientSettingsModel::data(const QModelIndex &index, int role) c case DisplayNameColumn: return setting.m_name; case MimeTypeColumn: return setting.m_mimeType; case ExecutableColumn: return setting.m_executable; - case ArgumentsColumn: return setting.m_arguments.join(' '); + case ArgumentsColumn: return setting.m_arguments; } } else if (role == Qt::CheckStateRole && index.column() == EnabledColumn) { return setting.m_enabled ? Qt::Checked : Qt::Unchecked; @@ -299,7 +300,7 @@ bool LanguageClientSettingsModel::setData(const QModelIndex &index, const QVaria case DisplayNameColumn: setting.m_name = value.toString(); break; case MimeTypeColumn: setting.m_mimeType = value.toString(); break; case ExecutableColumn: setting.m_executable = value.toString(); break; - case ArgumentsColumn: setting.m_arguments = value.toString().split(' '); break; + case ArgumentsColumn: setting.m_arguments = value.toString(); break; default: return false; } @@ -364,13 +365,8 @@ void LanguageClientSettingsModel::applyChanges() for (auto interface : toShutdown) interface->shutdown(); for (auto setting : toStart) { - if (setting.isValid() && setting.m_enabled) { - auto client = new StdIOClient(setting.m_executable, setting.m_arguments); - client->setName(setting.m_name); - if (setting.m_mimeType != noLanguageFilter) - client->setSupportedMimeType({setting.m_mimeType}); - LanguageClientManager::startClient(client); - } + if (setting.isValid() && setting.m_enabled) + LanguageClientManager::startClient(setting); } } @@ -405,7 +401,7 @@ LanguageClientSettings LanguageClientSettings::fromMap(const QVariantMap &map) map[enabledKey].toBool(), map[mimeTypeKey].toString(), map[executableKey].toString(), - map[argumentsKey].toStringList() }; + map[argumentsKey].toString() }; } void LanguageClientSettings::init() diff --git a/src/plugins/languageclient/languageclientsettings.h b/src/plugins/languageclient/languageclientsettings.h index cefcd0f2c7c..152281de5a4 100644 --- a/src/plugins/languageclient/languageclientsettings.h +++ b/src/plugins/languageclient/languageclientsettings.h @@ -40,7 +40,7 @@ class LanguageClientSettings public: LanguageClientSettings() = default; LanguageClientSettings(const QString &name, bool enabled, const QString &mimeTypeName, - const QString &executable, const QStringList &arguments) + const QString &executable, const QString &arguments) : m_name(name) , m_enabled(enabled) , m_mimeType(mimeTypeName) @@ -51,7 +51,7 @@ public: bool m_enabled = true; QString m_mimeType = QLatin1String(noLanguageFilter); QString m_executable; - QStringList m_arguments; + QString m_arguments; bool isValid();