forked from qt-creator/qt-creator
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:
@@ -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<Core::IEditor *> &editors = Core::DocumentModel::editorsForOpenedDocuments();
|
||||
for (Core::IEditor *editor : editors) {
|
||||
if (auto textEditor = qobject_cast<BaseTextEditor *>(editor)) {
|
||||
|
@@ -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<Diagnostic> DiagnosticManager::diagnosticsAt(const DocumentUri &uri, const Range &range) const
|
||||
|
@@ -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();
|
||||
|
Reference in New Issue
Block a user