diff --git a/src/plugins/clangcodemodel/clangdlocatorfilters.cpp b/src/plugins/clangcodemodel/clangdlocatorfilters.cpp index 58166fd499c..593bd4c6669 100644 --- a/src/plugins/clangcodemodel/clangdlocatorfilters.cpp +++ b/src/plugins/clangcodemodel/clangdlocatorfilters.cpp @@ -32,17 +32,6 @@ 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: @@ -72,7 +61,7 @@ public: } void prepareSearch(const QString &entry) override { - prepareSearchForClients(entry, clientsForOpenProjects()); + prepareSearchForClients(entry, ClangModelManagerSupport::clientsForOpenProjects()); } }; @@ -105,7 +94,7 @@ public: } void prepareSearch(const QString &entry) override { - prepareSearchForClients(entry, clientsForOpenProjects()); + prepareSearchForClients(entry, ClangModelManagerSupport::clientsForOpenProjects()); } }; @@ -138,7 +127,7 @@ public: } void prepareSearch(const QString &entry) override { - prepareSearchForClients(entry, clientsForOpenProjects()); + prepareSearchForClients(entry, ClangModelManagerSupport::clientsForOpenProjects()); } }; diff --git a/src/plugins/clangcodemodel/clangmodelmanagersupport.cpp b/src/plugins/clangcodemodel/clangmodelmanagersupport.cpp index 4d9ee95d860..43b41e54f9b 100644 --- a/src/plugins/clangcodemodel/clangmodelmanagersupport.cpp +++ b/src/plugins/clangcodemodel/clangmodelmanagersupport.cpp @@ -205,6 +205,21 @@ ClangModelManagerSupport::ClangModelManagerSupport() cppModelManager()->setLocatorFilter(std::make_unique()); cppModelManager()->setClassesFilter(std::make_unique()); cppModelManager()->setFunctionsFilter(std::make_unique()); + // Setup matchers + using WorkspaceMatcherCreator = std::function; + const auto matcherCreator = [](const WorkspaceMatcherCreator &creator) { + const QList clients = clientsForOpenProjects(); + QList matchers; + for (Client *client : clients) + matchers << creator(client, 10000); + return matchers; + }; + LocatorMatcher::addLocatorMatcherCreator( + [matcherCreator] { return matcherCreator(&LanguageClient::workspaceLocatorMatcher); }); + LocatorMatcher::addClassMatcherCreator( + [matcherCreator] { return matcherCreator(&LanguageClient::workspaceClassMatcher); }); + LocatorMatcher::addFunctionMatcherCreator( + [matcherCreator] { return matcherCreator(&LanguageClient::workspaceFunctionMatcher); }); EditorManager *editorManager = EditorManager::instance(); connect(editorManager, &EditorManager::editorOpened, @@ -587,6 +602,17 @@ void ClangModelManagerSupport::updateLanguageClient(Project *project) m_generatorSynchronizer.addFuture(future); } +QList ClangModelManagerSupport::clientsForOpenProjects() +{ + QSet clients; + const QList projects = ProjectManager::projects(); + for (Project *project : projects) { + if (Client *client = ClangModelManagerSupport::clientForProject(project)) + clients << client; + } + return clients.values(); +} + ClangdClient *ClangModelManagerSupport::clientForProject(const Project *project) { if (sessionModeEnabled()) diff --git a/src/plugins/clangcodemodel/clangmodelmanagersupport.h b/src/plugins/clangcodemodel/clangmodelmanagersupport.h index a901b4407e2..140239550d8 100644 --- a/src/plugins/clangcodemodel/clangmodelmanagersupport.h +++ b/src/plugins/clangcodemodel/clangmodelmanagersupport.h @@ -24,6 +24,7 @@ QT_END_NAMESPACE namespace Core { class IEditor; } namespace CppEditor { class RefactoringEngineInterface; } +namespace LanguageClient { class Client; } namespace TextEditor { class TextEditorWidget; } namespace ClangCodeModel { @@ -45,6 +46,7 @@ public: TextEditor::TextDocument *baseTextDocument) override; bool usesClangd(const TextEditor::TextDocument *document) const override; + static QList clientsForOpenProjects(); static ClangdClient *clientForProject(const ProjectExplorer::Project *project); static ClangdClient *clientForFile(const Utils::FilePath &file); diff --git a/src/plugins/coreplugin/locator/ilocatorfilter.cpp b/src/plugins/coreplugin/locator/ilocatorfilter.cpp index e2b1fed4823..98c18ac1b53 100644 --- a/src/plugins/coreplugin/locator/ilocatorfilter.cpp +++ b/src/plugins/coreplugin/locator/ilocatorfilter.cpp @@ -427,6 +427,51 @@ LocatorMatcherTask::OutputData LocatorMatcher::runBlocking(const QList s_locatorMatcherCreators = {}; +static QList s_classMatcherCreators = {}; +static QList s_functionMatcherCreators = {}; + +void LocatorMatcher::addLocatorMatcherCreator(const LocatorMatcherTaskCreator &creator) +{ + QTC_ASSERT(creator, return); + s_locatorMatcherCreators.append(creator); +} + +void LocatorMatcher::addClassMatcherCreator(const LocatorMatcherTaskCreator &creator) +{ + QTC_ASSERT(creator, return); + s_classMatcherCreators.append(creator); +} + +void LocatorMatcher::addFunctionMatcherCreator(const LocatorMatcherTaskCreator &creator) +{ + QTC_ASSERT(creator, return); + s_functionMatcherCreators.append(creator); +} + +static QList matchers(const QList &creators) +{ + QList result; + for (const LocatorMatcherTaskCreator &creator : creators) + result << creator(); + return result; +} + +QList LocatorMatcher::locatorMatchers() +{ + return matchers(s_locatorMatcherCreators); +} + +QList LocatorMatcher::classMatchers() +{ + return matchers(s_classMatcherCreators); +} + +QList LocatorMatcher::functionMatchers() +{ + return matchers(s_functionMatcherCreators); +} + static QList g_locatorFilters; /*! diff --git a/src/plugins/coreplugin/locator/ilocatorfilter.h b/src/plugins/coreplugin/locator/ilocatorfilter.h index 7d41eba9e13..bcc413905f7 100644 --- a/src/plugins/coreplugin/locator/ilocatorfilter.h +++ b/src/plugins/coreplugin/locator/ilocatorfilter.h @@ -142,6 +142,7 @@ public: Utils::Tasking::TreeStorage storage; }; +using LocatorMatcherTaskCreator = std::function()>; class LocatorMatcherPrivate; class CORE_EXPORT LocatorMatcher final : public QObject @@ -165,6 +166,15 @@ public: static LocatorMatcherTask::OutputData runBlocking(const QList &tasks, const LocatorMatcherTask::InputData &input, int parallelLimit = 0); + + static void addLocatorMatcherCreator(const LocatorMatcherTaskCreator &creator); + static void addClassMatcherCreator(const LocatorMatcherTaskCreator &creator); + static void addFunctionMatcherCreator(const LocatorMatcherTaskCreator &creator); + + static QList locatorMatchers(); + static QList classMatchers(); + static QList functionMatchers(); + signals: void serialOutputDataReady(const LocatorMatcherTask::OutputData &serialOutputData); void done(bool success); diff --git a/src/plugins/cppeditor/cppmodelmanager.cpp b/src/plugins/cppeditor/cppmodelmanager.cpp index 34da9da3f4c..9cc3b1c214b 100644 --- a/src/plugins/cppeditor/cppmodelmanager.cpp +++ b/src/plugins/cppeditor/cppmodelmanager.cpp @@ -904,6 +904,10 @@ void CppModelManager::initCppTools() setSymbolsFindFilter(std::make_unique(this)); setCurrentDocumentFilter( std::make_unique(this)); + // Setup matchers + LocatorMatcher::addLocatorMatcherCreator([] { return QList{CppEditor::cppLocatorMatcher()}; }); + LocatorMatcher::addClassMatcherCreator([] { return QList{CppEditor::cppClassMatcher()}; }); + LocatorMatcher::addFunctionMatcherCreator([] { return QList{CppEditor::cppFunctionMatcher()}; }); } CppModelManager::CppModelManager()