diff --git a/src/plugins/clangcodemodel/clangdlocatorfilters.cpp b/src/plugins/clangcodemodel/clangdlocatorfilters.cpp index 4da1ece4cc8..76efcec54c5 100644 --- a/src/plugins/clangcodemodel/clangdlocatorfilters.cpp +++ b/src/plugins/clangcodemodel/clangdlocatorfilters.cpp @@ -23,6 +23,7 @@ using namespace Core; using namespace LanguageClient; using namespace LanguageServerProtocol; +using namespace ProjectExplorer; using namespace Utils; namespace ClangCodeModel { @@ -30,6 +31,17 @@ namespace Internal { const int MaxResultCount = 10000; +static QList clientsForOpenProjects() +{ + QSet clients; + const QList projects = ProjectManager::projects(); + for (Project *project : projects) { + if (Client *client = ClangModelManagerSupport::clientForProject(project)) + clients << client; + } + return clients.values(); +} + class CppLocatorFilter : public CppEditor::CppLocatorFilter { public: @@ -56,6 +68,10 @@ public: setHidden(true); setMaxResultCount(MaxResultCount); } + void prepareSearch(const QString &entry) override + { + prepareSearchForClients(entry, clientsForOpenProjects()); + } }; @@ -84,6 +100,10 @@ public: setHidden(true); setMaxResultCount(MaxResultCount); } + void prepareSearch(const QString &entry) override + { + prepareSearchForClients(entry, clientsForOpenProjects()); + } }; class CppFunctionsFilter : public CppEditor::CppFunctionsFilter @@ -112,6 +132,10 @@ public: setHidden(true); setMaxResultCount(MaxResultCount); } + void prepareSearch(const QString &entry) override + { + prepareSearchForClients(entry, clientsForOpenProjects()); + } }; @@ -121,7 +145,7 @@ ClangGlobalSymbolFilter::ClangGlobalSymbolFilter() } ClangGlobalSymbolFilter::ClangGlobalSymbolFilter(ILocatorFilter *cppFilter, - WorkspaceLocatorFilter *lspFilter) + ILocatorFilter *lspFilter) : m_cppFilter(cppFilter), m_lspFilter(lspFilter) { setId(CppEditor::Constants::LOCATOR_FILTER_ID); @@ -139,13 +163,7 @@ ClangGlobalSymbolFilter::~ClangGlobalSymbolFilter() void ClangGlobalSymbolFilter::prepareSearch(const QString &entry) { m_cppFilter->prepareSearch(entry); - QList clients; - for (ProjectExplorer::Project * const project : ProjectExplorer::ProjectManager::projects()) { - if (Client * const client = ClangModelManagerSupport::clientForProject(project)) - clients << client; - } - if (!clients.isEmpty()) - m_lspFilter->prepareSearch(entry, clients); + m_lspFilter->prepareSearch(entry); } QList ClangGlobalSymbolFilter::matchesFor( diff --git a/src/plugins/clangcodemodel/clangdlocatorfilters.h b/src/plugins/clangcodemodel/clangdlocatorfilters.h index 11cf4c00b6b..3a6011b8eea 100644 --- a/src/plugins/clangcodemodel/clangdlocatorfilters.h +++ b/src/plugins/clangcodemodel/clangdlocatorfilters.h @@ -15,7 +15,7 @@ class ClangGlobalSymbolFilter : public Core::ILocatorFilter public: ClangGlobalSymbolFilter(); ClangGlobalSymbolFilter(Core::ILocatorFilter *cppFilter, - LanguageClient::WorkspaceLocatorFilter *lspFilter); + Core::ILocatorFilter *lspFilter); ~ClangGlobalSymbolFilter() override; private: @@ -23,7 +23,7 @@ private: QList matchesFor(QFutureInterface &future, const QString &entry) override; Core::ILocatorFilter * const m_cppFilter; - LanguageClient::WorkspaceLocatorFilter * const m_lspFilter; + Core::ILocatorFilter * const m_lspFilter; }; class ClangClassesFilter : public ClangGlobalSymbolFilter diff --git a/src/plugins/languageclient/locatorfilter.cpp b/src/plugins/languageclient/locatorfilter.cpp index f646209e28d..29619496c50 100644 --- a/src/plugins/languageclient/locatorfilter.cpp +++ b/src/plugins/languageclient/locatorfilter.cpp @@ -216,21 +216,23 @@ WorkspaceLocatorFilter::WorkspaceLocatorFilter(const QVector &filter void WorkspaceLocatorFilter::prepareSearch(const QString &entry) { - prepareSearch(entry, LanguageClientManager::clients(), false); + prepareSearchHelper(entry, LanguageClientManager::clients(), false); } -void WorkspaceLocatorFilter::prepareSearch(const QString &entry, const QList &clients) +void WorkspaceLocatorFilter::prepareSearchForClients(const QString &entry, const QList &clients) { - prepareSearch(entry, clients, true); + prepareSearchHelper(entry, clients, true); } -void WorkspaceLocatorFilter::prepareSearch(const QString &entry, - const QList &clients, - bool force) +void WorkspaceLocatorFilter::prepareSearchHelper(const QString &entry, + const QList &clients, bool force) { m_pendingRequests.clear(); m_results.clear(); + if (clients.isEmpty()) + return; + WorkspaceSymbolParams params; params.setQuery(entry); if (m_maxResultCount > 0) diff --git a/src/plugins/languageclient/locatorfilter.h b/src/plugins/languageclient/locatorfilter.h index a6e107e97eb..58d8560c8e7 100644 --- a/src/plugins/languageclient/locatorfilter.h +++ b/src/plugins/languageclient/locatorfilter.h @@ -77,7 +77,7 @@ public: /// request workspace symbols for all clients with enabled locator void prepareSearch(const QString &entry) override; /// force request workspace symbols for all given clients - void prepareSearch(const QString &entry, const QList &clients); + void prepareSearchForClients(const QString &entry, const QList &clients); QList matchesFor(QFutureInterface &future, const QString &entry) override; signals: @@ -89,7 +89,7 @@ protected: void setMaxResultCount(qint64 limit) { m_maxResultCount = limit; } private: - void prepareSearch(const QString &entry, const QList &clients, bool force); + void prepareSearchHelper(const QString &entry, const QList &clients, bool force); void handleResponse(Client *client, const LanguageServerProtocol::WorkspaceSymbolRequest::Response &response);