forked from qt-creator/qt-creator
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:
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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();
|
||||
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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();
|
||||
|
||||
|
||||
Reference in New Issue
Block a user