diff --git a/src/plugins/cpptools/cpplocatorfilter.cpp b/src/plugins/cpptools/cpplocatorfilter.cpp index 109e999b23b..ee2a2db395e 100644 --- a/src/plugins/cpptools/cpplocatorfilter.cpp +++ b/src/plugins/cpptools/cpplocatorfilter.cpp @@ -70,6 +70,7 @@ void CppLocatorFilter::refresh(QFutureInterface &future) QList CppLocatorFilter::matchesFor( QFutureInterface &future, const QString &entry) { + QList normalEntries; QList goodEntries; QList betterEntries; QList bestEntries; @@ -91,9 +92,14 @@ QList CppLocatorFilter::matchesFor( const QString symbolName = info->symbolName(); QString matchString = hasColonColon ? info->scopedSymbolName() : symbolName; int matchOffset = hasColonColon ? matchString.size() - symbolName.size() : 0; - if (type == IndexItem::Function) - matchString += info->symbolType(); QRegularExpressionMatch match = regexp.match(matchString); + bool matchInParameterList = false; + if (!match.hasMatch() && (type == IndexItem::Function)) { + matchString += info->symbolType(); + match = regexp.match(matchString); + matchInParameterList = true; + } + if (match.hasMatch()) { Core::LocatorFilterEntry filterEntry = filterEntryFromIndexItem(info); @@ -109,9 +115,11 @@ QList CppLocatorFilter::matchesFor( start -= matchOffset; } - if (matchString.startsWith(entry, caseSensitivityForPrefix)) + if (matchInParameterList) + normalEntries.append(filterEntry); + else if (filterEntry.displayName.startsWith(entry, caseSensitivityForPrefix)) bestEntries.append(filterEntry); - else if (matchString.contains(entry, caseSensitivityForPrefix)) + else if (filterEntry.displayName.contains(entry, caseSensitivityForPrefix)) betterEntries.append(filterEntry); else goodEntries.append(filterEntry); @@ -124,6 +132,8 @@ QList CppLocatorFilter::matchesFor( return IndexItem::Recurse; }); + if (normalEntries.size() < 1000) + Utils::sort(normalEntries, Core::LocatorFilterEntry::compareLexigraphically); if (goodEntries.size() < 1000) Utils::sort(goodEntries, Core::LocatorFilterEntry::compareLexigraphically); if (betterEntries.size() < 1000) @@ -133,6 +143,7 @@ QList CppLocatorFilter::matchesFor( bestEntries += betterEntries; bestEntries += goodEntries; + bestEntries += normalEntries; return bestEntries; } diff --git a/src/plugins/cpptools/cpplocatorfilter_test.cpp b/src/plugins/cpptools/cpplocatorfilter_test.cpp index a9fc6e3405b..e7a1775fd70 100644 --- a/src/plugins/cpptools/cpplocatorfilter_test.cpp +++ b/src/plugins/cpptools/cpplocatorfilter_test.cpp @@ -198,8 +198,9 @@ void CppToolsPlugin::test_cpplocatorfilters_CppLocatorFilter_data() << _("pos") << (QList() << ResultData(_("positiveNumber()"), testFileShort) - << ResultData(_("matchArgument(Pos)"), testFileShort) + << ResultData(_("somePositionWithin()"), testFileShort) << ResultData(_("pointOfService()"), testFileShort) + << ResultData(_("matchArgument(Pos)"), testFileShort) ); QTest::newRow("CppFunctionsFilter-arguments") @@ -238,12 +239,14 @@ void CppToolsPlugin::test_cpplocatorfilters_CppLocatorFilter_data() << cppFunctionsFilter << _("MyClass::func") << (QList() - << ResultData(_("functionDefinedInClass(bool, int)"), _("MyClass (file1.cpp)")) - << ResultData(_("functionDefinedOutSideClass(char)"), _("MyClass (file1.cpp)")) + << ResultData(_("functionDefinedInClass(bool, int)"), + _("MyClass (file1.cpp)")) << ResultData(_("functionDefinedInClass(bool, int)"), _("MyNamespace::MyClass (file1.cpp)")) << ResultData(_("functionDefinedInClass(bool, int)"), _("::MyClass (file1.cpp)")) + << ResultData(_("functionDefinedOutSideClass(char)"), + _("MyClass (file1.cpp)")) << ResultData(_("functionDefinedOutSideClass(char)"), _("MyNamespace::MyClass (file1.cpp)")) << ResultData(_("functionDefinedOutSideClass(char)"), @@ -276,12 +279,6 @@ void CppToolsPlugin::test_cpplocatorfilters_CppLocatorFilter_data() << cppLocatorFilter << _("my") << (QList() - << ResultData(_("::MyClass"), testFileShort) - << ResultData(_("::MyClass::MyClass"), _("()")) - << ResultData(_("::MyClass::functionDefinedOutSideClass"), - _("(char)")) - << ResultData(_("::MyEnum"), testFileShort) - << ResultData(_("::myFunction"), _("(bool, int)")) << ResultData(_("MyClass"), testFileShort) << ResultData(_("MyClass::MyClass"), _("()")) << ResultData(_("MyClass::functionDefinedOutSideClass"), _("(char)")) @@ -295,6 +292,12 @@ void CppToolsPlugin::test_cpplocatorfilters_CppLocatorFilter_data() << ResultData(_("MyNamespace::MyEnum"), testFileShort) << ResultData(_("MyNamespace::myFunction"), _("(bool, int)")) << ResultData(_("myFunction"), _("(bool, int)")) + << ResultData(_("::MyClass"), testFileShort) + << ResultData(_("::MyClass::MyClass"), _("()")) + << ResultData(_("::MyClass::functionDefinedOutSideClass"), + _("(char)")) + << ResultData(_("::MyEnum"), testFileShort) + << ResultData(_("::myFunction"), _("(bool, int)")) ); QTest::newRow("CppClassesFilter-ObjC") @@ -328,6 +331,7 @@ void CppToolsPlugin::test_cpplocatorfilters_CppCurrentDocumentFilter() << ResultData(_("int myVariable"), _("")) << ResultData(_("myFunction(bool, int)"), _("")) << ResultData(_("Pos"), _("")) + << ResultData(_("somePositionWithin()"), _("")) << ResultData(_("pointOfService()"), _("")) << ResultData(_("matchArgument(Pos)"), _("")) << ResultData(_("positiveNumber()"), _("")) diff --git a/tests/cpplocators/testdata_basic/file1.cpp b/tests/cpplocators/testdata_basic/file1.cpp index ae8cdf9916c..d7a53ea5d47 100644 --- a/tests/cpplocators/testdata_basic/file1.cpp +++ b/tests/cpplocators/testdata_basic/file1.cpp @@ -13,6 +13,7 @@ int myVariable; int myFunction(bool yesno, int number) {} struct Pos {}; +int somePositionWithin() { return 3; } void pointOfService() {} int matchArgument(Pos p) { return 0; } int positiveNumber() { return 2; }