aboutsummaryrefslogtreecommitdiffstats
path: root/src/plugins/languageclient/documentsymbolcache.cpp
diff options
context:
space:
mode:
authorDavid Schulz <david.schulz@qt.io>2019-04-04 14:36:28 +0200
committerDavid Schulz <david.schulz@qt.io>2019-04-25 10:54:23 +0000
commitb79eabd4d2e65fd5b84c4bccc94e38d2a3b4cf85 (patch)
tree754c1f54583ba6295f0c36a94d982ccdfd01efb5 /src/plugins/languageclient/documentsymbolcache.cpp
parentdfeb0245838f0709e845ed264f343e4ac0bb2bfe (diff)
LanguageClient: add cache for document symbols
Change-Id: Ia4c4061258c74d839edbd472c2087be74ac30113 Reviewed-by: Christian Stenger <christian.stenger@qt.io>
Diffstat (limited to 'src/plugins/languageclient/documentsymbolcache.cpp')
-rw-r--r--src/plugins/languageclient/documentsymbolcache.cpp81
1 files changed, 81 insertions, 0 deletions
diff --git a/src/plugins/languageclient/documentsymbolcache.cpp b/src/plugins/languageclient/documentsymbolcache.cpp
new file mode 100644
index 00000000000..b922486d56e
--- /dev/null
+++ b/src/plugins/languageclient/documentsymbolcache.cpp
@@ -0,0 +1,81 @@
+/****************************************************************************
+**
+** Copyright (C) 2019 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt Creator.
+**
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+****************************************************************************/
+
+#include "documentsymbolcache.h"
+
+#include "client.h"
+
+#include <coreplugin/editormanager/editormanager.h>
+#include <texteditor/textdocument.h>
+
+using namespace LanguageServerProtocol;
+
+namespace LanguageClient {
+
+DocumentSymbolCache::DocumentSymbolCache(Client *client)
+ : QObject(client)
+ , m_client(client)
+{
+ connect(Core::EditorManager::instance(),
+ &Core::EditorManager::documentOpened,
+ this,
+ [this](Core::IDocument *document) {
+ connect(document, &Core::IDocument::contentsChanged, this, [this, document]() {
+ m_cache.remove(DocumentUri::fromFileName(document->filePath()));
+ });
+ });
+}
+
+void DocumentSymbolCache::requestSymbols(const DocumentUri &uri)
+{
+ 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<DocumentSymbolCache>(this)](
+ const DocumentSymbolsRequest::Response &response) {
+ if (self)
+ self->handleResponse(uri, response);
+ });
+ m_client->sendContent(request);
+}
+
+void DocumentSymbolCache::handleResponse(const DocumentUri &uri,
+ const DocumentSymbolsRequest::Response &response)
+{
+ if (Utils::optional<DocumentSymbolsRequest::Response::Error> error = response.error()) {
+ if (m_client)
+ m_client->log(error.value());
+ }
+ const DocumentSymbolsResult &symbols = response.result().value_or(DocumentSymbolsResult());
+ m_cache[uri] = symbols;
+ emit gotSymbols(uri, symbols);
+}
+
+} // namespace LanguageClient