From 4f1c5bacb947d50544739a6301a99343fc47e4bf Mon Sep 17 00:00:00 2001 From: David Schulz Date: Fri, 22 Jan 2021 14:26:11 +0100 Subject: [PATCH] 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: cf010911f7681b23aff6a150c50252374447addd Change-Id: I4d6df987b9e5382b6b18fa659b1174ca6919a02e Reviewed-by: Christian Stenger --- src/plugins/languageclient/client.cpp | 5 +++-- src/plugins/languageclient/diagnosticmanager.cpp | 4 ++-- src/plugins/languageclient/languageclientmanager.cpp | 8 ++++---- 3 files changed, 9 insertions(+), 8 deletions(-) diff --git a/src/plugins/languageclient/client.cpp b/src/plugins/languageclient/client.cpp index 9991cb1c88c..f4fa4d6319f 100644 --- a/src/plugins/languageclient/client.cpp +++ b/src/plugins/languageclient/client.cpp @@ -111,8 +111,9 @@ Client::~Client() using namespace TextEditor; // FIXME: instead of replacing the completion provider in the text document store the // completion provider as a prioritised list in the text document - for (auto it = m_resetAssistProvider.cbegin(); it != m_resetAssistProvider.cend(); ++it) - resetAssistProviders(it.key()); + // temporary container needed since m_resetAssistProvider is changed in resetAssistProviders + for (TextDocument *document : m_resetAssistProvider.keys()) + resetAssistProviders(document); const QList &editors = Core::DocumentModel::editorsForOpenedDocuments(); for (Core::IEditor *editor : editors) { if (auto textEditor = qobject_cast(editor)) { diff --git a/src/plugins/languageclient/diagnosticmanager.cpp b/src/plugins/languageclient/diagnosticmanager.cpp index 233353a9f71..802ff4a58fd 100644 --- a/src/plugins/languageclient/diagnosticmanager.cpp +++ b/src/plugins/languageclient/diagnosticmanager.cpp @@ -130,8 +130,8 @@ void DiagnosticManager::showDiagnostics(const DocumentUri &uri) void DiagnosticManager::clearDiagnostics() { - for (auto it = m_diagnostics.cbegin(); it != m_diagnostics.cend(); ++it) - removeDiagnostics(it.key()); + for (const DocumentUri &uri : m_diagnostics.keys()) + removeDiagnostics(uri); } QList DiagnosticManager::diagnosticsAt(const DocumentUri &uri, const Range &range) const diff --git a/src/plugins/languageclient/languageclientmanager.cpp b/src/plugins/languageclient/languageclientmanager.cpp index 6c9df52b91b..43213e4de1c 100644 --- a/src/plugins/languageclient/languageclientmanager.cpp +++ b/src/plugins/languageclient/languageclientmanager.cpp @@ -387,13 +387,13 @@ void LanguageClientManager::clientFinished(Client *client) client->disconnect(this); client->log(tr("Unexpectedly finished. Restarting in %1 seconds.").arg(restartTimeoutS)); QTimer::singleShot(restartTimeoutS * 1000, client, [client]() { startClient(client); }); - for (auto it = m_clientForDocument.cbegin(); it != m_clientForDocument.cend(); ++it) - client->deactivateDocument(it.key()); + for (TextEditor::TextDocument *document : m_clientForDocument.keys(client)) + client->deactivateDocument(document); } else { if (unexpectedFinish && !m_shuttingDown) client->log(tr("Unexpectedly finished.")); - for (auto it = m_clientForDocument.cbegin(); it != m_clientForDocument.cend(); ++it) - m_clientForDocument.remove(it.key()); + for (TextEditor::TextDocument *document : m_clientForDocument.keys(client)) + m_clientForDocument.remove(document); deleteClient(client); if (m_shuttingDown && m_clients.isEmpty()) emit shutdownFinished();