diff options
author | David Schulz <david.schulz@qt.io> | 2020-02-12 14:06:45 +0100 |
---|---|---|
committer | David Schulz <david.schulz@qt.io> | 2020-02-20 12:59:55 +0000 |
commit | 552ccd6a616b7f74f7948457b861a1124e2bf6cc (patch) | |
tree | 8b04cc5ddb52f1a019ae8bba077569f66a8f0d30 /src/plugins/languageclient/languageclientcompletionassist.cpp | |
parent | 86fae567fa38097d0075dc8c145c48b11a9182fc (diff) |
CodeAssistant: add cancel to asynchronous processors
Fixes crash when the processor reports a result after the code assistant
was destroyed.
Change-Id: I8588d3d6acad69f1ec6302e8ba09d642ebbb77f1
Reviewed-by: Christian Stenger <christian.stenger@qt.io>
Diffstat (limited to 'src/plugins/languageclient/languageclientcompletionassist.cpp')
-rw-r--r-- | src/plugins/languageclient/languageclientcompletionassist.cpp | 17 |
1 files changed, 13 insertions, 4 deletions
diff --git a/src/plugins/languageclient/languageclientcompletionassist.cpp b/src/plugins/languageclient/languageclientcompletionassist.cpp index a88af2666a2..ae2eca2ff63 100644 --- a/src/plugins/languageclient/languageclientcompletionassist.cpp +++ b/src/plugins/languageclient/languageclientcompletionassist.cpp @@ -278,13 +278,14 @@ public: IAssistProposal *perform(const AssistInterface *interface) override; bool running() override; bool needsRestart() const override { return true; } + void cancel() override; private: void handleCompletionResponse(const CompletionRequest::Response &response); QPointer<QTextDocument> m_document; QPointer<Client> m_client; - bool m_running = false; + MessageId m_currentRequest; int m_pos = -1; }; @@ -336,7 +337,7 @@ IAssistProposal *LanguageClientCompletionAssistProcessor::perform(const AssistIn }); completionRequest.setParams(params); m_client->sendContent(completionRequest); - m_running = true; + m_currentRequest = completionRequest.id(); m_document = interface->textDocument(); qCDebug(LOGLSPCOMPLETION) << QTime::currentTime() << " : request completions at " << m_pos @@ -346,14 +347,22 @@ IAssistProposal *LanguageClientCompletionAssistProcessor::perform(const AssistIn bool LanguageClientCompletionAssistProcessor::running() { - return m_running; + return m_currentRequest.isValid(); +} + +void LanguageClientCompletionAssistProcessor::cancel() +{ + if (running()) { + m_client->cancelRequest(m_currentRequest); + m_currentRequest = MessageId(); + } } void LanguageClientCompletionAssistProcessor::handleCompletionResponse( const CompletionRequest::Response &response) { qCDebug(LOGLSPCOMPLETION) << QTime::currentTime() << " : got completions"; - m_running = false; + m_currentRequest = MessageId(); QTC_ASSERT(m_client, return); if (auto error = response.error()) { m_client->log(error.value()); |