LocatorMatcher: Introduce MatcherType enum

Use it for registering/getting different kinds of matchers.

Change-Id: I6f944e0332bf8c512892a00b8ba88f9939f34682
Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
Reviewed-by: Christian Kandeler <christian.kandeler@qt.io>
Reviewed-by: <github-actions-qt-creator@cristianadam.eu>
This commit is contained in:
Jarek Kobus
2023-04-11 15:02:36 +02:00
parent f5cccab95b
commit 99b5d93cfb
10 changed files with 46 additions and 73 deletions

View File

@@ -214,11 +214,11 @@ ClangModelManagerSupport::ClangModelManagerSupport()
matchers << creator(client, 10000); matchers << creator(client, 10000);
return matchers; return matchers;
}; };
LocatorMatcher::addLocatorMatcherCreator( LocatorMatcher::addMatcherCreator(MatcherType::AllSymbols,
[matcherCreator] { return matcherCreator(&LanguageClient::workspaceLocatorMatcher); }); [matcherCreator] { return matcherCreator(&LanguageClient::workspaceAllSymbolsMatcher); });
LocatorMatcher::addClassMatcherCreator( LocatorMatcher::addMatcherCreator(MatcherType::Classes,
[matcherCreator] { return matcherCreator(&LanguageClient::workspaceClassMatcher); }); [matcherCreator] { return matcherCreator(&LanguageClient::workspaceClassMatcher); });
LocatorMatcher::addFunctionMatcherCreator( LocatorMatcher::addMatcherCreator(MatcherType::Functions,
[matcherCreator] { return matcherCreator(&LanguageClient::workspaceFunctionMatcher); }); [matcherCreator] { return matcherCreator(&LanguageClient::workspaceFunctionMatcher); });
EditorManager *editorManager = EditorManager::instance(); EditorManager *editorManager = EditorManager::instance();

View File

