LanguageClient: fix multiple crashes in languageClient

The temporary containers are needed in some places because the content of the containers change
while iterating over them.
partially reverts: cf010911f7

Change-Id: I4d6df987b9e5382b6b18fa659b1174ca6919a02e
Reviewed-by: Christian Stenger <christian.stenger@qt.io>
This commit is contained in:
David Schulz
2021-01-22 14:26:11 +01:00
parent fecb0a4c83
commit 4f1c5bacb9
3 changed files with 9 additions and 8 deletions

View File

@@ -111,8 +111,9 @@ Client::~Client()
using namespace TextEditor; using namespace TextEditor;
// FIXME: instead of replacing the completion provider in the text document store the // FIXME: instead of replacing the completion provider in the text document store the
// completion provider as a prioritised list in the text document // completion provider as a prioritised list in the text document
for (auto it = m_resetAssistProvider.cbegin(); it != m_resetAssistProvider.cend(); ++it) // temporary container needed since m_resetAssistProvider is changed in resetAssistProviders
resetAssistProviders(it.key()); for (TextDocument *document : m_resetAssistProvider.keys())
resetAssistProviders(document);
const QList<Core::IEditor *> &editors = Core::DocumentModel::editorsForOpenedDocuments(); const QList<Core::IEditor *> &editors = Core::DocumentModel::editorsForOpenedDocuments();
for (Core::IEditor *editor : editors) { for (Core::IEditor *editor : editors) {
if (auto textEditor = qobject_cast<BaseTextEditor *>(editor)) { if (auto textEditor = qobject_cast<BaseTextEditor *>(editor)) {

View File

@@ -130,8 +130,8 @@ void DiagnosticManager::showDiagnostics(const DocumentUri &uri)
void DiagnosticManager::clearDiagnostics() void DiagnosticManager::clearDiagnostics()
{ {
for (auto it = m_diagnostics.cbegin(); it != m_diagnostics.cend(); ++it) for (const DocumentUri &uri : m_diagnostics.keys())
removeDiagnostics(it.key()); removeDiagnostics(uri);
} }
QList<Diagnostic> DiagnosticManager::diagnosticsAt(const DocumentUri &uri, const Range &range) const QList<Diagnostic> DiagnosticManager::diagnosticsAt(const DocumentUri &uri, const Range &range) const

View File

@@ -387,13 +387,13 @@ void LanguageClientManager::clientFinished(Client *client)
client->disconnect(this); client->disconnect(this);
client->log(tr("Unexpectedly finished. Restarting in %1 seconds.").arg(restartTimeoutS)); client->log(tr("Unexpectedly finished. Restarting in %1 seconds.").arg(restartTimeoutS));
QTimer::singleShot(restartTimeoutS * 1000, client, [client]() { startClient(client); }); QTimer::singleShot(restartTimeoutS * 1000, client, [client]() { startClient(client); });
for (auto it = m_clientForDocument.cbegin(); it != m_clientForDocument.cend(); ++it) for (TextEditor::TextDocument *document : m_clientForDocument.keys(client))
client->deactivateDocument(it.key()); client->deactivateDocument(document);
} else { } else {
if (unexpectedFinish && !m_shuttingDown) if (unexpectedFinish && !m_shuttingDown)
client->log(tr("Unexpectedly finished.")); client->log(tr("Unexpectedly finished."));
for (auto it = m_clientForDocument.cbegin(); it != m_clientForDocument.cend(); ++it) for (TextEditor::TextDocument *document : m_clientForDocument.keys(client))
m_clientForDocument.remove(it.key()); m_clientForDocument.remove(document);
deleteClient(client); deleteClient(client);
if (m_shuttingDown && m_clients.isEmpty()) if (m_shuttingDown && m_clients.isEmpty())
emit shutdownFinished(); emit shutdownFinished();