LanguageClient: Fix client restart after crash

Do not clear open documents but disconnect and deactivate them,
so they can be correctly reopened once the server is restarted.

Change-Id: I0f61a5461c020865e61d9808e8c645ea842f64ad
Fixes: QTCREATORBUG-23648
Reviewed-by: Christian Stenger <christian.stenger@qt.io>
This commit is contained in:
David Schulz
2020-02-25 13:30:20 +01:00
parent 45381e9d04
commit 8625bbfe5a
2 changed files with 4 additions and 1 deletions

View File

@@ -808,11 +808,12 @@ bool Client::reset()
m_responseHandlers.clear(); m_responseHandlers.clear();
m_clientInterface->resetBuffer(); m_clientInterface->resetBuffer();
updateEditorToolBar(m_openedDocument.keys()); updateEditorToolBar(m_openedDocument.keys());
m_openedDocument.clear();
m_serverCapabilities = ServerCapabilities(); m_serverCapabilities = ServerCapabilities();
m_dynamicCapabilities.reset(); m_dynamicCapabilities.reset();
for (const DocumentUri &uri : m_diagnostics.keys()) for (const DocumentUri &uri : m_diagnostics.keys())
removeDiagnostics(uri); removeDiagnostics(uri);
for (TextEditor::TextDocument *document : m_openedDocument.keys())
document->disconnect(this);
for (TextEditor::TextDocument *document : m_resetAssistProvider.keys()) for (TextEditor::TextDocument *document : m_resetAssistProvider.keys())
resetAssistProviders(document); resetAssistProviders(document);
return true; return true;

View File

@@ -366,6 +366,8 @@ void LanguageClientManager::clientFinished(Client *client)
client->log(tr("Unexpectedly finished. Restarting in %1 seconds.").arg(restartTimeoutS), client->log(tr("Unexpectedly finished. Restarting in %1 seconds.").arg(restartTimeoutS),
Core::MessageManager::Flash); Core::MessageManager::Flash);
QTimer::singleShot(restartTimeoutS * 1000, client, [client]() { startClient(client); }); QTimer::singleShot(restartTimeoutS * 1000, client, [client]() { startClient(client); });
for (TextEditor::TextDocument *document : m_clientForDocument.keys(client))
client->deactivateDocument(document);
} else { } else {
if (unexpectedFinish && !m_shuttingDown) if (unexpectedFinish && !m_shuttingDown)
client->log(tr("Unexpectedly finished."), Core::MessageManager::Flash); client->log(tr("Unexpectedly finished."), Core::MessageManager::Flash);