diff options
author | David Schulz <david.schulz@qt.io> | 2023-05-22 10:12:23 +0200 |
---|---|---|
committer | David Schulz <david.schulz@qt.io> | 2023-05-23 08:47:45 +0000 |
commit | d63c57ef47fa7de0f7621a4ac8c41131e01905bc (patch) | |
tree | ed11269b84cc5ac060abcaf21c84dadfd747e710 | |
parent | 0ddbf9f6b80a86301999ec97627d95858f959b5d (diff) |
CodeAssistant: do not schedule processor deletion too early
Calling displayProposal might spawn another eventloop that potentially
deletes the processor before the async proposal handler finished.
Fixes: QTCREATORBUG-28989
Change-Id: I3a8ddb9180cb7737a37ea39dc59d922e83615ed6
Reviewed-by: Christian Kandeler <christian.kandeler@qt.io>
-rw-r--r-- | src/plugins/texteditor/codeassist/codeassistant.cpp | 28 |
1 files changed, 14 insertions, 14 deletions
diff --git a/src/plugins/texteditor/codeassist/codeassistant.cpp b/src/plugins/texteditor/codeassist/codeassistant.cpp index b3d9d477e2..182df3002a 100644 --- a/src/plugins/texteditor/codeassist/codeassistant.cpp +++ b/src/plugins/texteditor/codeassist/codeassistant.cpp @@ -185,26 +185,26 @@ void CodeAssistantPrivate::requestProposal(AssistReason reason, IAssistProcessor *processor = provider->createProcessor(assistInterface.get()); processor->setAsyncCompletionAvailableHandler([this, reason, processor]( IAssistProposal *newProposal) { + if (processor == m_processor) { + invalidateCurrentRequestData(); + if (processor->needsRestart() && m_receivedContentWhileWaiting) { + delete newProposal; + m_receivedContentWhileWaiting = false; + requestProposal(reason, m_assistKind, m_requestProvider); + } else { + displayProposal(newProposal, reason); + if (processor->running()) + m_processor = processor; + else + emit q->finished(); + } + } if (!processor->running()) { // do not delete this processor directly since this function is called from within the processor QMetaObject::invokeMethod(QCoreApplication::instance(), [processor] { delete processor; }, Qt::QueuedConnection); } - if (processor != m_processor) - return; - invalidateCurrentRequestData(); - if (processor->needsRestart() && m_receivedContentWhileWaiting) { - delete newProposal; - m_receivedContentWhileWaiting = false; - requestProposal(reason, m_assistKind, m_requestProvider); - } else { - displayProposal(newProposal, reason); - if (processor->running()) - m_processor = processor; - else - emit q->finished(); - } }); if (IAssistProposal *newProposal = processor->start(std::move(assistInterface))) |