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;
|
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)) {
|
||||||
|
@@ -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
|
||||||
|
@@ -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();
|
||||||
|
Reference in New Issue
Block a user