@@ -427,51 +427,23 @@ LocatorMatcherTask::OutputData LocatorMatcher::runBlocking(const QList<LocatorMa
return tree.outputData(); return tree.outputData();
} }
static QList<LocatorMatcherTaskCreator> s_locatorMatcherCreators = {}; static QHash<MatcherType, QList<LocatorMatcherTaskCreator>> s_matcherCreators = {};
static QList<LocatorMatcherTaskCreator> s_classMatcherCreators = {};
static QList<LocatorMatcherTaskCreator> s_functionMatcherCreators = {};
void LocatorMatcher::addLocatorMatcherCreator(const LocatorMatcherTaskCreator &creator) void LocatorMatcher::addMatcherCreator(MatcherType type, const LocatorMatcherTaskCreator &creator)
{ {
QTC_ASSERT(creator, return); QTC_ASSERT(creator, return);
s_locatorMatcherCreators.append(creator); s_matcherCreators[type].append(creator);
} }
void LocatorMatcher::addClassMatcherCreator(const LocatorMatcherTaskCreator &creator) QList<LocatorMatcherTask> LocatorMatcher::matchers(MatcherType type)
{
QTC_ASSERT(creator, return);
s_classMatcherCreators.append(creator);
}
void LocatorMatcher::addFunctionMatcherCreator(const LocatorMatcherTaskCreator &creator)
{
QTC_ASSERT(creator, return);
s_functionMatcherCreators.append(creator);
}
static QList<LocatorMatcherTask> matchers(const QList<LocatorMatcherTaskCreator> &creators)
{ {
const QList<LocatorMatcherTaskCreator> creators = s_matcherCreators.value(type);
QList<LocatorMatcherTask> result; QList<LocatorMatcherTask> result;
for (const LocatorMatcherTaskCreator &creator : creators) for (const LocatorMatcherTaskCreator &creator : creators)
result << creator(); result << creator();
return result; return result;
} }
QList<LocatorMatcherTask> LocatorMatcher::locatorMatchers()
{
return matchers(s_locatorMatcherCreators);
}
QList<LocatorMatcherTask> LocatorMatcher::classMatchers()
{
return matchers(s_classMatcherCreators);
}
QList<LocatorMatcherTask> LocatorMatcher::functionMatchers()
{
return matchers(s_functionMatcherCreators);
}
static QList<ILocatorFilter *> g_locatorFilters; static QList<ILocatorFilter *> g_locatorFilters;
/*! /*!

View File

@@ -145,6 +145,12 @@ public:
using LocatorMatcherTaskCreator = std::function<QList<LocatorMatcherTask>()>; using LocatorMatcherTaskCreator = std::function<QList<LocatorMatcherTask>()>;
class LocatorMatcherPrivate; class LocatorMatcherPrivate;
enum class MatcherType {
AllSymbols,
Classes,
Functions
};
class CORE_EXPORT LocatorMatcher final : public QObject class CORE_EXPORT LocatorMatcher final : public QObject
{ {
Q_OBJECT Q_OBJECT
@@ -167,13 +173,8 @@ public:
const LocatorMatcherTask::InputData &input, const LocatorMatcherTask::InputData &input,
int parallelLimit = 0); int parallelLimit = 0);
static void addLocatorMatcherCreator(const LocatorMatcherTaskCreator &creator); static void addMatcherCreator(MatcherType type, const LocatorMatcherTaskCreator &creator);
static void addClassMatcherCreator(const LocatorMatcherTaskCreator &creator); static QList<LocatorMatcherTask> matchers(MatcherType type);
static void addFunctionMatcherCreator(const LocatorMatcherTaskCreator &creator);
static QList<LocatorMatcherTask> locatorMatchers();
static QList<LocatorMatcherTask> classMatchers();
static QList<LocatorMatcherTask> functionMatchers();
signals: signals:
void serialOutputDataReady(const LocatorMatcherTask::OutputData &serialOutputData); void serialOutputDataReady(const LocatorMatcherTask::OutputData &serialOutputData);

View File

@@ -110,7 +110,7 @@ LocatorMatcherTask locatorMatcher(IndexItem::ItemType type, const EntryFromIndex
return {Async<LocatorMatcherTask::OutputData>(onSetup, onDone, onDone), storage}; return {Async<LocatorMatcherTask::OutputData>(onSetup, onDone, onDone), storage};
} }
LocatorMatcherTask cppLocatorMatcher() LocatorMatcherTask cppAllSymbolsMatcher()
{ {
const auto converter = [](const IndexItem::Ptr &info) { const auto converter = [](const IndexItem::Ptr &info) {
// TODO: Passing nullptr for filter -> accept won't work now. Replace with accept function. // TODO: Passing nullptr for filter -> accept won't work now. Replace with accept function.

View File

@@ -10,7 +10,7 @@
namespace CppEditor { namespace CppEditor {
Core::LocatorMatcherTask CPPEDITOR_EXPORT cppLocatorMatcher(); Core::LocatorMatcherTask CPPEDITOR_EXPORT cppAllSymbolsMatcher();
Core::LocatorMatcherTask CPPEDITOR_EXPORT cppClassMatcher(); Core::LocatorMatcherTask CPPEDITOR_EXPORT cppClassMatcher();
Core::LocatorMatcherTask CPPEDITOR_EXPORT cppFunctionMatcher(); Core::LocatorMatcherTask CPPEDITOR_EXPORT cppFunctionMatcher();

View File

@@ -127,7 +127,7 @@ void LocatorFilterTest::testLocatorFilter()
{ {
QFETCH(QString, testFile); QFETCH(QString, testFile);
QFETCH(ILocatorFilter *, filter); QFETCH(ILocatorFilter *, filter);
QFETCH(MatcherCreator, matcherCreator); QFETCH(MatcherType, matcherType);
QFETCH(QString, searchText); QFETCH(QString, searchText);
QFETCH(ResultDataList, expectedResults); QFETCH(ResultDataList, expectedResults);
@@ -138,7 +138,8 @@ void LocatorFilterTest::testLocatorFilter()
{ {
Tests::VerifyCleanCppModelManager verify; Tests::VerifyCleanCppModelManager verify;
CppLocatorFilterTestCase(nullptr, matcherCreator(), testFile, searchText, expectedResults); CppLocatorFilterTestCase(nullptr, LocatorMatcher::matchers(matcherType), testFile,
searchText, expectedResults);
} }
} }
@@ -146,7 +147,7 @@ void LocatorFilterTest::testLocatorFilter_data()
{ {
QTest::addColumn<QString>("testFile"); QTest::addColumn<QString>("testFile");
QTest::addColumn<ILocatorFilter *>("filter"); QTest::addColumn<ILocatorFilter *>("filter");
QTest::addColumn<MatcherCreator>("matcherCreator"); QTest::addColumn<MatcherType>("matcherType");
QTest::addColumn<QString>("searchText"); QTest::addColumn<QString>("searchText");
QTest::addColumn<ResultDataList>("expectedResults"); QTest::addColumn<ResultDataList>("expectedResults");
@@ -155,10 +156,6 @@ void LocatorFilterTest::testLocatorFilter_data()
ILocatorFilter *cppClassesFilter = cppModelManager->classesFilter(); ILocatorFilter *cppClassesFilter = cppModelManager->classesFilter();
ILocatorFilter *cppLocatorFilter = cppModelManager->locatorFilter(); ILocatorFilter *cppLocatorFilter = cppModelManager->locatorFilter();
const MatcherCreator functionMatcherCreator = &LocatorMatcher::functionMatchers;
const MatcherCreator classMatcherCreator = &LocatorMatcher::classMatchers;
const MatcherCreator locatorMatcherCreator = &LocatorMatcher::locatorMatchers;
MyTestDataDir testDirectory("testdata_basic"); MyTestDataDir testDirectory("testdata_basic");
QString testFile = testDirectory.file("file1.cpp"); QString testFile = testDirectory.file("file1.cpp");
testFile[0] = testFile[0].toLower(); // Ensure Windows path sorts after scope names. testFile[0] = testFile[0].toLower(); // Ensure Windows path sorts after scope names.
@@ -169,7 +166,7 @@ void LocatorFilterTest::testLocatorFilter_data()
QTest::newRow("CppFunctionsFilter") QTest::newRow("CppFunctionsFilter")
<< testFile << testFile
<< cppFunctionsFilter << cppFunctionsFilter
<< functionMatcherCreator << MatcherType::Functions
<< "function" << "function"
<< ResultDataList{ << ResultDataList{
ResultData("functionDefinedInClass(bool, int)", ResultData("functionDefinedInClass(bool, int)",
@@ -192,7 +189,7 @@ void LocatorFilterTest::testLocatorFilter_data()
QTest::newRow("CppFunctionsFilter-Sorting") QTest::newRow("CppFunctionsFilter-Sorting")
<< testFile << testFile
<< cppFunctionsFilter << cppFunctionsFilter
<< functionMatcherCreator << MatcherType::Functions
<< "pos" << "pos"
<< ResultDataList{ << ResultDataList{
ResultData("positiveNumber()", testFileShort), ResultData("positiveNumber()", testFileShort),
@@ -204,7 +201,7 @@ void LocatorFilterTest::testLocatorFilter_data()
QTest::newRow("CppFunctionsFilter-arguments") QTest::newRow("CppFunctionsFilter-arguments")
<< testFile << testFile
<< cppFunctionsFilter << cppFunctionsFilter
<< functionMatcherCreator << MatcherType::Functions
<< "function*bool" << "function*bool"
<< ResultDataList{ << ResultDataList{
ResultData("functionDefinedInClass(bool, int)", ResultData("functionDefinedInClass(bool, int)",
@@ -221,7 +218,7 @@ void LocatorFilterTest::testLocatorFilter_data()
QTest::newRow("CppFunctionsFilter-WithNamespacePrefix") QTest::newRow("CppFunctionsFilter-WithNamespacePrefix")
<< testFile << testFile
<< cppFunctionsFilter << cppFunctionsFilter
<< functionMatcherCreator << MatcherType::Functions
<< "mynamespace::" << "mynamespace::"
<< ResultDataList{ << ResultDataList{
ResultData("MyClass()", "MyNamespace::MyClass (file1.cpp)"), ResultData("MyClass()", "MyNamespace::MyClass (file1.cpp)"),
@@ -237,7 +234,7 @@ void LocatorFilterTest::testLocatorFilter_data()
QTest::newRow("CppFunctionsFilter-WithClassPrefix") QTest::newRow("CppFunctionsFilter-WithClassPrefix")
<< testFile << testFile
<< cppFunctionsFilter << cppFunctionsFilter
<< functionMatcherCreator << MatcherType::Functions
<< "MyClass::func" << "MyClass::func"
<< ResultDataList{ << ResultDataList{
ResultData("functionDefinedInClass(bool, int)", ResultData("functionDefinedInClass(bool, int)",
@@ -259,7 +256,7 @@ void LocatorFilterTest::testLocatorFilter_data()
QTest::newRow("CppClassesFilter") QTest::newRow("CppClassesFilter")
<< testFile << testFile
<< cppClassesFilter << cppClassesFilter
<< classMatcherCreator << MatcherType::Classes
<< "myclass" << "myclass"
<< ResultDataList{ << ResultDataList{
ResultData("MyClass", "<anonymous namespace>"), ResultData("MyClass", "<anonymous namespace>"),
@@ -270,7 +267,7 @@ void LocatorFilterTest::testLocatorFilter_data()
QTest::newRow("CppClassesFilter-WithNamespacePrefix") QTest::newRow("CppClassesFilter-WithNamespacePrefix")
<< testFile << testFile
<< cppClassesFilter << cppClassesFilter
<< classMatcherCreator << MatcherType::Classes
<< "mynamespace::" << "mynamespace::"
<< ResultDataList{ << ResultDataList{
ResultData("MyClass", "MyNamespace") ResultData("MyClass", "MyNamespace")
@@ -280,7 +277,7 @@ void LocatorFilterTest::testLocatorFilter_data()
QTest::newRow("CppLocatorFilter-filtered") QTest::newRow("CppLocatorFilter-filtered")
<< testFile << testFile
<< cppLocatorFilter << cppLocatorFilter
<< locatorMatcherCreator << MatcherType::AllSymbols
<< "my" << "my"
<< ResultDataList{ << ResultDataList{
ResultData("MyClass", testFileShort), ResultData("MyClass", testFileShort),
@@ -307,7 +304,7 @@ void LocatorFilterTest::testLocatorFilter_data()
QTest::newRow("CppClassesFilter-ObjC") QTest::newRow("CppClassesFilter-ObjC")
<< objTestFile << objTestFile
<< cppClassesFilter << cppClassesFilter
<< classMatcherCreator << MatcherType::Classes
<< "M" << "M"
<< ResultDataList{ << ResultDataList{
ResultData("MyClass", objTestFileShort), ResultData("MyClass", objTestFileShort),
@@ -319,7 +316,7 @@ void LocatorFilterTest::testLocatorFilter_data()
QTest::newRow("CppFunctionsFilter-ObjC") QTest::newRow("CppFunctionsFilter-ObjC")
<< objTestFile << objTestFile
<< cppFunctionsFilter << cppFunctionsFilter
<< functionMatcherCreator << MatcherType::Functions
<< "M" << "M"
<< ResultDataList{ << ResultDataList{
ResultData("anotherMethod", "MyClass (file1.mm)"), ResultData("anotherMethod", "MyClass (file1.mm)"),
@@ -428,8 +425,8 @@ void LocatorFilterTest::testFunctionsFilterHighlighting()
{ {
Tests::VerifyCleanCppModelManager verify; Tests::VerifyCleanCppModelManager verify;
const MatcherCreator matcherCreator = &LocatorMatcher::functionMatchers; CppLocatorFilterTestCase(nullptr, LocatorMatcher::matchers(MatcherType::Functions),
CppLocatorFilterTestCase(nullptr, matcherCreator(), testFile, searchText, expectedResults); testFile, searchText, expectedResults);
} }
} }

View File

@@ -535,7 +535,7 @@ void CppModelManager::findUnusedFunctions(const FilePath &folder)
// Step 1: Employ locator to find all functions // Step 1: Employ locator to find all functions
LocatorMatcher *matcher = new LocatorMatcher; LocatorMatcher *matcher = new LocatorMatcher;
matcher->setTasks(LocatorMatcher::functionMatchers()); matcher->setTasks(LocatorMatcher::matchers(MatcherType::Functions));
const QPointer<SearchResult> search const QPointer<SearchResult> search
= SearchResultWindow::instance()->startNewSearch(Tr::tr("Find Unused Functions"), = SearchResultWindow::instance()->startNewSearch(Tr::tr("Find Unused Functions"),
{}, {},
@@ -897,9 +897,12 @@ void CppModelManager::initCppTools()
setSymbolsFindFilter(std::make_unique<SymbolsFindFilter>(this)); setSymbolsFindFilter(std::make_unique<SymbolsFindFilter>(this));
setCurrentDocumentFilter(std::make_unique<CppCurrentDocumentFilter>()); setCurrentDocumentFilter(std::make_unique<CppCurrentDocumentFilter>());
// Setup matchers // Setup matchers
LocatorMatcher::addLocatorMatcherCreator([] { return QList{CppEditor::cppLocatorMatcher()}; }); LocatorMatcher::addMatcherCreator(MatcherType::AllSymbols,
LocatorMatcher::addClassMatcherCreator([] { return QList{CppEditor::cppClassMatcher()}; }); [] { return QList{CppEditor::cppAllSymbolsMatcher()}; });
LocatorMatcher::addFunctionMatcherCreator([] { return QList{CppEditor::cppFunctionMatcher()}; }); LocatorMatcher::addMatcherCreator(MatcherType::Classes,
[] { return QList{CppEditor::cppClassMatcher()}; });
LocatorMatcher::addMatcherCreator(MatcherType::Functions,
[] { return QList{CppEditor::cppFunctionMatcher()}; });
} }
CppModelManager::CppModelManager() CppModelManager::CppModelManager()

View File

@@ -94,7 +94,7 @@ LocatorMatcherTask locatorMatcher(Client *client, int maxResultCount,
return {root, storage}; return {root, storage};
} }
LocatorMatcherTask workspaceLocatorMatcher(Client *client, int maxResultCount) LocatorMatcherTask workspaceAllSymbolsMatcher(Client *client, int maxResultCount)
{ {
return locatorMatcher(client, maxResultCount, {}); return locatorMatcher(client, maxResultCount, {});
} }

View File

@@ -20,8 +20,8 @@ namespace Core { class IEditor; }
namespace LanguageClient { namespace LanguageClient {
// TODO: Could be public methods of Client instead // TODO: Could be public methods of Client instead
Core::LocatorMatcherTask LANGUAGECLIENT_EXPORT workspaceLocatorMatcher(Client *client, Core::LocatorMatcherTask LANGUAGECLIENT_EXPORT workspaceAllSymbolsMatcher(Client *client,
int maxResultCount = 0); int maxResultCount = 0);
Core::LocatorMatcherTask LANGUAGECLIENT_EXPORT workspaceClassMatcher(Client *client, Core::LocatorMatcherTask LANGUAGECLIENT_EXPORT workspaceClassMatcher(Client *client,
int maxResultCount = 0); int maxResultCount = 0);
Core::LocatorMatcherTask LANGUAGECLIENT_EXPORT workspaceFunctionMatcher(Client *client, Core::LocatorMatcherTask LANGUAGECLIENT_EXPORT workspaceFunctionMatcher(Client *client,

View File

@@ -647,7 +647,7 @@ void LineEditField::setupCompletion(FancyLineEdit *lineEdit)
lineEdit->setSpecialCompleter(new QCompleter(completionList, lineEdit)); lineEdit->setSpecialCompleter(new QCompleter(completionList, lineEdit));
}; };
LocatorMatcher *matcher = new LocatorMatcher; LocatorMatcher *matcher = new LocatorMatcher;
matcher->setTasks(LocatorMatcher::classMatchers()); matcher->setTasks(LocatorMatcher::matchers(MatcherType::Classes));
QObject::connect(matcher, &LocatorMatcher::serialOutputDataReady, lineEdit, handleResults); QObject::connect(matcher, &LocatorMatcher::serialOutputDataReady, lineEdit, handleResults);
QObject::connect(matcher, &LocatorMatcher::done, matcher, &QObject::deleteLater); QObject::connect(matcher, &LocatorMatcher::done, matcher, &QObject::deleteLater);
matcher->start(); matcher->start();