diff options
author | Nikolai Kosjar <nikolai.kosjar@digia.com> | 2013-09-12 14:06:36 +0200 |
---|---|---|
committer | Nikolai Kosjar <nikolai.kosjar@digia.com> | 2013-09-13 15:40:48 +0200 |
commit | 91dbac03033a077e77cbc58bc1321ecf6f571bfb (patch) | |
tree | c71bc63a34c03a87682674c14bb147a05cfe659a | |
parent | feef5cac4ce92df71ec320ae7484d63b3b5e4a30 (diff) |
CppTools: Fix qualified ids in the ':' locator filter
* Always display qualified ids in the ':' filter
* Show correct qualified ids (for some symbols the namespace was shown
twice)
Task-number: QTCREATORBUG-10136
Change-Id: Id178cb4b8abcc316250fa16e5f3e5a8e72bc0c10
Reviewed-by: Erik Verbruggen <erik.verbruggen@digia.com>
-rw-r--r-- | src/plugins/cpptools/cppcurrentdocumentfilter.cpp | 8 | ||||
-rw-r--r-- | src/plugins/cpptools/cppfunctionsfilter.cpp | 13 | ||||
-rw-r--r-- | src/plugins/cpptools/cpplocatorfilter.cpp | 2 | ||||
-rw-r--r-- | src/plugins/cpptools/cpplocatorfilter_test.cpp | 67 | ||||
-rw-r--r-- | src/plugins/cpptools/searchsymbols.cpp | 14 | ||||
-rw-r--r-- | src/plugins/cpptools/searchsymbols.h | 14 | ||||
-rw-r--r-- | tests/cpplocators/testdata_basic/file1.cpp | 15 |
7 files changed, 90 insertions, 43 deletions
diff --git a/src/plugins/cpptools/cppcurrentdocumentfilter.cpp b/src/plugins/cpptools/cppcurrentdocumentfilter.cpp index 03c29dec855..69a4190d518 100644 --- a/src/plugins/cpptools/cppcurrentdocumentfilter.cpp +++ b/src/plugins/cpptools/cppcurrentdocumentfilter.cpp @@ -94,8 +94,12 @@ QList<Locator::FilterEntry> CppCurrentDocumentFilter::matchesFor(QFutureInterfac || (!hasWildcard && matcher.indexIn(matchString) != -1)) { QVariant id = qVariantFromValue(info); - Locator::FilterEntry filterEntry(this, matchString, id, info.icon); - filterEntry.extraInfo = info.symbolScope; + QString name = matchString; + QString extraInfo = info.symbolScope; + if (info.type == ModelItemInfo::Method) + info.unqualifiedNameAndScope(matchString, &name, &extraInfo); + Locator::FilterEntry filterEntry(this, name, id, info.icon); + filterEntry.extraInfo = extraInfo; if (matchString.startsWith(entry, caseSensitivityForPrefix)) betterEntries.append(filterEntry); diff --git a/src/plugins/cpptools/cppfunctionsfilter.cpp b/src/plugins/cpptools/cppfunctionsfilter.cpp index 89052c265f3..d9230165a59 100644 --- a/src/plugins/cpptools/cppfunctionsfilter.cpp +++ b/src/plugins/cpptools/cppfunctionsfilter.cpp @@ -52,10 +52,15 @@ QList<QList<CppTools::ModelItemInfo> > CppFunctionsFilter::itemsToMatchUserInput Locator::FilterEntry CppFunctionsFilter::filterEntryFromModelItemInfo(const CppTools::ModelItemInfo &info) { const QVariant id = qVariantFromValue(info); - Locator::FilterEntry filterEntry(this, info.symbolName + info.symbolType, id, info.icon); - filterEntry.extraInfo = info.symbolScope.isEmpty() - ? info.shortNativeFilePath() - : info.symbolScope; + + QString name = info.symbolName; + QString extraInfo = info.symbolScope; + info.unqualifiedNameAndScope(name, &name, &extraInfo); + if (extraInfo.isEmpty()) + extraInfo = info.shortNativeFilePath(); + + Locator::FilterEntry filterEntry(this, name + info.symbolType, id, info.icon); + filterEntry.extraInfo = extraInfo; return filterEntry; } diff --git a/src/plugins/cpptools/cpplocatorfilter.cpp b/src/plugins/cpptools/cpplocatorfilter.cpp index b7df58fd91c..d8caaf82608 100644 --- a/src/plugins/cpptools/cpplocatorfilter.cpp +++ b/src/plugins/cpptools/cpplocatorfilter.cpp @@ -50,7 +50,7 @@ CppLocatorFilter::~CppLocatorFilter() Locator::FilterEntry CppLocatorFilter::filterEntryFromModelItemInfo(const CppTools::ModelItemInfo &info) { const QVariant id = qVariantFromValue(info); - Locator::FilterEntry filterEntry(this, info.symbolName, id, info.icon); + Locator::FilterEntry filterEntry(this, info.scopedSymbolName(), id, info.icon); filterEntry.extraInfo = info.type == ModelItemInfo::Class || info.type == ModelItemInfo::Enum ? info.shortNativeFilePath() : info.symbolType; diff --git a/src/plugins/cpptools/cpplocatorfilter_test.cpp b/src/plugins/cpptools/cpplocatorfilter_test.cpp index 7be5c794f8d..6ee0e7bc8c5 100644 --- a/src/plugins/cpptools/cpplocatorfilter_test.cpp +++ b/src/plugins/cpptools/cpplocatorfilter_test.cpp @@ -173,8 +173,15 @@ void CppToolsPlugin::test_cpplocatorfilters_CppLocatorFilter_data() QTest::newRow("CppFunctionsFilter") << testFile << cppFunctionsFilter - << QString::fromLatin1("myfunction") + << QString::fromLatin1("function") << (QList<ResultData>() + << ResultData(_("function2(bool, int)"), _("MyClass")) + << ResultData(_("function2(bool, int)"), _("MyNamespace::MyClass")) + << ResultData(_("function2(bool, int)"), _("<anonymous namespace>::MyClass")) + << ResultData(_("functionDefinedOutSideClass(char)"), _("MyClass")) + << ResultData(_("functionDefinedOutSideClass(char)"), _("MyNamespace::MyClass")) + << ResultData(_("functionDefinedOutSideClass(char)"), _("<anonymous namespace>::MyClass")) + << ResultData(_("functionDefinedOutSideClassAndNamespace(float)"), _("MyNamespace::MyClass")) << ResultData(_("myFunction(bool, int)"), testFileShort) << ResultData(_("myFunction(bool, int)"), _("MyNamespace")) << ResultData(_("myFunction(bool, int)"), _("<anonymous namespace>")) @@ -187,6 +194,8 @@ void CppToolsPlugin::test_cpplocatorfilters_CppLocatorFilter_data() << (QList<ResultData>() << ResultData(_("MyClass()"), _("MyNamespace::MyClass")) << ResultData(_("function2(bool, int)"), _("MyNamespace::MyClass")) + << ResultData(_("functionDefinedOutSideClass(char)"), _("MyNamespace::MyClass")) + << ResultData(_("functionDefinedOutSideClassAndNamespace(float)"), _("MyNamespace::MyClass")) << ResultData(_("myFunction(bool, int)"), _("MyNamespace")) ); @@ -208,22 +217,27 @@ void CppToolsPlugin::test_cpplocatorfilters_CppLocatorFilter_data() << ResultData(_("MyClass"), _("MyNamespace")) ); - QTest::newRow("CppLocatorFilter") + // all symbols in the left column are expected to be fully qualified. + QTest::newRow("CppLocatorFilter-filtered") << testFile << cppLocatorFilter << _("my") << (QList<ResultData>() + << ResultData(_("<anonymous namespace>::MyClass"), testFileShort) + << ResultData(_("<anonymous namespace>::MyClass::MyClass"), _("()")) + << ResultData(_("<anonymous namespace>::MyClass::functionDefinedOutSideClass"), _("(char)")) + << ResultData(_("<anonymous namespace>::MyEnum"), testFileShort) + << ResultData(_("<anonymous namespace>::myFunction"), _("(bool, int)")) << ResultData(_("MyClass"), testFileShort) - << ResultData(_("MyClass"), testFileShort) - << ResultData(_("MyClass"), testFileShort) - << ResultData(_("MyClass"), _("()")) - << ResultData(_("MyClass"), _("()")) - << ResultData(_("MyClass"), _("()")) - << ResultData(_("MyEnum"), testFileShort) + << ResultData(_("MyClass::MyClass"), _("()")) + << ResultData(_("MyClass::functionDefinedOutSideClass"), _("(char)")) << ResultData(_("MyEnum"), testFileShort) - << ResultData(_("MyEnum"), testFileShort) - << ResultData(_("myFunction"), _("(bool, int)")) - << ResultData(_("myFunction"), _("(bool, int)")) + << ResultData(_("MyNamespace::MyClass"), testFileShort) + << ResultData(_("MyNamespace::MyClass::MyClass"), _("()")) + << ResultData(_("MyNamespace::MyClass::functionDefinedOutSideClass"), _("(char)")) + << ResultData(_("MyNamespace::MyClass::functionDefinedOutSideClassAndNamespace"), _("(float)")) + << ResultData(_("MyNamespace::MyEnum"), testFileShort) + << ResultData(_("MyNamespace::myFunction"), _("(bool, int)")) << ResultData(_("myFunction"), _("(bool, int)")) ); } @@ -240,27 +254,36 @@ void CppToolsPlugin::test_cpplocatorfilters_CppCurrentDocumentFilter() << ResultData(_("int V1"), _("MyEnum")) << ResultData(_("int V2"), _("MyEnum")) << ResultData(_("MyClass"), _("")) - << ResultData(_("MyClass()"), _("MyClass")) - << ResultData(_("function1()"), _("MyClass")) - << ResultData(_("function2(bool, int)"), _("MyClass")) + << ResultData(_("MyClass"), _("MyClass")) + << ResultData(_("function1"), _("MyClass")) + << ResultData(_("function2"), _("MyClass")) + << ResultData(_("functionDefinedOutSideClass"), _("MyClass")) + << ResultData(_("functionDefinedOutSideClass"), _("MyClass")) << ResultData(_("int myVariable"), _("MyNamespace")) - << ResultData(_("myFunction(bool, int)"), _("MyNamespace")) + << ResultData(_("myFunction"), _("MyNamespace")) << ResultData(_("MyEnum"), _("MyNamespace")) << ResultData(_("int V1"), _("MyNamespace::MyEnum")) << ResultData(_("int V2"), _("MyNamespace::MyEnum")) << ResultData(_("MyClass"), _("MyNamespace")) - << ResultData(_("MyClass()"), _("MyNamespace::MyClass")) - << ResultData(_("function1()"), _("MyNamespace::MyClass")) - << ResultData(_("function2(bool, int)"), _("MyNamespace::MyClass")) + << ResultData(_("MyClass"), _("MyNamespace::MyClass")) + << ResultData(_("function1"), _("MyNamespace::MyClass")) + << ResultData(_("function2"), _("MyNamespace::MyClass")) + << ResultData(_("functionDefinedOutSideClass"), _("MyNamespace::MyClass")) + << ResultData(_("functionDefinedOutSideClassAndNamespace"), _("MyNamespace::MyClass")) + << ResultData(_("functionDefinedOutSideClass"), _("MyNamespace::MyClass")) + << ResultData(_("functionDefinedOutSideClassAndNamespace"), _("MyNamespace::MyClass")) << ResultData(_("int myVariable"), _("<anonymous namespace>")) - << ResultData(_("myFunction(bool, int)"), _("<anonymous namespace>")) + << ResultData(_("myFunction"), _("<anonymous namespace>")) << ResultData(_("MyEnum"), _("<anonymous namespace>")) << ResultData(_("int V1"), _("<anonymous namespace>::MyEnum")) << ResultData(_("int V2"), _("<anonymous namespace>::MyEnum")) << ResultData(_("MyClass"), _("<anonymous namespace>")) - << ResultData(_("MyClass()"), _("<anonymous namespace>::MyClass")) - << ResultData(_("function1()"), _("<anonymous namespace>::MyClass")) - << ResultData(_("function2(bool, int)"), _("<anonymous namespace>::MyClass")) + << ResultData(_("MyClass"), _("<anonymous namespace>::MyClass")) + << ResultData(_("function1"), _("<anonymous namespace>::MyClass")) + << ResultData(_("function2"), _("<anonymous namespace>::MyClass")) + << ResultData(_("functionDefinedOutSideClass"), _("<anonymous namespace>::MyClass")) + << ResultData(_("functionDefinedOutSideClass"), _("<anonymous namespace>::MyClass")) + << ResultData(_("main()"), _("")) ; CppCurrentDocumentFilterTest test(testFile); diff --git a/src/plugins/cpptools/searchsymbols.cpp b/src/plugins/cpptools/searchsymbols.cpp index e259ce54acd..6f548710a46 100644 --- a/src/plugins/cpptools/searchsymbols.cpp +++ b/src/plugins/cpptools/searchsymbols.cpp @@ -95,21 +95,9 @@ bool SearchSymbols::visit(Function *symbol) { if (!(symbolsToSearchFor & SymbolSearcher::Functions)) return false; - - QString extraScope; - if (const Name *name = symbol->name()) { - if (const QualifiedNameId *q = name->asQualifiedNameId()) { - if (q->base()) - extraScope = overview.prettyName(q->base()); - } - } - QString fullScope = _scope; - if (!_scope.isEmpty() && !extraScope.isEmpty()) - fullScope += QLatin1String("::"); - fullScope += extraScope; QString name = symbolName(symbol); QString type = overview.prettyType(symbol->type()); - appendItem(name, type, fullScope, ModelItemInfo::Method, symbol); + appendItem(name, type, _scope, ModelItemInfo::Method, symbol); return false; } diff --git a/src/plugins/cpptools/searchsymbols.h b/src/plugins/cpptools/searchsymbols.h index 9467431a1b0..c4e5a25cf87 100644 --- a/src/plugins/cpptools/searchsymbols.h +++ b/src/plugins/cpptools/searchsymbols.h @@ -94,6 +94,18 @@ struct CPPTOOLS_EXPORT ModelItemInfo : symbolScope + QLatin1String("::") + symbolName; } + void unqualifiedNameAndScope(const QString &defaultName, QString *name, QString *scope) const + { + *name = defaultName; + *scope = symbolScope; + const QString qualifiedName = scopedSymbolName(); + const int colonColonPosition = qualifiedName.lastIndexOf(QLatin1String("::")); + if (colonColonPosition != -1) { + *name = qualifiedName.mid(colonColonPosition + 2); + *scope = qualifiedName.left(colonColonPosition); + } + } + QString typeNameRepresentation() const { if (type == ModelItemInfo::Declaration) { @@ -112,7 +124,7 @@ struct CPPTOOLS_EXPORT ModelItemInfo QString shortNativeFilePath() const { return Utils::FileUtils::shortNativePath(Utils::FileName::fromString(fileName)); } - QString symbolName; + QString symbolName; // as found in the code, therefore might be qualified QString symbolType; QString symbolScope; QString fileName; diff --git a/tests/cpplocators/testdata_basic/file1.cpp b/tests/cpplocators/testdata_basic/file1.cpp index 6db50704e4c..e652b13f071 100644 --- a/tests/cpplocators/testdata_basic/file1.cpp +++ b/tests/cpplocators/testdata_basic/file1.cpp @@ -20,8 +20,11 @@ public: MyClass() {} int function1(); int function2(bool yesno, int number) {} + int functionDefinedOutSideClass(char c); }; +int MyClass::functionDefinedOutSideClass(char c) {} + // // Symbols in a named namespace // @@ -40,10 +43,16 @@ public: MyClass() {} int function1(); int function2(bool yesno, int number) {} + int functionDefinedOutSideClass(char c); + int functionDefinedOutSideClassAndNamespace(float x); }; +int MyClass::functionDefinedOutSideClass(char c) {} + } // namespace MyNamespace +int MyNamespace::MyClass::functionDefinedOutSideClassAndNamespace(float x) {} + // // Symbols in an anonymous namespace // @@ -62,6 +71,12 @@ public: MyClass() {} int function1(); int function2(bool yesno, int number) {} + int functionDefinedOutSideClass(char c); }; +int MyClass::functionDefinedOutSideClass(char c) {} + } // anonymous namespace + + +int main() {} |