aboutsummaryrefslogtreecommitdiffstats
path: root/src/plugins/texteditor/codeassist/codeassistant.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/plugins/texteditor/codeassist/codeassistant.cpp')
-rw-r--r--src/plugins/texteditor/codeassist/codeassistant.cpp32
1 files changed, 18 insertions, 14 deletions
diff --git a/src/plugins/texteditor/codeassist/codeassistant.cpp b/src/plugins/texteditor/codeassist/codeassistant.cpp
index b115489674..ce90f64b48 100644
--- a/src/plugins/texteditor/codeassist/codeassistant.cpp
+++ b/src/plugins/texteditor/codeassist/codeassistant.cpp
@@ -252,19 +252,20 @@ void CodeAssistantPrivate::requestProposal(AssistReason reason,
break;
}
case IAssistProvider::Asynchronous: {
- processor->setAsyncCompletionAvailableHandler(
- [this, reason](IAssistProposal *newProposal){
- if (m_asyncProcessor && m_asyncProcessor->needsRestart() && m_receivedContentWhileWaiting) {
- delete newProposal;
- m_receivedContentWhileWaiting = false;
- invalidateCurrentRequestData();
- requestProposal(reason, m_assistKind, m_requestProvider);
- } else {
- invalidateCurrentRequestData();
- displayProposal(newProposal, reason);
-
- emit q->finished();
- }
+ processor->setAsyncCompletionAvailableHandler([this, reason, processor](IAssistProposal *newProposal) {
+ // do not delete this processor directly since this function is called from within the processor
+ QTimer::singleShot(0, [processor]() { delete processor; });
+ if (processor != m_asyncProcessor)
+ return;
+ invalidateCurrentRequestData();
+ if (processor && processor->needsRestart() && m_receivedContentWhileWaiting) {
+ delete newProposal;
+ m_receivedContentWhileWaiting = false;
+ requestProposal(reason, m_assistKind, m_requestProvider);
+ } else {
+ displayProposal(newProposal, reason);
+ emit q->finished();
+ }
});
// If there is a proposal, nothing asynchronous happened...
@@ -274,6 +275,7 @@ void CodeAssistantPrivate::requestProposal(AssistReason reason,
} else if (!processor->running()) {
delete processor;
} else { // ...async request was triggered
+ QTC_CHECK(!m_asyncProcessor);
m_asyncProcessor = processor;
}
@@ -288,8 +290,10 @@ void CodeAssistantPrivate::cancelCurrentRequest()
m_requestRunner->setDiscardProposal(true);
disconnect(m_runnerConnection);
}
- if (m_asyncProcessor)
+ if (m_asyncProcessor) {
m_asyncProcessor->cancel();
+ delete m_asyncProcessor;
+ }
invalidateCurrentRequestData();
}