aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid Schulz <david.schulz@qt.io>2023-05-22 10:12:23 +0200
committerDavid Schulz <david.schulz@qt.io>2023-05-23 08:47:45 +0000
commitd63c57ef47fa7de0f7621a4ac8c41131e01905bc (patch)
treeed11269b84cc5ac060abcaf21c84dadfd747e710
parent0ddbf9f6b80a86301999ec97627d95858f959b5d (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.cpp28
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)))