summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJarek Kobus <jaroslaw.kobus@qt.io>2023-04-25 09:21:22 +0200
committerJarek Kobus <jaroslaw.kobus@qt.io>2023-05-15 08:00:30 +0000
commit6b600798a4cf009c4df7649df0ba7b2992e1fdd0 (patch)
treed62e71b0ef83c60a337dbfae56d50c9ceff331e1
parent4d2710bae248247aaf9c4fe0441466e4a97c825d (diff)
downloadqt-creator-6b600798a4cf009c4df7649df0ba7b2992e1fdd0.tar.gz
LanguageClient: Remove the old matchesFor() implementation
Rename some workspace filter classes to conform to the names for cpp filters. Remove some unneeded intermediate classes now. Change-Id: I1ec0dbb7ed91944e9dd8b1b0f4878b826191a020 Reviewed-by: David Schulz <david.schulz@qt.io> Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
-rw-r--r--src/plugins/languageclient/languageclientmanager.cpp9
-rw-r--r--src/plugins/languageclient/locatorfilter.cpp241
-rw-r--r--src/plugins/languageclient/locatorfilter.h92
3 files changed, 30 insertions, 312 deletions
diff --git a/src/plugins/languageclient/languageclientmanager.cpp b/src/plugins/languageclient/languageclientmanager.cpp
index 275e9ed9e4..4de4a0de46 100644
--- a/src/plugins/languageclient/languageclientmanager.cpp
+++ b/src/plugins/languageclient/languageclientmanager.cpp
@@ -30,7 +30,6 @@
#include <utils/theme/theme.h>
#include <utils/utilsicons.h>
-#include <QTextBlock>
#include <QTimer>
using namespace LanguageServerProtocol;
@@ -44,10 +43,10 @@ static bool g_shuttingDown = false;
class LanguageClientManagerPrivate
{
- DocumentLocatorFilter m_currentDocumentLocatorFilter;
- WorkspaceLocatorFilter m_workspaceLocatorFilter;
- WorkspaceClassLocatorFilter m_workspaceClassLocatorFilter;
- WorkspaceMethodLocatorFilter m_workspaceMethodLocatorFilter;
+ LanguageCurrentDocumentFilter m_currentDocumentFilter;
+ LanguageAllSymbolsFilter m_allSymbolsFilter;
+ LanguageClassesFilter m_classFilter;
+ LanguageFunctionsFilter m_functionFilter;
};
LanguageClientManager::LanguageClientManager(QObject *parent)
diff --git a/src/plugins/languageclient/locatorfilter.cpp b/src/plugins/languageclient/locatorfilter.cpp
index 5d52f28f23..04caf2d172 100644
--- a/src/plugins/languageclient/locatorfilter.cpp
+++ b/src/plugins/languageclient/locatorfilter.cpp
@@ -5,23 +5,14 @@
#include "clientrequesttask.h"
#include "currentdocumentsymbolsrequest.h"
-#include "documentsymbolcache.h"
-#include "languageclient_global.h"
#include "languageclientmanager.h"
#include "languageclienttr.h"
-#include <coreplugin/editormanager/editormanager.h>
-
#include <extensionsystem/pluginmanager.h>
-#include <languageserverprotocol/lsptypes.h>
-
-#include <texteditor/textdocument.h>
-
#include <utils/async.h>
#include <utils/fuzzymatcher.h>
-#include <QFutureWatcher>
#include <QRegularExpression>
using namespace Core;
@@ -60,7 +51,7 @@ LocatorMatcherTask locatorMatcher(Client *client, int maxResultCount,
TreeStorage<LocatorStorage> storage;
TreeStorage<QList<SymbolInformation>> resultStorage;
- const auto onQuerySetup = [=](WorkspaceSymbolRequestTask &request) {
+ const auto onQuerySetup = [storage, client, maxResultCount](WorkspaceSymbolRequestTask &request) {
request.setClient(client);
WorkspaceSymbolParams params;
params.setQuery(storage->input());
@@ -75,7 +66,7 @@ LocatorMatcherTask locatorMatcher(Client *client, int maxResultCount,
*resultStorage = result->toList();
};
- const auto onFilterSetup = [=](Async<void> &async) {
+ const auto onFilterSetup = [storage, resultStorage, client, filter](Async<void> &async) {
const QList<SymbolInformation> results = *resultStorage;
if (results.isEmpty())
return TaskAction::StopWithDone;
@@ -131,14 +122,14 @@ LocatorMatcherTask currentDocumentMatcher()
TreeStorage<LocatorStorage> storage;
TreeStorage<CurrentDocumentSymbolsData> resultStorage;
- const auto onQuerySetup = [=](CurrentDocumentSymbolsRequest &request) {
+ const auto onQuerySetup = [](CurrentDocumentSymbolsRequest &request) {
Q_UNUSED(request)
};
const auto onQueryDone = [resultStorage](const CurrentDocumentSymbolsRequest &request) {
*resultStorage = request.currentDocumentSymbolsData();
};
- const auto onFilterSetup = [=](Async<void> &async) {
+ const auto onFilterSetup = [storage, resultStorage](Async<void> &async) {
async.setFutureSynchronizer(ExtensionSystem::PluginManager::futureSynchronizer());
async.setConcurrentCallData(filterCurrentResults, *storage, *resultStorage);
};
@@ -178,7 +169,7 @@ LocatorMatcherTasks languageClientMatchers(MatcherType type, const QList<Client
return matchers;
}
-DocumentLocatorFilter::DocumentLocatorFilter()
+LanguageCurrentDocumentFilter::LanguageCurrentDocumentFilter()
{
setId(Constants::LANGUAGECLIENT_DOCUMENT_FILTER_ID);
setDisplayName(Tr::tr(Constants::LANGUAGECLIENT_DOCUMENT_FILTER_DISPLAY_NAME));
@@ -186,64 +177,15 @@ DocumentLocatorFilter::DocumentLocatorFilter()
setDefaultShortcutString(".");
setDefaultIncludedByDefault(false);
setPriority(ILocatorFilter::Low);
- connect(EditorManager::instance(), &EditorManager::currentEditorChanged,
- this, &DocumentLocatorFilter::updateCurrentClient);
- connect(LanguageClientManager::instance(), &LanguageClientManager::clientInitialized,
- this, &DocumentLocatorFilter::updateCurrentClient);
}
-LocatorMatcherTasks DocumentLocatorFilter::matchers()
+LocatorMatcherTasks LanguageCurrentDocumentFilter::matchers()
{
return {currentDocumentMatcher()};
}
-void DocumentLocatorFilter::updateCurrentClient()
-{
- resetSymbols();
- disconnect(m_resetSymbolsConnection);
-
- TextEditor::TextDocument *document = TextEditor::TextDocument::currentTextDocument();
- if (Client *client = LanguageClientManager::clientForDocument(document);
- client && (client->locatorsEnabled() || m_forced)) {
-
- setEnabled(!m_forced);
- if (m_symbolCache != client->documentSymbolCache()) {
- disconnect(m_updateSymbolsConnection);
- m_symbolCache = client->documentSymbolCache();
- m_updateSymbolsConnection = connect(m_symbolCache, &DocumentSymbolCache::gotSymbols,
- this, &DocumentLocatorFilter::updateSymbols);
- }
- m_resetSymbolsConnection = connect(document, &IDocument::contentsChanged,
- this, &DocumentLocatorFilter::resetSymbols);
- m_currentUri = client->hostPathToServerUri(document->filePath());
- m_pathMapper = client->hostPathMapper();
- } else {
- disconnect(m_updateSymbolsConnection);
- m_symbolCache.clear();
- m_currentUri.clear();
- setEnabled(false);
- m_pathMapper = DocumentUri::PathMapper();
- }
-}
-
-void DocumentLocatorFilter::updateSymbols(const DocumentUri &uri,
- const DocumentSymbolsResult &symbols)
-{
- if (uri != m_currentUri)
- return;
- QMutexLocker locker(&m_mutex);
- m_currentSymbols = symbols;
- emit symbolsUpToDate(QPrivateSignal());
-}
-
-void DocumentLocatorFilter::resetSymbols()
-{
- QMutexLocker locker(&m_mutex);
- m_currentSymbols.reset();
-}
-
static LocatorFilterEntry entryForSymbolInfo(const SymbolInformation &info,
- DocumentUri::PathMapper pathMapper)
+ const DocumentUri::PathMapper &pathMapper)
{
LocatorFilterEntry entry;
entry.displayName = info.name();
@@ -305,78 +247,7 @@ Core::LocatorFilterEntries currentDocumentSymbols(const QString &input,
return {};
}
-void DocumentLocatorFilter::prepareSearch(const QString &/*entry*/)
-{
- QMutexLocker locker(&m_mutex);
- m_currentFilePath = m_pathMapper ? m_currentUri.toFilePath(m_pathMapper) : FilePath();
- if (m_symbolCache && !m_currentSymbols.has_value()) {
- locker.unlock();
- m_symbolCache->requestSymbols(m_currentUri, Schedule::Now);
- }
-}
-
-QList<LocatorFilterEntry> DocumentLocatorFilter::matchesFor(
- QFutureInterface<LocatorFilterEntry> &future, const QString &entry)
-{
- const auto docSymbolModifier = [](LocatorFilterEntry &entry, const DocumentSymbol &info,
- const LocatorFilterEntry &parent) {
- Q_UNUSED(parent)
- entry.displayName = info.name();
- if (std::optional<QString> detail = info.detail())
- entry.extraInfo = *detail;
- };
- return matchesForImpl(future, entry, docSymbolModifier);
-}
-
-QList<LocatorFilterEntry> DocumentLocatorFilter::matchesForImpl(
- QFutureInterface<LocatorFilterEntry> &future, const QString &entry,
- const DocSymbolModifier &docSymbolModifier)
-{
- const FuzzyMatcher::CaseSensitivity caseSensitivity
- = ILocatorFilter::caseSensitivity(entry) == Qt::CaseSensitive
- ? FuzzyMatcher::CaseSensitivity::CaseSensitive
- : FuzzyMatcher::CaseSensitivity::CaseInsensitive;
- const QRegularExpression regExp = FuzzyMatcher::createRegExp(entry, caseSensitivity);
- if (!regExp.isValid())
- return {};
-
- QMutexLocker locker(&m_mutex);
- if (!m_symbolCache)
- return {};
- if (!m_currentSymbols.has_value()) {
- QEventLoop loop;
- connect(this, &DocumentLocatorFilter::symbolsUpToDate, &loop, [&] { loop.exit(1); });
- QFutureWatcher<LocatorFilterEntry> watcher;
- connect(&watcher, &QFutureWatcher<LocatorFilterEntry>::canceled, &loop, &QEventLoop::quit);
- watcher.setFuture(future.future());
- locker.unlock();
- if (!loop.exec())
- return {};
- locker.relock();
- }
-
- QTC_ASSERT(m_currentSymbols.has_value(), return {});
-
- if (auto list = std::get_if<QList<DocumentSymbol>>(&*m_currentSymbols))
- return entriesForDocSymbols(*list, regExp, m_currentFilePath, docSymbolModifier);
- else if (auto list = std::get_if<QList<SymbolInformation>>(&*m_currentSymbols))
- return entriesForSymbolsInfo(*list, regExp, m_pathMapper);
-
- return {};
-}
-
-WorkspaceLocatorFilter::WorkspaceLocatorFilter()
- : WorkspaceLocatorFilter(QVector<SymbolKind>())
-{}
-
-LocatorMatcherTasks WorkspaceLocatorFilter::matchers()
-{
- return languageClientMatchers(MatcherType::AllSymbols,
- Utils::filtered(LanguageClientManager::clients(), &Client::locatorsEnabled));
-}
-
-WorkspaceLocatorFilter::WorkspaceLocatorFilter(const QVector<SymbolKind> &filter)
- : m_filterKinds(filter)
+LanguageAllSymbolsFilter::LanguageAllSymbolsFilter()
{
setId(Constants::LANGUAGECLIENT_WORKSPACE_FILTER_ID);
setDisplayName(Tr::tr(Constants::LANGUAGECLIENT_WORKSPACE_FILTER_DISPLAY_NAME));
@@ -386,94 +257,13 @@ WorkspaceLocatorFilter::WorkspaceLocatorFilter(const QVector<SymbolKind> &filter
setPriority(ILocatorFilter::Low);
}
-void WorkspaceLocatorFilter::prepareSearch(const QString &entry)
-{
- prepareSearchForClients(entry, Utils::filtered(LanguageClientManager::clients(),
- &Client::locatorsEnabled));
-}
-
-void WorkspaceLocatorFilter::prepareSearchForClients(const QString &entry,
- const QList<Client *> &clients)
+LocatorMatcherTasks LanguageAllSymbolsFilter::matchers()
{
- m_pendingRequests.clear();
- m_results.clear();
-
- if (clients.isEmpty())
- return;
-
- WorkspaceSymbolParams params;
- params.setQuery(entry);
- if (m_maxResultCount > 0)
- params.setLimit(m_maxResultCount);
-
- QMutexLocker locker(&m_mutex);
- for (auto client : std::as_const(clients)) {
- if (!client->reachable())
- continue;
- std::optional<std::variant<bool, WorkDoneProgressOptions>> capability
- = client->capabilities().workspaceSymbolProvider();
- if (!capability.has_value())
- continue;
- if (std::holds_alternative<bool>(*capability) && !std::get<bool>(*capability))
- continue;
- WorkspaceSymbolRequest request(params);
- request.setResponseCallback(
- [this, client](const WorkspaceSymbolRequest::Response &response) {
- handleResponse(client, response);
- });
- m_pendingRequests[client] = request.id();
- client->sendMessage(request);
- }
-}
-
-QList<LocatorFilterEntry> WorkspaceLocatorFilter::matchesFor(
- QFutureInterface<LocatorFilterEntry> &future, const QString & /*entry*/)
-{
- QMutexLocker locker(&m_mutex);
- if (!m_pendingRequests.isEmpty()) {
- QEventLoop loop;
- connect(this, &WorkspaceLocatorFilter::allRequestsFinished, &loop, [&] { loop.exit(1); });
- QFutureWatcher<LocatorFilterEntry> watcher;
- connect(&watcher,
- &QFutureWatcher<LocatorFilterEntry>::canceled,
- &loop,
- &QEventLoop::quit);
- watcher.setFuture(future.future());
- locker.unlock();
- if (!loop.exec())
- return {};
-
- locker.relock();
- }
-
- if (!m_filterKinds.isEmpty()) {
- m_results = Utils::filtered(m_results, [&](const SymbolInfoWithPathMapper &info) {
- return m_filterKinds.contains(SymbolKind(info.symbol.kind()));
- });
- }
- auto generateEntry = [](const SymbolInfoWithPathMapper &info) {
- return entryForSymbolInfo(info.symbol, info.mapper);
- };
- return Utils::transform(m_results, generateEntry).toList();
-}
-
-void WorkspaceLocatorFilter::handleResponse(Client *client,
- const WorkspaceSymbolRequest::Response &response)
-{
- QMutexLocker locker(&m_mutex);
- m_pendingRequests.remove(client);
- auto result = response.result().value_or(LanguageClientArray<SymbolInformation>());
- if (!result.isNull())
- m_results.append(
- Utils::transform(result.toList(), [client](const SymbolInformation &info) {
- return SymbolInfoWithPathMapper{info, client->hostPathMapper()};
- }));
- if (m_pendingRequests.isEmpty())
- emit allRequestsFinished(QPrivateSignal());
+ return languageClientMatchers(MatcherType::AllSymbols,
+ Utils::filtered(LanguageClientManager::clients(), &Client::locatorsEnabled));
}
-WorkspaceClassLocatorFilter::WorkspaceClassLocatorFilter()
- : WorkspaceLocatorFilter({SymbolKind::Class, SymbolKind::Struct})
+LanguageClassesFilter::LanguageClassesFilter()
{
setId(Constants::LANGUAGECLIENT_WORKSPACE_CLASS_FILTER_ID);
setDisplayName(Tr::tr(Constants::LANGUAGECLIENT_WORKSPACE_CLASS_FILTER_DISPLAY_NAME));
@@ -481,14 +271,13 @@ WorkspaceClassLocatorFilter::WorkspaceClassLocatorFilter()
setDefaultShortcutString("c");
}
-LocatorMatcherTasks WorkspaceClassLocatorFilter::matchers()
+LocatorMatcherTasks LanguageClassesFilter::matchers()
{
return languageClientMatchers(MatcherType::Classes,
Utils::filtered(LanguageClientManager::clients(), &Client::locatorsEnabled));
}
-WorkspaceMethodLocatorFilter::WorkspaceMethodLocatorFilter()
- : WorkspaceLocatorFilter({SymbolKind::Method, SymbolKind::Function, SymbolKind::Constructor})
+LanguageFunctionsFilter::LanguageFunctionsFilter()
{
setId(Constants::LANGUAGECLIENT_WORKSPACE_METHOD_FILTER_ID);
setDisplayName(Tr::tr(Constants::LANGUAGECLIENT_WORKSPACE_METHOD_FILTER_DISPLAY_NAME));
@@ -496,7 +285,7 @@ WorkspaceMethodLocatorFilter::WorkspaceMethodLocatorFilter()
setDefaultShortcutString("m");
}
-LocatorMatcherTasks WorkspaceMethodLocatorFilter::matchers()
+LocatorMatcherTasks LanguageFunctionsFilter::matchers()
{
return languageClientMatchers(MatcherType::Functions,
Utils::filtered(LanguageClientManager::clients(), &Client::locatorsEnabled));
diff --git a/src/plugins/languageclient/locatorfilter.h b/src/plugins/languageclient/locatorfilter.h
index 286e064c50..39d135723c 100644
--- a/src/plugins/languageclient/locatorfilter.h
+++ b/src/plugins/languageclient/locatorfilter.h
@@ -3,22 +3,15 @@
#pragma once
-#include "client.h"
#include "languageclient_global.h"
#include <coreplugin/locator/ilocatorfilter.h>
-#include <languageserverprotocol/languagefeatures.h>
-#include <languageserverprotocol/lsptypes.h>
-#include <languageserverprotocol/workspace.h>
-
-#include <QPointer>
-#include <QVector>
-
-namespace Core { class IEditor; }
+namespace LanguageServerProtocol { class DocumentSymbol; };
namespace LanguageClient {
+class Client;
class CurrentDocumentSymbolsData;
using DocSymbolModifier = std::function<void(Core::LocatorFilterEntry &,
@@ -30,100 +23,37 @@ Core::LocatorFilterEntries LANGUAGECLIENT_EXPORT currentDocumentSymbols(const QS
Core::LocatorMatcherTasks LANGUAGECLIENT_EXPORT languageClientMatchers(
Core::MatcherType type, const QList<Client *> &clients = {}, int maxResultCount = 0);
-class LanguageClientManager;
-
-class LANGUAGECLIENT_EXPORT DocumentLocatorFilter : public Core::ILocatorFilter
+class LanguageAllSymbolsFilter : public Core::ILocatorFilter
{
- Q_OBJECT
public:
- DocumentLocatorFilter();
-
- void prepareSearch(const QString &entry) override;
- QList<Core::LocatorFilterEntry> matchesFor(QFutureInterface<Core::LocatorFilterEntry> &future,
- const QString &entry) override;
-signals:
- void symbolsUpToDate(QPrivateSignal);
-
-protected:
- void forceUse() { m_forced = true; }
-
- Utils::FilePath m_currentFilePath;
-
- QList<Core::LocatorFilterEntry> matchesForImpl(
- QFutureInterface<Core::LocatorFilterEntry> &future, const QString &entry,
- const DocSymbolModifier &docSymbolModifier);
+ LanguageAllSymbolsFilter();
private:
Core::LocatorMatcherTasks matchers() final;
- void updateCurrentClient();
- void updateSymbols(const LanguageServerProtocol::DocumentUri &uri,
- const LanguageServerProtocol::DocumentSymbolsResult &symbols);
- void resetSymbols();
-
- QMutex m_mutex;
- QMetaObject::Connection m_updateSymbolsConnection;
- QMetaObject::Connection m_resetSymbolsConnection;
- std::optional<LanguageServerProtocol::DocumentSymbolsResult> m_currentSymbols;
- LanguageServerProtocol::DocumentUri::PathMapper m_pathMapper;
- bool m_forced = false;
- QPointer<DocumentSymbolCache> m_symbolCache;
- LanguageServerProtocol::DocumentUri m_currentUri;
};
-class LANGUAGECLIENT_EXPORT WorkspaceLocatorFilter : public Core::ILocatorFilter
+class LanguageClassesFilter : public Core::ILocatorFilter
{
- Q_OBJECT
public:
- WorkspaceLocatorFilter();
-
- /// request workspace symbols for all clients with enabled locator
- void prepareSearch(const QString &entry) override;
- QList<Core::LocatorFilterEntry> matchesFor(QFutureInterface<Core::LocatorFilterEntry> &future,
- const QString &entry) override;
-signals:
- void allRequestsFinished(QPrivateSignal);
-
-protected:
- explicit WorkspaceLocatorFilter(const QVector<LanguageServerProtocol::SymbolKind> &filter);
-
- /// force request workspace symbols for all given clients
- void prepareSearchForClients(const QString &entry, const QList<Client *> &clients);
- void setMaxResultCount(qint64 limit) { m_maxResultCount = limit; }
+ LanguageClassesFilter();
private:
- Core::LocatorMatcherTasks matchers() override;
- void handleResponse(Client *client,
- const LanguageServerProtocol::WorkspaceSymbolRequest::Response &response);
-
- QMutex m_mutex;
-
- struct SymbolInfoWithPathMapper
- {
- LanguageServerProtocol::SymbolInformation symbol;
- LanguageServerProtocol::DocumentUri::PathMapper mapper;
- };
-
- QMap<Client *, LanguageServerProtocol::MessageId> m_pendingRequests;
- QVector<SymbolInfoWithPathMapper> m_results;
- QVector<LanguageServerProtocol::SymbolKind> m_filterKinds;
- qint64 m_maxResultCount = 0;
+ Core::LocatorMatcherTasks matchers() final;
};
-// TODO: Don't derive, flatten the hierarchy
-class LANGUAGECLIENT_EXPORT WorkspaceClassLocatorFilter : public WorkspaceLocatorFilter
+class LanguageFunctionsFilter : public Core::ILocatorFilter
{
public:
- WorkspaceClassLocatorFilter();
+ LanguageFunctionsFilter();
private:
Core::LocatorMatcherTasks matchers() final;
};
-// TODO: Don't derive, flatten the hierarchy
-class LANGUAGECLIENT_EXPORT WorkspaceMethodLocatorFilter : public WorkspaceLocatorFilter
+class LanguageCurrentDocumentFilter : public Core::ILocatorFilter
{
public:
- WorkspaceMethodLocatorFilter();
+ LanguageCurrentDocumentFilter();
private:
Core::LocatorMatcherTasks matchers() final;