From 605df0c4b6fe94282a9724422c90f0dabacf000a Mon Sep 17 00:00:00 2001 From: David Schulz Date: Fri, 19 Feb 2021 08:57:45 +0100 Subject: [PATCH] Java: use a temporary directory for the workspace Change-Id: Ie8fc01f680393f141f099f57b98eb16a10b37d7e Reviewed-by: Christian Stenger --- src/plugins/android/javalanguageserver.cpp | 41 ++++++++++++------- src/plugins/android/javalanguageserver.h | 2 +- .../languageclientinterface.cpp | 22 +++++----- .../languageclient/languageclientinterface.h | 19 ++++----- .../languageclient/languageclientsettings.cpp | 5 ++- 5 files changed, 51 insertions(+), 38 deletions(-) diff --git a/src/plugins/android/javalanguageserver.cpp b/src/plugins/android/javalanguageserver.cpp index d0b900a6066..f40656f6c1b 100644 --- a/src/plugins/android/javalanguageserver.cpp +++ b/src/plugins/android/javalanguageserver.cpp @@ -28,9 +28,11 @@ #include "androidconstants.h" #include +#include #include #include #include +#include #include #include @@ -67,7 +69,6 @@ JLSSettingsWidget::JLSSettingsWidget(const JLSSettings *settings, QWidget *paren , m_name(new QLineEdit(settings->m_name, this)) , m_java(new PathChooser(this)) , m_ls(new PathChooser(this)) - , m_workspace(new PathChooser(this)) { int row = 0; auto *mainLayout = new QGridLayout; @@ -88,11 +89,6 @@ JLSSettingsWidget::JLSSettingsWidget(const JLSSettings *settings, QWidget *paren m_ls->setPath(QDir::toNativeSeparators(settings->m_languageServer)); mainLayout->addWidget(m_ls, row, 1); - mainLayout->addWidget(new QLabel(tr("Workspace:")), ++row, 0); - m_workspace->setExpectedKind(Utils::PathChooser::Directory); - m_workspace->setPath(QDir::toNativeSeparators(settings->m_workspace)); - mainLayout->addWidget(m_workspace, row, 1); - setLayout(mainLayout); } @@ -117,9 +113,6 @@ bool JLSSettings::applyFromSettingsWidget(QWidget *widget) changed |= m_languageServer != jlswidget->languageServer(); m_languageServer = jlswidget->languageServer(); - changed |= m_workspace != jlswidget->workspace(); - m_workspace = jlswidget->workspace(); - changed |= m_executable != jlswidget->java(); m_executable = jlswidget->java(); @@ -130,8 +123,7 @@ bool JLSSettings::applyFromSettingsWidget(QWidget *widget) "-noverify " "-Xmx1G " "-jar \"%1\" " - "-configuration \"%2\" " - "-data \"%3\""; + "-configuration \"%2\""; QFileInfo languageServerFileInfo(m_languageServer); QDir configDir = languageServerFileInfo.absoluteDir(); @@ -145,7 +137,7 @@ bool JLSSettings::applyFromSettingsWidget(QWidget *widget) configDir.cd("config_mac"); } if (configDir.exists()) { - arguments = arguments.arg(m_languageServer, configDir.absolutePath(), m_workspace); + arguments = arguments.arg(m_languageServer, configDir.absolutePath()); changed |= m_arguments != arguments; m_arguments = arguments; } @@ -159,14 +151,13 @@ QWidget *JLSSettings::createSettingsWidget(QWidget *parent) const bool JLSSettings::isValid() const { - return StdIOSettings::isValid() && !m_languageServer.isEmpty() && !m_workspace.isEmpty(); + return StdIOSettings::isValid() && !m_languageServer.isEmpty(); } QVariantMap JLSSettings::toMap() const { QVariantMap map = StdIOSettings::toMap(); map.insert(languageServerKey, m_languageServer); - map.insert(workspaceKey, m_workspace); return map; } @@ -174,7 +165,6 @@ void JLSSettings::fromMap(const QVariantMap &map) { StdIOSettings::fromMap(map); m_languageServer = map[languageServerKey].toString(); - m_workspace = map[workspaceKey].toString(); } LanguageClient::BaseSettings *JLSSettings::copy() const @@ -182,6 +172,27 @@ LanguageClient::BaseSettings *JLSSettings::copy() const return new JLSSettings(*this); } +class JLSInterface : public LanguageClient::StdIOClientInterface +{ +public: + JLSInterface() = default; + + QString workspaceDir() const { return m_workspaceDir.path(); } + +private: + TemporaryDirectory m_workspaceDir = TemporaryDirectory("QtCreator-jls-XXXXXX"); +}; + +LanguageClient::BaseClientInterface *JLSSettings::createInterface() const +{ + auto interface = new JLSInterface(); + interface->setExecutable(m_executable); + QString arguments = this->arguments(); + arguments += QString(" -data \"%1\"").arg(interface->workspaceDir()); + interface->setArguments(arguments); + return interface; +} + class JLSClient : public LanguageClient::Client { public: diff --git a/src/plugins/android/javalanguageserver.h b/src/plugins/android/javalanguageserver.h index 58310070771..ab528cad15e 100644 --- a/src/plugins/android/javalanguageserver.h +++ b/src/plugins/android/javalanguageserver.h @@ -42,9 +42,9 @@ public: void fromMap(const QVariantMap &map) final; LanguageClient::BaseSettings *copy() const final; LanguageClient::Client *createClient(LanguageClient::BaseClientInterface *interface) const final; + LanguageClient::BaseClientInterface *createInterface() const override; QString m_languageServer; - QString m_workspace; private: JLSSettings(const JLSSettings &other) = default; diff --git a/src/plugins/languageclient/languageclientinterface.cpp b/src/plugins/languageclient/languageclientinterface.cpp index 91d2562e672..be1f2bdb20c 100644 --- a/src/plugins/languageclient/languageclientinterface.cpp +++ b/src/plugins/languageclient/languageclientinterface.cpp @@ -89,9 +89,7 @@ void BaseClientInterface::parseData(const QByteArray &data) } } -StdIOClientInterface::StdIOClientInterface(const QString &executable, const QString &arguments) - : m_executable(executable) - , m_arguments(arguments) +StdIOClientInterface::StdIOClientInterface() { connect(&m_process, &QProcess::readyReadStandardError, this, &StdIOClientInterface::readError); @@ -99,9 +97,6 @@ StdIOClientInterface::StdIOClientInterface(const QString &executable, const QStr this, &StdIOClientInterface::readOutput); connect(&m_process, QOverload::of(&QProcess::finished), this, &StdIOClientInterface::onProcessFinished); - - m_process.setArguments(Utils::QtcProcess::splitArgs(m_arguments)); - m_process.setProgram(m_executable); } StdIOClientInterface::~StdIOClientInterface() @@ -109,11 +104,6 @@ StdIOClientInterface::~StdIOClientInterface() Utils::SynchronousProcess::stopProcess(m_process); } -bool StdIOClientInterface::needsRestart(const StdIOSettings *settings) const -{ - return m_executable != settings->m_executable || m_arguments != settings->arguments(); -} - bool StdIOClientInterface::start() { m_process.start(); @@ -124,6 +114,16 @@ bool StdIOClientInterface::start() return true; } +void StdIOClientInterface::setExecutable(const QString &executable) +{ + m_process.setProgram(executable); +} + +void StdIOClientInterface::setArguments(const QString &arguments) +{ + m_process.setArguments(Utils::QtcProcess::splitArgs(arguments)); +} + void StdIOClientInterface::setWorkingDirectory(const QString &workingDirectory) { m_process.setWorkingDirectory(workingDirectory); diff --git a/src/plugins/languageclient/languageclientinterface.h b/src/plugins/languageclient/languageclientinterface.h index 182965ab882..69055bc49e4 100644 --- a/src/plugins/languageclient/languageclientinterface.h +++ b/src/plugins/languageclient/languageclientinterface.h @@ -25,6 +25,8 @@ #pragma once +#include "languageclient_global.h" + #include #include @@ -34,13 +36,13 @@ namespace LanguageClient { class StdIOSettings; -class BaseClientInterface : public QObject +class LANGUAGECLIENT_EXPORT BaseClientInterface : public QObject { Q_OBJECT public: BaseClientInterface(); - virtual ~BaseClientInterface(); + ~BaseClientInterface() override; void sendMessage(const LanguageServerProtocol::BaseMessage &message); virtual bool start() { return true; } @@ -61,23 +63,23 @@ private: LanguageServerProtocol::BaseMessage m_currentMessage; }; -class StdIOClientInterface : public BaseClientInterface +class LANGUAGECLIENT_EXPORT StdIOClientInterface : public BaseClientInterface { Q_OBJECT public: - StdIOClientInterface(const QString &executable, const QString &arguments); + StdIOClientInterface(); ~StdIOClientInterface() override; - StdIOClientInterface() = delete; StdIOClientInterface(const StdIOClientInterface &) = delete; StdIOClientInterface(StdIOClientInterface &&) = delete; StdIOClientInterface &operator=(const StdIOClientInterface &) = delete; StdIOClientInterface &operator=(StdIOClientInterface &&) = delete; - bool needsRestart(const StdIOSettings *settings) const; - bool start() override; + // These functions only have an effect if they are called before start + void setExecutable(const QString &executable); + void setArguments(const QString &arguments); void setWorkingDirectory(const QString &workingDirectory); protected: @@ -88,9 +90,6 @@ 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/languageclientsettings.cpp b/src/plugins/languageclient/languageclientsettings.cpp index 030fefef3d8..fff4b3d9c0e 100644 --- a/src/plugins/languageclient/languageclientsettings.cpp +++ b/src/plugins/languageclient/languageclientsettings.cpp @@ -722,7 +722,10 @@ Utils::CommandLine StdIOSettings::command() const BaseClientInterface *StdIOSettings::createInterface() const { - return new StdIOClientInterface(m_executable, arguments()); + auto interface = new StdIOClientInterface; + interface->setExecutable(m_executable); + interface->setArguments(arguments()); + return interface; } class JsonTreeItemDelegate : public QStyledItemDelegate