diff options
6 files changed, 52 insertions, 16 deletions
diff --git a/src/plugins/languageclient/languageclientcompletionassist.cpp b/src/plugins/languageclient/languageclientcompletionassist.cpp index a88af2666a..ae2eca2ff6 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()); diff --git a/src/plugins/languageclient/languageclientfunctionhint.cpp b/src/plugins/languageclient/languageclientfunctionhint.cpp index 5e711adec6..3361864973 100644 --- a/src/plugins/languageclient/languageclientfunctionhint.cpp +++ b/src/plugins/languageclient/languageclientfunctionhint.cpp @@ -65,14 +65,15 @@ class FunctionHintProcessor : public IAssistProcessor public: explicit FunctionHintProcessor(Client *client) : m_client(client) {} IAssistProposal *perform(const AssistInterface *interface) override; - bool running() override { return m_running; } + bool running() override { return m_currentRequest.isValid(); } bool needsRestart() const override { return true; } + void cancel() override; private: void handleSignatureResponse(const SignatureHelpRequest::Response &response); QPointer<Client> m_client; - bool m_running = false; + MessageId m_currentRequest; int m_pos = -1; }; @@ -87,13 +88,21 @@ IAssistProposal *FunctionHintProcessor::perform(const AssistInterface *interface request.setParams(TextDocumentPositionParams(TextDocumentIdentifier(uri), Position(cursor))); request.setResponseCallback([this](auto response) { this->handleSignatureResponse(response); }); m_client->sendContent(request); - m_running = true; + m_currentRequest = request.id(); return nullptr; } +void FunctionHintProcessor::cancel() +{ + if (running()) { + m_client->cancelRequest(m_currentRequest); + m_currentRequest = MessageId(); + } +} + void FunctionHintProcessor::handleSignatureResponse(const SignatureHelpRequest::Response &response) { - m_running = false; + m_currentRequest = MessageId(); if (auto error = response.error()) m_client->log(error.value()); FunctionHintProposalModelPtr model( diff --git a/src/plugins/languageclient/languageclientquickfix.cpp b/src/plugins/languageclient/languageclientquickfix.cpp index 90e9b23de6..f3b86377ae 100644 --- a/src/plugins/languageclient/languageclientquickfix.cpp +++ b/src/plugins/languageclient/languageclientquickfix.cpp @@ -84,15 +84,16 @@ class LanguageClientQuickFixAssistProcessor : public IAssistProcessor { public: explicit LanguageClientQuickFixAssistProcessor(Client *client) : m_client(client) {} - bool running() override { return m_running; } + bool running() override { return m_currentRequest.isValid(); } IAssistProposal *perform(const AssistInterface *interface) override; + void cancel() override; private: void handleCodeActionResponse(const CodeActionRequest::Response &response); QSharedPointer<const AssistInterface> m_assistInterface; Client *m_client = nullptr; // not owned - bool m_running = false; + MessageId m_currentRequest; }; IAssistProposal *LanguageClientQuickFixAssistProcessor::perform(const AssistInterface *interface) @@ -123,14 +124,22 @@ IAssistProposal *LanguageClientQuickFixAssistProcessor::perform(const AssistInte }); m_client->requestCodeActions(request); - m_running = true; + m_currentRequest = request.id(); return nullptr; } +void LanguageClientQuickFixAssistProcessor::cancel() +{ + if (running()) { + m_client->cancelRequest(m_currentRequest); + m_currentRequest = MessageId(); + } +} + void LanguageClientQuickFixAssistProcessor::handleCodeActionResponse( const CodeActionRequest::Response &response) { - m_running = false; + m_currentRequest = MessageId(); if (const Utils::optional<CodeActionRequest::Response::Error> &error = response.error()) m_client->log(*error); QuickFixOperations ops; diff --git a/src/plugins/texteditor/codeassist/codeassistant.cpp b/src/plugins/texteditor/codeassist/codeassistant.cpp index a29019a245..b115489674 100644 --- a/src/plugins/texteditor/codeassist/codeassistant.cpp +++ b/src/plugins/texteditor/codeassist/codeassistant.cpp @@ -288,6 +288,8 @@ void CodeAssistantPrivate::cancelCurrentRequest() m_requestRunner->setDiscardProposal(true); disconnect(m_runnerConnection); } + if (m_asyncProcessor) + m_asyncProcessor->cancel(); invalidateCurrentRequestData(); } diff --git a/src/plugins/texteditor/codeassist/documentcontentcompletion.cpp b/src/plugins/texteditor/codeassist/documentcontentcompletion.cpp index 50a04ba88f..8558e9c392 100644 --- a/src/plugins/texteditor/codeassist/documentcontentcompletion.cpp +++ b/src/plugins/texteditor/codeassist/documentcontentcompletion.cpp @@ -43,14 +43,15 @@ using namespace TextEditor; -class DocumentContentCompletionProcessor : public IAssistProcessor +class DocumentContentCompletionProcessor final : public IAssistProcessor { public: DocumentContentCompletionProcessor(const QString &snippetGroupId); - ~DocumentContentCompletionProcessor() override; + ~DocumentContentCompletionProcessor() final; IAssistProposal *perform(const AssistInterface *interface) override; bool running() final { return m_watcher.isRunning(); } + void cancel() final; private: QString m_snippetGroup; @@ -77,8 +78,7 @@ DocumentContentCompletionProcessor::DocumentContentCompletionProcessor(const QSt DocumentContentCompletionProcessor::~DocumentContentCompletionProcessor() { - if (m_watcher.isRunning()) - m_watcher.cancel(); + cancel(); } static void createProposal(QFutureInterface<QStringList> &future, const QString &text, @@ -149,3 +149,9 @@ IAssistProposal *DocumentContentCompletionProcessor::perform(const AssistInterfa }); return nullptr; } + +void DocumentContentCompletionProcessor::cancel() +{ + if (running()) + m_watcher.cancel(); +} diff --git a/src/plugins/texteditor/codeassist/iassistprocessor.h b/src/plugins/texteditor/codeassist/iassistprocessor.h index 6ed29b66f1..3658e97ad0 100644 --- a/src/plugins/texteditor/codeassist/iassistprocessor.h +++ b/src/plugins/texteditor/codeassist/iassistprocessor.h @@ -51,6 +51,7 @@ public: virtual bool running() { return false; } virtual bool needsRestart() const { return false; } + virtual void cancel() {} private: AsyncCompletionsAvailableHandler m_asyncCompletionsAvailableHandler; |