LanguageClient: Fix crashed client restart condition

Change-Id: I4b0195a512b6b1dcbcc6fd02f6014a27b4606ea0
Reviewed-by: Christian Stenger <christian.stenger@qt.io>
This commit is contained in:
David Schulz
2023-10-20 10:53:59 +02:00
parent 5f45c36b6f
commit a18ea390e1
5 changed files with 8 additions and 2 deletions

View File

@@ -574,6 +574,8 @@ QString Client::stateString() const
//: language client state //: language client state
case InitializeRequested: return Tr::tr("initialize requested"); case InitializeRequested: return Tr::tr("initialize requested");
//: language client state //: language client state
case FailedToInitialize: return Tr::tr("failed to initialize");
//: language client state
case Initialized: return Tr::tr("initialized"); case Initialized: return Tr::tr("initialized");
//: language client state //: language client state
case ShutdownRequested: return Tr::tr("shutdown requested"); case ShutdownRequested: return Tr::tr("shutdown requested");
@@ -1696,7 +1698,7 @@ bool ClientPrivate::reset()
void Client::setError(const QString &message) void Client::setError(const QString &message)
{ {
log(message); log(message);
d->m_state = Error; d->m_state = d->m_state < Initialized ? FailedToInitialize : Error;
} }
ProgressManager *Client::progressManager() ProgressManager *Client::progressManager()

View File

@@ -77,6 +77,7 @@ public:
enum State { enum State {
Uninitialized, Uninitialized,
InitializeRequested, InitializeRequested,
FailedToInitialize,
Initialized, Initialized,
ShutdownRequested, ShutdownRequested,
Shutdown, Shutdown,

View File

@@ -172,7 +172,8 @@ void LanguageClientManager::clientFinished(Client *client)
= managerInstance->m_clientForDocument.keys(client); = managerInstance->m_clientForDocument.keys(client);
if (unexpectedFinish) { if (unexpectedFinish) {
if (!PluginManager::isShuttingDown()) { 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; qCDebug(Log) << "restart unexpectedly finished client: " << client->name() << client;
client->log( client->log(
Tr::tr("Unexpectedly finished. Restarting in %1 seconds.").arg(restartTimeoutS)); Tr::tr("Unexpectedly finished. Restarting in %1 seconds.").arg(restartTimeoutS));

View File

@@ -784,6 +784,7 @@ void QmlJSEditorDocumentPrivate::settingsChanged()
case LanguageClient::Client::State::Initialized: case LanguageClient::Client::State::Initialized:
setSourcesWithCapabilities(client->capabilities()); setSourcesWithCapabilities(client->capabilities());
break; break;
case LanguageClient::Client::State::FailedToInitialize:
case LanguageClient::Client::State::Error: case LanguageClient::Client::State::Error:
qCWarning(qmllsLog) << "qmlls" << newQmlls << "requested for document" << q->filePath() qCWarning(qmllsLog) << "qmlls" << newQmlls << "requested for document" << q->filePath()
<< "had errors, skipping setSourcesWithCababilities"; << "had errors, skipping setSourcesWithCababilities";

View File

@@ -39,6 +39,7 @@ QmllsClient *QmllsClient::clientForQmlls(const FilePath &qmlls)
case Client::State::InitializeRequested: case Client::State::InitializeRequested:
case Client::State::Initialized: case Client::State::Initialized:
return client; return client;
case Client::State::FailedToInitialize:
case Client::State::ShutdownRequested: case Client::State::ShutdownRequested:
case Client::State::Shutdown: case Client::State::Shutdown:
case Client::State::Error: case Client::State::Error: