LSP: use QtcProcess::splitArgs for language server arguments

Also store the executable and arguments in the stdio client to get a
more accurate comparison of clients.

Change-Id: I84fdd4ea5f32b17198d3f08e7f5d494f7fbe67dc
Reviewed-by: Eike Ziller <eike.ziller@qt.io>
This commit is contained in:
David Schulz
2018-09-10 15:15:37 +02:00
parent 08508522fe
commit 87381bbf90
6 changed files with 31 additions and 18 deletions

View File

@@ -40,6 +40,7 @@
#include <projectexplorer/project.h>
#include <projectexplorer/session.h>
#include <utils/mimetypes/mimedatabase.h>
#include <utils/qtcprocess.h>
#include <utils/synchronousprocess.h>
#include <QDebug>
@@ -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<void(QProcess::*)(int, QProcess::ExitStatus)>(&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)

View File

@@ -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

View File

@@ -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);

View File

@@ -26,6 +26,7 @@
#pragma once
#include "baseclient.h"
#include "languageclientsettings.h"
#include <coreplugin/id.h>
@@ -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<BaseClient *> clients();

View File

@@ -30,6 +30,7 @@
#include <coreplugin/icore.h>
#include <utils/algorithm.h>
#include <utils/delegates.h>
#include <utils/qtcprocess.h>
#include <utils/mimetypes/mimedatabase.h>
#include <languageserverprotocol/lsptypes.h>
@@ -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()

View File

@@ -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();