diff --git a/src/plugins/clangcodemodel/clangdclient.cpp b/src/plugins/clangcodemodel/clangdclient.cpp index d5ff6c9390a..271ee13c05d 100644 --- a/src/plugins/clangcodemodel/clangdclient.cpp +++ b/src/plugins/clangcodemodel/clangdclient.cpp @@ -1421,7 +1421,7 @@ void ClangdClient::switchDeclDef(TextEditor::TextDocument *document, const QText }); sendContent(astRequest, SendDocUpdates::Ignore); - documentSymbolCache()->requestSymbols(d->switchDeclDefData->uri); + documentSymbolCache()->requestSymbols(d->switchDeclDefData->uri, Schedule::Now); } diff --git a/src/plugins/languageclient/client.cpp b/src/plugins/languageclient/client.cpp index 1d93db50518..10a4fb4a31c 100644 --- a/src/plugins/languageclient/client.cpp +++ b/src/plugins/languageclient/client.cpp @@ -94,7 +94,7 @@ Client::Client(BaseClientInterface *clientInterface) m_documentUpdateTimer.setSingleShot(true); m_documentUpdateTimer.setInterval(500); connect(&m_documentUpdateTimer, &QTimer::timeout, this, - [this] { sendPostponedDocumentUpdates(SemanticTokensUpdateMode::Now); }); + [this] { sendPostponedDocumentUpdates(Schedule::Now); }); m_contentHandler.insert(JsonRpcMessageHandler::jsonRpcMimeType(), &JsonRpcMessageHandler::parseContent); @@ -410,7 +410,7 @@ void Client::sendContent(const IContent &content, SendDocUpdates sendUpdates) QTC_ASSERT(m_clientInterface, return); QTC_ASSERT(m_state == Initialized, return); if (sendUpdates == SendDocUpdates::Send) - sendPostponedDocumentUpdates(SemanticTokensUpdateMode::Delayed); + sendPostponedDocumentUpdates(Schedule::Delayed); if (Utils::optional responseHandler = content.responseHandler()) m_responseHandlers[responseHandler->id] = responseHandler->callback; QString error; @@ -1216,7 +1216,7 @@ void Client::resetAssistProviders(TextEditor::TextDocument *document) document->setQuickFixAssistProvider(providers.quickFixAssistProvider); } -void Client::sendPostponedDocumentUpdates(SemanticTokensUpdateMode semanticTokensUpdateMode) +void Client::sendPostponedDocumentUpdates(Schedule semanticTokensSchedule) { m_documentUpdateTimer.stop(); if (m_documentsToUpdate.empty()) @@ -1251,14 +1251,17 @@ void Client::sendPostponedDocumentUpdates(SemanticTokensUpdateMode semanticToken if (currentWidget && currentWidget->textDocument() == update.document) requestDocumentHighlights(currentWidget); - if (semanticTokensUpdateMode == SemanticTokensUpdateMode::Now) { + switch (semanticTokensSchedule) { + case Schedule::Now: m_tokenSupport.updateSemanticTokens(update.document); - } else { + break; + case Schedule::Delayed: QTimer::singleShot(m_documentUpdateTimer.interval(), this, [this, doc = QPointer(update.document)] { if (doc && m_documentsToUpdate.find(doc) == m_documentsToUpdate.end()) m_tokenSupport.updateSemanticTokens(doc); }); + break; } } } diff --git a/src/plugins/languageclient/client.h b/src/plugins/languageclient/client.h index e4a6611c299..0f4e65879e9 100644 --- a/src/plugins/languageclient/client.h +++ b/src/plugins/languageclient/client.h @@ -229,8 +229,7 @@ private: void removeDiagnostics(const LanguageServerProtocol::DocumentUri &uri); void resetAssistProviders(TextEditor::TextDocument *document); - enum class SemanticTokensUpdateMode { Now, Delayed }; - void sendPostponedDocumentUpdates(SemanticTokensUpdateMode semanticTokensUpdateMode); + void sendPostponedDocumentUpdates(Schedule semanticTokensSchedule); void updateCompletionProvider(TextEditor::TextDocument *document); void updateFunctionHintProvider(TextEditor::TextDocument *document); diff --git a/src/plugins/languageclient/documentsymbolcache.cpp b/src/plugins/languageclient/documentsymbolcache.cpp index c635e10d198..1a46048d345 100644 --- a/src/plugins/languageclient/documentsymbolcache.cpp +++ b/src/plugins/languageclient/documentsymbolcache.cpp @@ -54,10 +54,17 @@ DocumentSymbolCache::DocumentSymbolCache(Client *client) connect(&m_compressionTimer, &QTimer::timeout, this, &DocumentSymbolCache::requestSymbolsImpl); } -void DocumentSymbolCache::requestSymbols(const DocumentUri &uri) +void DocumentSymbolCache::requestSymbols(const DocumentUri &uri, Schedule schedule) { m_compressedUris.insert(uri); - m_compressionTimer.start(200); + switch (schedule) { + case Schedule::Now: + requestSymbolsImpl(); + break; + case Schedule::Delayed: + m_compressionTimer.start(200); + break; + } } void DocumentSymbolCache::requestSymbolsImpl() diff --git a/src/plugins/languageclient/documentsymbolcache.h b/src/plugins/languageclient/documentsymbolcache.h index 9f7b09a56d4..ada0953c071 100644 --- a/src/plugins/languageclient/documentsymbolcache.h +++ b/src/plugins/languageclient/documentsymbolcache.h @@ -26,6 +26,7 @@ #pragma once #include "languageclient_global.h" +#include "languageclientutils.h" #include "utils/optional.h" @@ -47,7 +48,7 @@ class LANGUAGECLIENT_EXPORT DocumentSymbolCache : public QObject public: DocumentSymbolCache(Client *client); - void requestSymbols(const LanguageServerProtocol::DocumentUri &uri); + void requestSymbols(const LanguageServerProtocol::DocumentUri &uri, Schedule schedule); signals: void gotSymbols(const LanguageServerProtocol::DocumentUri &uri, diff --git a/src/plugins/languageclient/languageclientoutline.cpp b/src/plugins/languageclient/languageclientoutline.cpp index 98edfcfd4df..32feba487cd 100644 --- a/src/plugins/languageclient/languageclientoutline.cpp +++ b/src/plugins/languageclient/languageclientoutline.cpp @@ -155,10 +155,10 @@ LanguageClientOutlineWidget::LanguageClientOutlineWidget(Client *client, &LanguageClientOutlineWidget::handleResponse); connect(client, &Client::documentUpdated, this, [this](TextEditor::TextDocument *document) { if (m_client && m_uri == DocumentUri::fromFilePath(document->filePath())) - m_client->documentSymbolCache()->requestSymbols(m_uri); + m_client->documentSymbolCache()->requestSymbols(m_uri, Schedule::Delayed); }); - client->documentSymbolCache()->requestSymbols(m_uri); + client->documentSymbolCache()->requestSymbols(m_uri, Schedule::Delayed); auto *layout = new QVBoxLayout; layout->setContentsMargins(0, 0, 0, 0); @@ -367,7 +367,7 @@ void OutlineComboBox::activateEntry() void OutlineComboBox::documentUpdated(TextEditor::TextDocument *document) { if (document == m_editorWidget->textDocument()) - m_client->documentSymbolCache()->requestSymbols(m_uri); + m_client->documentSymbolCache()->requestSymbols(m_uri, Schedule::Delayed); } } // namespace LanguageClient diff --git a/src/plugins/languageclient/languageclientutils.h b/src/plugins/languageclient/languageclientutils.h index f35c33918e0..d73e052590d 100644 --- a/src/plugins/languageclient/languageclientutils.h +++ b/src/plugins/languageclient/languageclientutils.h @@ -44,6 +44,8 @@ namespace LanguageClient { class Client; +enum class Schedule { Now, Delayed }; + Utils::ChangeSet editsToChangeSet(const QList &edits, const QTextDocument *doc); bool LANGUAGECLIENT_EXPORT applyWorkspaceEdit(const Client *client, const LanguageServerProtocol::WorkspaceEdit &edit); diff --git a/src/plugins/languageclient/locatorfilter.cpp b/src/plugins/languageclient/locatorfilter.cpp index ce4fd5c9b5d..a817b4339d8 100644 --- a/src/plugins/languageclient/locatorfilter.cpp +++ b/src/plugins/languageclient/locatorfilter.cpp @@ -148,7 +148,7 @@ void DocumentLocatorFilter::prepareSearch(const QString &/*entry*/) QMutexLocker locker(&m_mutex); if (m_symbolCache && !m_currentSymbols.has_value()) { locker.unlock(); - m_symbolCache->requestSymbols(m_currentUri); + m_symbolCache->requestSymbols(m_currentUri, Schedule::Delayed); } }