From bacfc28a36eb858b65e9786061f68f145d4fd5f6 Mon Sep 17 00:00:00 2001 From: Orgad Shaneh <orgad.shaneh@audiocodes.com> Date: Mon, 30 Oct 2017 21:42:18 +0200 Subject: [PATCH] CppTools: Match also function arguments in locator Useful when there are several overloads for the same function. Change-Id: I325bda7d2fdf4108f71a61d5473cd55310c51c28 Reviewed-by: Nikolai Kosjar <nikolai.kosjar@qt.io> --- src/plugins/cpptools/cpplocatorfilter.cpp | 5 ++++- .../cpptools/cpplocatorfilter_test.cpp | 21 +++++++++++++++++-- tests/cpplocators/testdata_basic/file1.cpp | 3 ++- 3 files changed, 25 insertions(+), 4 deletions(-) diff --git a/src/plugins/cpptools/cpplocatorfilter.cpp b/src/plugins/cpptools/cpplocatorfilter.cpp index 977c6188554..ba31251bf37 100644 --- a/src/plugins/cpptools/cpplocatorfilter.cpp +++ b/src/plugins/cpptools/cpplocatorfilter.cpp @@ -83,8 +83,11 @@ QList<Core::LocatorFilterEntry> CppLocatorFilter::matchesFor( m_data->filterAllFiles([&](const IndexItem::Ptr &info) -> IndexItem::VisitorResult { if (future.isCanceled()) return IndexItem::Break; - if (info->type() & wanted) { + const IndexItem::ItemType type = info->type(); + if (type & wanted) { QString matchString = hasColonColon ? info->scopedSymbolName() : info->symbolName(); + if (type == IndexItem::Function) + matchString += info->symbolType(); QRegularExpressionMatch match = regexp.match(matchString); if (match.hasMatch()) { Core::LocatorFilterEntry filterEntry = filterEntryFromIndexItem(info); diff --git a/src/plugins/cpptools/cpplocatorfilter_test.cpp b/src/plugins/cpptools/cpplocatorfilter_test.cpp index 501a396eb13..1b309fbe8ae 100644 --- a/src/plugins/cpptools/cpplocatorfilter_test.cpp +++ b/src/plugins/cpptools/cpplocatorfilter_test.cpp @@ -196,10 +196,26 @@ void CppToolsPlugin::test_cpplocatorfilters_CppLocatorFilter_data() << _("pos") << (QList<ResultData>() << ResultData(_("positiveNumber()"), testFileShort) - << ResultData(_("getPosition()"), testFileShort) + << ResultData(_("matchArgument(Pos)"), testFileShort) << ResultData(_("pointOfService()"), testFileShort) ); + QTest::newRow("CppFunctionsFilter-arguments") + << testFile + << cppFunctionsFilter + << _("function*bool") + << (QList<ResultData>() + << ResultData(_("functionDefinedInClass(bool, int)"), + _("MyClass (file1.cpp)")) + << ResultData(_("functionDefinedInClass(bool, int)"), + _("MyNamespace::MyClass (file1.cpp)")) + << ResultData(_("functionDefinedInClass(bool, int)"), + _("<anonymous namespace>::MyClass (file1.cpp)")) + << ResultData(_("myFunction(bool, int)"), testFileShort) + << ResultData(_("myFunction(bool, int)"), _("MyNamespace (file1.cpp)")) + << ResultData(_("myFunction(bool, int)"), _("<anonymous namespace> (file1.cpp)")) + ); + QTest::newRow("CppFunctionsFilter-WithNamespacePrefix") << testFile << cppFunctionsFilter @@ -290,8 +306,9 @@ void CppToolsPlugin::test_cpplocatorfilters_CppCurrentDocumentFilter() QList<ResultData> expectedResults = QList<ResultData>() << ResultData(_("int myVariable"), _("")) << ResultData(_("myFunction(bool, int)"), _("")) + << ResultData(_("Pos"), _("")) << ResultData(_("pointOfService()"), _("")) - << ResultData(_("getPosition()"), _("")) + << ResultData(_("matchArgument(Pos)"), _("")) << ResultData(_("positiveNumber()"), _("")) << ResultData(_("MyEnum"), _("")) << ResultData(_("int V1"), _("MyEnum")) diff --git a/tests/cpplocators/testdata_basic/file1.cpp b/tests/cpplocators/testdata_basic/file1.cpp index 5c1e3caff32..ae8cdf9916c 100644 --- a/tests/cpplocators/testdata_basic/file1.cpp +++ b/tests/cpplocators/testdata_basic/file1.cpp @@ -12,8 +12,9 @@ int myVariable; int myFunction(bool yesno, int number) {} +struct Pos {}; void pointOfService() {} -int getPosition() { return 0; } +int matchArgument(Pos p) { return 0; } int positiveNumber() { return 2; } enum MyEnum { V1, V2 }; -- GitLab