From bd716a16bbe29aa82ac4e1fd1cee893a588db3d0 Mon Sep 17 00:00:00 2001 From: Marcus Tillmanns Date: Tue, 6 Dec 2022 10:10:16 +0100 Subject: languageclient: Write errors to log file Helps the user to better understand why his language server might have a problem. Change-Id: I9440a28cb5d0d35808b497bcdcd545d7b10597a0 Reviewed-by: David Schulz --- .../languageclient/languageclientinterface.cpp | 21 +++++++++++++++++---- .../languageclient/languageclientinterface.h | 5 ++++- 2 files changed, 21 insertions(+), 5 deletions(-) (limited to 'src/plugins') diff --git a/src/plugins/languageclient/languageclientinterface.cpp b/src/plugins/languageclient/languageclientinterface.cpp index e83c1accd93..38d9db03ecf 100644 --- a/src/plugins/languageclient/languageclientinterface.cpp +++ b/src/plugins/languageclient/languageclientinterface.cpp @@ -3,8 +3,6 @@ #include "languageclientinterface.h" -#include "languageclientsettings.h" - #include using namespace LanguageServerProtocol; @@ -77,6 +75,13 @@ void BaseClientInterface::parseCurrentMessage() m_currentMessage = BaseMessage(); } +StdIOClientInterface::StdIOClientInterface() + : m_logFile("lspclient.XXXXXX.log") +{ + m_logFile.setAutoRemove(false); + m_logFile.open(); +} + StdIOClientInterface::~StdIOClientInterface() { delete m_process; @@ -96,10 +101,14 @@ void StdIOClientInterface::startImpl() this, &StdIOClientInterface::readOutput); connect(m_process, &QtcProcess::started, this, &StdIOClientInterface::started); connect(m_process, &QtcProcess::done, this, [this] { + m_logFile.flush(); if (m_process->result() != ProcessResult::FinishedWithSuccess) - emit error(m_process->exitMessage()); + emit error(QString("%1 (see logs in \"%2\")") + .arg(m_process->exitMessage()) + .arg(m_logFile.fileName())); emit finished(); }); + m_logFile.write(QString("Starting server: %1\nOutput:\n\n").arg(m_cmd.toUserOutput()).toUtf8()); m_process->setCommand(m_cmd); m_process->setWorkingDirectory(m_workingDirectory); if (m_env.isValid()) @@ -137,8 +146,12 @@ void StdIOClientInterface::sendData(const QByteArray &data) void StdIOClientInterface::readError() { QTC_ASSERT(m_process, return); + + const QByteArray stdErr = m_process->readAllStandardError(); + m_logFile.write(stdErr); + qCDebug(LOGLSPCLIENTV) << "StdIOClient std err:\n"; - qCDebug(LOGLSPCLIENTV).noquote() << m_process->readAllStandardError(); + qCDebug(LOGLSPCLIENTV).noquote() << stdErr; } void StdIOClientInterface::readOutput() diff --git a/src/plugins/languageclient/languageclientinterface.h b/src/plugins/languageclient/languageclientinterface.h index e0ee969d139..7e90c99c236 100644 --- a/src/plugins/languageclient/languageclientinterface.h +++ b/src/plugins/languageclient/languageclientinterface.h @@ -9,6 +9,7 @@ #include #include +#include #include @@ -50,7 +51,7 @@ class LANGUAGECLIENT_EXPORT StdIOClientInterface : public BaseClientInterface { Q_OBJECT public: - StdIOClientInterface() = default; + StdIOClientInterface(); ~StdIOClientInterface() override; StdIOClientInterface(const StdIOClientInterface &) = delete; @@ -75,6 +76,8 @@ protected: private: void readError(); void readOutput(); + + Utils::TemporaryFile m_logFile; }; } // namespace LanguageClient -- cgit v1.2.3