diff options
author | David Schulz <david.schulz@qt.io> | 2019-04-04 14:36:28 +0200 |
---|---|---|
committer | David Schulz <david.schulz@qt.io> | 2019-04-25 10:54:23 +0000 |
commit | b79eabd4d2e65fd5b84c4bccc94e38d2a3b4cf85 (patch) | |
tree | 754c1f54583ba6295f0c36a94d982ccdfd01efb5 /src/plugins/languageclient/documentsymbolcache.cpp | |
parent | dfeb0245838f0709e845ed264f343e4ac0bb2bfe (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.cpp | 81 |
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 |