diff --git a/src/plugins/languageclient/documentsymbolcache.cpp b/src/plugins/languageclient/documentsymbolcache.cpp index 119cfad992f..21494a66936 100644 --- a/src/plugins/languageclient/documentsymbolcache.cpp +++ b/src/plugins/languageclient/documentsymbolcache.cpp @@ -50,24 +50,34 @@ DocumentSymbolCache::DocumentSymbolCache(Client *client) &Core::EditorManager::documentOpened, this, connectDocument); + m_compressionTimer.setSingleShot(true); + connect(&m_compressionTimer, &QTimer::timeout, this, &DocumentSymbolCache::requestSymbolsImpl); } void DocumentSymbolCache::requestSymbols(const DocumentUri &uri) { - auto entry = m_cache.find(uri); - if (entry != m_cache.end()) { - emit gotSymbols(uri, entry.value()); - return; - } + m_compressedUris.insert(uri); + m_compressionTimer.start(200); +} - const DocumentSymbolParams params((TextDocumentIdentifier(uri))); - DocumentSymbolsRequest request(params); - request.setResponseCallback([uri, self = QPointer(this)]( - const DocumentSymbolsRequest::Response &response) { - if (self) - self->handleResponse(uri, response); - }); - m_client->sendContent(request); +void DocumentSymbolCache::requestSymbolsImpl() +{ + for (const DocumentUri &uri : qAsConst(m_compressedUris)) { + auto entry = m_cache.find(uri); + if (entry != m_cache.end()) { + emit gotSymbols(uri, entry.value()); + return; + } + + const DocumentSymbolParams params((TextDocumentIdentifier(uri))); + DocumentSymbolsRequest request(params); + request.setResponseCallback([uri, self = QPointer(this)]( + const DocumentSymbolsRequest::Response &response) { + if (self) + self->handleResponse(uri, response); + }); + m_client->sendContent(request); + } } void DocumentSymbolCache::handleResponse(const DocumentUri &uri, diff --git a/src/plugins/languageclient/documentsymbolcache.h b/src/plugins/languageclient/documentsymbolcache.h index 2f0b2376bc3..d58935c9480 100644 --- a/src/plugins/languageclient/documentsymbolcache.h +++ b/src/plugins/languageclient/documentsymbolcache.h @@ -30,6 +30,7 @@ #include #include +#include namespace LanguageClient { @@ -48,11 +49,14 @@ signals: const LanguageServerProtocol::DocumentSymbolsResult &symbols); private: + void requestSymbolsImpl(); void handleResponse(const LanguageServerProtocol::DocumentUri &uri, const LanguageServerProtocol::DocumentSymbolsRequest::Response &response); QMap m_cache; Client *m_client = nullptr; + QTimer m_compressionTimer; + QSet m_compressedUris; }; } // namespace LanguageClient