aboutsummaryrefslogtreecommitdiffstats
path: root/src/plugins/languageclient/languageclientcompletionassist.cpp
diff options
context:
space:
mode:
authorDavid Schulz <david.schulz@qt.io>2020-06-17 14:15:13 +0200
committerDavid Schulz <david.schulz@qt.io>2020-06-22 04:23:06 +0000
commite323529b3c9bd8344367ddfb87ba5114edd374d7 (patch)
treed09307a450163d4876c2b4f50e820ef83a85e9c2 /src/plugins/languageclient/languageclientcompletionassist.cpp
parent92a4c0d38a007f778893f7b971f747e1a803eac3 (diff)
LSP: Compress document change notifications
Change-Id: Iaf6cb99784f4e1ed1291ace1f4cc18cf6af88672 Reviewed-by: Christian Stenger <christian.stenger@qt.io>
Diffstat (limited to 'src/plugins/languageclient/languageclientcompletionassist.cpp')
-rw-r--r--src/plugins/languageclient/languageclientcompletionassist.cpp26
1 files changed, 24 insertions, 2 deletions
diff --git a/src/plugins/languageclient/languageclientcompletionassist.cpp b/src/plugins/languageclient/languageclientcompletionassist.cpp
index 8a279b0dac0..0b38b42edc9 100644
--- a/src/plugins/languageclient/languageclientcompletionassist.cpp
+++ b/src/plugins/languageclient/languageclientcompletionassist.cpp
@@ -274,6 +274,7 @@ class LanguageClientCompletionAssistProcessor : public IAssistProcessor
{
public:
LanguageClientCompletionAssistProcessor(Client *client);
+ ~LanguageClientCompletionAssistProcessor() override;
IAssistProposal *perform(const AssistInterface *interface) override;
bool running() override;
bool needsRestart() const override { return true; }
@@ -285,6 +286,7 @@ private:
QPointer<QTextDocument> m_document;
QPointer<Client> m_client;
Utils::optional<MessageId> m_currentRequest;
+ QMetaObject::Connection m_postponedUpdateConnection;
int m_pos = -1;
};
@@ -292,6 +294,11 @@ LanguageClientCompletionAssistProcessor::LanguageClientCompletionAssistProcessor
: m_client(client)
{ }
+LanguageClientCompletionAssistProcessor::~LanguageClientCompletionAssistProcessor()
+{
+ QTC_ASSERT(!running(), cancel());
+}
+
static QString assistReasonString(AssistReason reason)
{
switch (reason) {
@@ -315,7 +322,20 @@ IAssistProposal *LanguageClientCompletionAssistProcessor::perform(const AssistIn
++delta;
if (delta < 3)
return nullptr;
+ if (m_client->documentUpdatePostponed(interface->fileName())) {
+ m_postponedUpdateConnection
+ = QObject::connect(m_client,
+ &Client::documentUpdated,
+ [this, interface](TextEditor::TextDocument *document) {
+ if (document->filePath()
+ == Utils::FilePath::fromString(interface->fileName()))
+ perform(interface);
+ });
+ return nullptr;
+ }
}
+ if (m_postponedUpdateConnection)
+ QObject::disconnect(m_postponedUpdateConnection);
CompletionRequest completionRequest;
CompletionParams::CompletionContext context;
if (interface->reason() == ActivationCharacter) {
@@ -353,15 +373,17 @@ IAssistProposal *LanguageClientCompletionAssistProcessor::perform(const AssistIn
bool LanguageClientCompletionAssistProcessor::running()
{
- return m_currentRequest.has_value();
+ return m_currentRequest.has_value() || m_postponedUpdateConnection;
}
void LanguageClientCompletionAssistProcessor::cancel()
{
- if (running()) {
+ if (m_currentRequest.has_value()) {
m_client->cancelRequest(m_currentRequest.value());
m_client->removeAssistProcessor(this);
m_currentRequest.reset();
+ } else if (m_postponedUpdateConnection) {
+ QObject::disconnect(m_postponedUpdateConnection);
}
}