From a18ea390e1cf4f4f300053abb3b7328f99145335 Mon Sep 17 00:00:00 2001 From: David Schulz Date: Fri, 20 Oct 2023 10:53:59 +0200 Subject: [PATCH] LanguageClient: Fix crashed client restart condition Change-Id: I4b0195a512b6b1dcbcc6fd02f6014a27b4606ea0 Reviewed-by: Christian Stenger --- src/plugins/languageclient/client.cpp | 4 +++- src/plugins/languageclient/client.h | 1 + src/plugins/languageclient/languageclientmanager.cpp | 3 ++- src/plugins/qmljseditor/qmljseditordocument.cpp | 1 + src/plugins/qmljseditor/qmllsclient.cpp | 1 + 5 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/plugins/languageclient/client.cpp b/src/plugins/languageclient/client.cpp index 2fcfc0210fc..7583b065988 100644 --- a/src/plugins/languageclient/client.cpp +++ b/src/plugins/languageclient/client.cpp @@ -574,6 +574,8 @@ QString Client::stateString() const //: language client state case InitializeRequested: return Tr::tr("initialize requested"); //: language client state + case FailedToInitialize: return Tr::tr("failed to initialize"); + //: language client state case Initialized: return Tr::tr("initialized"); //: language client state case ShutdownRequested: return Tr::tr("shutdown requested"); @@ -1696,7 +1698,7 @@ bool ClientPrivate::reset() void Client::setError(const QString &message) { log(message); - d->m_state = Error; + d->m_state = d->m_state < Initialized ? FailedToInitialize : Error; } ProgressManager *Client::progressManager() diff --git a/src/plugins/languageclient/client.h b/src/plugins/languageclient/client.h index da8c8166644..aba2b996754 100644 --- a/src/plugins/languageclient/client.h +++ b/src/plugins/languageclient/client.h @@ -77,6 +77,7 @@ public: enum State { Uninitialized, InitializeRequested, + FailedToInitialize, Initialized, ShutdownRequested, Shutdown, diff --git a/src/plugins/languageclient/languageclientmanager.cpp b/src/plugins/languageclient/languageclientmanager.cpp index 839ececce7c..bb655e2d8f8 100644 --- a/src/plugins/languageclient/languageclientmanager.cpp +++ b/src/plugins/languageclient/languageclientmanager.cpp @@ -172,7 +172,8 @@ void LanguageClientManager::clientFinished(Client *client) = managerInstance->m_clientForDocument.keys(client); if (unexpectedFinish) { if (!PluginManager::isShuttingDown()) { - if (client->state() == Client::Initialized && client->reset()) { + const bool shouldRestart = client->state() > Client::FailedToInitialize; + if (shouldRestart && client->reset()) { qCDebug(Log) << "restart unexpectedly finished client: " << client->name() << client; client->log( Tr::tr("Unexpectedly finished. Restarting in %1 seconds.").arg(restartTimeoutS)); diff --git a/src/plugins/qmljseditor/qmljseditordocument.cpp b/src/plugins/qmljseditor/qmljseditordocument.cpp index 065e39e0c37..37f49d08712 100644 --- a/src/plugins/qmljseditor/qmljseditordocument.cpp +++ b/src/plugins/qmljseditor/qmljseditordocument.cpp @@ -784,6 +784,7 @@ void QmlJSEditorDocumentPrivate::settingsChanged() case LanguageClient::Client::State::Initialized: setSourcesWithCapabilities(client->capabilities()); break; + case LanguageClient::Client::State::FailedToInitialize: case LanguageClient::Client::State::Error: qCWarning(qmllsLog) << "qmlls" << newQmlls << "requested for document" << q->filePath() << "had errors, skipping setSourcesWithCababilities"; diff --git a/src/plugins/qmljseditor/qmllsclient.cpp b/src/plugins/qmljseditor/qmllsclient.cpp index 6777f267cc1..4cc8769bb1b 100644 --- a/src/plugins/qmljseditor/qmllsclient.cpp +++ b/src/plugins/qmljseditor/qmllsclient.cpp @@ -39,6 +39,7 @@ QmllsClient *QmllsClient::clientForQmlls(const FilePath &qmlls) case Client::State::InitializeRequested: case Client::State::Initialized: return client; + case Client::State::FailedToInitialize: case Client::State::ShutdownRequested: case Client::State::Shutdown: case Client::State::Error: