forked from qt-creator/qt-creator
		
	LanguageClient: add cache for document symbols
Change-Id: Ia4c4061258c74d839edbd472c2087be74ac30113 Reviewed-by: Christian Stenger <christian.stenger@qt.io>
This commit is contained in:
		
							
								
								
									
										81
									
								
								src/plugins/languageclient/documentsymbolcache.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										81
									
								
								src/plugins/languageclient/documentsymbolcache.cpp
									
									
									
									
									
										Normal file
									
								
							@@ -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
 | 
			
		||||
		Reference in New Issue
	
	Block a user