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>
This commit is contained in:
Nikolai Kosjar
2013-09-12 14:06:36 +02:00
parent feef5cac4c
commit 91dbac0303
7 changed files with 90 additions and 43 deletions

View File

@@ -94,8 +94,12 @@ QList<Locator::FilterEntry> CppCurrentDocumentFilter::matchesFor(QFutureInterfac
|| (!hasWildcard && matcher.indexIn(matchString) != -1)) || (!hasWildcard && matcher.indexIn(matchString) != -1))
{ {
QVariant id = qVariantFromValue(info); QVariant id = qVariantFromValue(info);
Locator::FilterEntry filterEntry(this, matchString, id, info.icon); QString name = matchString;
filterEntry.extraInfo = info.symbolScope; 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)) if (matchString.startsWith(entry, caseSensitivityForPrefix))
betterEntries.append(filterEntry); betterEntries.append(filterEntry);

View File

@@ -52,10 +52,15 @@ QList<QList<CppTools::ModelItemInfo> > CppFunctionsFilter::itemsToMatchUserInput
Locator::FilterEntry CppFunctionsFilter::filterEntryFromModelItemInfo(const CppTools::ModelItemInfo &info) Locator::FilterEntry CppFunctionsFilter::filterEntryFromModelItemInfo(const CppTools::ModelItemInfo &info)
{ {
const QVariant id = qVariantFromValue(info); const QVariant id = qVariantFromValue(info);
Locator::FilterEntry filterEntry(this, info.symbolName + info.symbolType, id, info.icon);
filterEntry.extraInfo = info.symbolScope.isEmpty() QString name = info.symbolName;
? info.shortNativeFilePath() QString extraInfo = info.symbolScope;
: 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; return filterEntry;
} }

View File

@@ -50,7 +50,7 @@ CppLocatorFilter::~CppLocatorFilter()
Locator::FilterEntry CppLocatorFilter::filterEntryFromModelItemInfo(const CppTools::ModelItemInfo &info) Locator::FilterEntry CppLocatorFilter::filterEntryFromModelItemInfo(const CppTools::ModelItemInfo &info)
{ {
const QVariant id = qVariantFromValue(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 filterEntry.extraInfo = info.type == ModelItemInfo::Class || info.type == ModelItemInfo::Enum
? info.shortNativeFilePath() ? info.shortNativeFilePath()
: info.symbolType; : info.symbolType;

View File

@@ -173,8 +173,15 @@ void CppToolsPlugin::test_cpplocatorfilters_CppLocatorFilter_data()
QTest::newRow("CppFunctionsFilter") QTest::newRow("CppFunctionsFilter")
<< testFile << testFile
<< cppFunctionsFilter << cppFunctionsFilter
<< QString::fromLatin1("myfunction") << QString::fromLatin1("function")
<< (QList<ResultData>() << (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)"), testFileShort)
<< ResultData(_("myFunction(bool, int)"), _("MyNamespace")) << ResultData(_("myFunction(bool, int)"), _("MyNamespace"))
<< ResultData(_("myFunction(bool, int)"), _("<anonymous namespace>")) << ResultData(_("myFunction(bool, int)"), _("<anonymous namespace>"))
@@ -187,6 +194,8 @@ void CppToolsPlugin::test_cpplocatorfilters_CppLocatorFilter_data()
<< (QList<ResultData>() << (QList<ResultData>()
<< ResultData(_("MyClass()"), _("MyNamespace::MyClass")) << ResultData(_("MyClass()"), _("MyNamespace::MyClass"))
<< ResultData(_("function2(bool, int)"), _("MyNamespace::MyClass")) << ResultData(_("function2(bool, int)"), _("MyNamespace::MyClass"))
<< ResultData(_("functionDefinedOutSideClass(char)"), _("MyNamespace::MyClass"))
<< ResultData(_("functionDefinedOutSideClassAndNamespace(float)"), _("MyNamespace::MyClass"))
<< ResultData(_("myFunction(bool, int)"), _("MyNamespace")) << ResultData(_("myFunction(bool, int)"), _("MyNamespace"))
); );
@@ -208,22 +217,27 @@ void CppToolsPlugin::test_cpplocatorfilters_CppLocatorFilter_data()
<< ResultData(_("MyClass"), _("MyNamespace")) << ResultData(_("MyClass"), _("MyNamespace"))
); );
QTest::newRow("CppLocatorFilter") // all symbols in the left column are expected to be fully qualified.
QTest::newRow("CppLocatorFilter-filtered")
<< testFile << testFile
<< cppLocatorFilter << cppLocatorFilter
<< _("my") << _("my")
<< (QList<ResultData>() << (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::MyClass"), _("()"))
<< ResultData(_("MyClass"), testFileShort) << ResultData(_("MyClass::functionDefinedOutSideClass"), _("(char)"))
<< ResultData(_("MyClass"), _("()"))
<< ResultData(_("MyClass"), _("()"))
<< ResultData(_("MyClass"), _("()"))
<< ResultData(_("MyEnum"), testFileShort) << ResultData(_("MyEnum"), testFileShort)
<< ResultData(_("MyEnum"), testFileShort) << ResultData(_("MyNamespace::MyClass"), testFileShort)
<< ResultData(_("MyEnum"), testFileShort) << ResultData(_("MyNamespace::MyClass::MyClass"), _("()"))
<< ResultData(_("myFunction"), _("(bool, int)")) << ResultData(_("MyNamespace::MyClass::functionDefinedOutSideClass"), _("(char)"))
<< ResultData(_("myFunction"), _("(bool, int)")) << ResultData(_("MyNamespace::MyClass::functionDefinedOutSideClassAndNamespace"), _("(float)"))
<< ResultData(_("MyNamespace::MyEnum"), testFileShort)
<< ResultData(_("MyNamespace::myFunction"), _("(bool, int)"))
<< ResultData(_("myFunction"), _("(bool, int)")) << ResultData(_("myFunction"), _("(bool, int)"))
); );
} }
@@ -240,27 +254,36 @@ void CppToolsPlugin::test_cpplocatorfilters_CppCurrentDocumentFilter()
<< ResultData(_("int V1"), _("MyEnum")) << ResultData(_("int V1"), _("MyEnum"))
<< ResultData(_("int V2"), _("MyEnum")) << ResultData(_("int V2"), _("MyEnum"))
<< ResultData(_("MyClass"), _("")) << ResultData(_("MyClass"), _(""))
<< ResultData(_("MyClass()"), _("MyClass")) << ResultData(_("MyClass"), _("MyClass"))
<< ResultData(_("function1()"), _("MyClass")) << ResultData(_("function1"), _("MyClass"))
<< ResultData(_("function2(bool, int)"), _("MyClass")) << ResultData(_("function2"), _("MyClass"))
<< ResultData(_("functionDefinedOutSideClass"), _("MyClass"))
<< ResultData(_("functionDefinedOutSideClass"), _("MyClass"))
<< ResultData(_("int myVariable"), _("MyNamespace")) << ResultData(_("int myVariable"), _("MyNamespace"))
<< ResultData(_("myFunction(bool, int)"), _("MyNamespace")) << ResultData(_("myFunction"), _("MyNamespace"))
<< ResultData(_("MyEnum"), _("MyNamespace")) << ResultData(_("MyEnum"), _("MyNamespace"))
<< ResultData(_("int V1"), _("MyNamespace::MyEnum")) << ResultData(_("int V1"), _("MyNamespace::MyEnum"))
<< ResultData(_("int V2"), _("MyNamespace::MyEnum")) << ResultData(_("int V2"), _("MyNamespace::MyEnum"))
<< ResultData(_("MyClass"), _("MyNamespace")) << ResultData(_("MyClass"), _("MyNamespace"))
<< ResultData(_("MyClass()"), _("MyNamespace::MyClass")) << ResultData(_("MyClass"), _("MyNamespace::MyClass"))
<< ResultData(_("function1()"), _("MyNamespace::MyClass")) << ResultData(_("function1"), _("MyNamespace::MyClass"))
<< ResultData(_("function2(bool, int)"), _("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(_("int myVariable"), _("<anonymous namespace>"))
<< ResultData(_("myFunction(bool, int)"), _("<anonymous namespace>")) << ResultData(_("myFunction"), _("<anonymous namespace>"))
<< ResultData(_("MyEnum"), _("<anonymous namespace>")) << ResultData(_("MyEnum"), _("<anonymous namespace>"))
<< ResultData(_("int V1"), _("<anonymous namespace>::MyEnum")) << ResultData(_("int V1"), _("<anonymous namespace>::MyEnum"))
<< ResultData(_("int V2"), _("<anonymous namespace>::MyEnum")) << ResultData(_("int V2"), _("<anonymous namespace>::MyEnum"))
<< ResultData(_("MyClass"), _("<anonymous namespace>")) << ResultData(_("MyClass"), _("<anonymous namespace>"))
<< ResultData(_("MyClass()"), _("<anonymous namespace>::MyClass")) << ResultData(_("MyClass"), _("<anonymous namespace>::MyClass"))
<< ResultData(_("function1()"), _("<anonymous namespace>::MyClass")) << ResultData(_("function1"), _("<anonymous namespace>::MyClass"))
<< ResultData(_("function2(bool, int)"), _("<anonymous namespace>::MyClass")) << ResultData(_("function2"), _("<anonymous namespace>::MyClass"))
<< ResultData(_("functionDefinedOutSideClass"), _("<anonymous namespace>::MyClass"))
<< ResultData(_("functionDefinedOutSideClass"), _("<anonymous namespace>::MyClass"))
<< ResultData(_("main()"), _(""))
; ;
CppCurrentDocumentFilterTest test(testFile); CppCurrentDocumentFilterTest test(testFile);

View File

@@ -95,21 +95,9 @@ bool SearchSymbols::visit(Function *symbol)
{ {
if (!(symbolsToSearchFor & SymbolSearcher::Functions)) if (!(symbolsToSearchFor & SymbolSearcher::Functions))
return false; 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 name = symbolName(symbol);
QString type = overview.prettyType(symbol->type()); QString type = overview.prettyType(symbol->type());
appendItem(name, type, fullScope, ModelItemInfo::Method, symbol); appendItem(name, type, _scope, ModelItemInfo::Method, symbol);
return false; return false;
} }

View File

@@ -94,6 +94,18 @@ struct CPPTOOLS_EXPORT ModelItemInfo
: symbolScope + QLatin1String("::") + symbolName; : 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 QString typeNameRepresentation() const
{ {
if (type == ModelItemInfo::Declaration) { if (type == ModelItemInfo::Declaration) {
@@ -112,7 +124,7 @@ struct CPPTOOLS_EXPORT ModelItemInfo
QString shortNativeFilePath() const QString shortNativeFilePath() const
{ return Utils::FileUtils::shortNativePath(Utils::FileName::fromString(fileName)); } { return Utils::FileUtils::shortNativePath(Utils::FileName::fromString(fileName)); }
QString symbolName; QString symbolName; // as found in the code, therefore might be qualified
QString symbolType; QString symbolType;
QString symbolScope; QString symbolScope;
QString fileName; QString fileName;

View File

@@ -20,8 +20,11 @@ public:
MyClass() {} MyClass() {}
int function1(); int function1();
int function2(bool yesno, int number) {} int function2(bool yesno, int number) {}
int functionDefinedOutSideClass(char c);
}; };
int MyClass::functionDefinedOutSideClass(char c) {}
// //
// Symbols in a named namespace // Symbols in a named namespace
// //
@@ -40,10 +43,16 @@ public:
MyClass() {} MyClass() {}
int function1(); int function1();
int function2(bool yesno, int number) {} int function2(bool yesno, int number) {}
int functionDefinedOutSideClass(char c);
int functionDefinedOutSideClassAndNamespace(float x);
}; };
int MyClass::functionDefinedOutSideClass(char c) {}
} // namespace MyNamespace } // namespace MyNamespace
int MyNamespace::MyClass::functionDefinedOutSideClassAndNamespace(float x) {}
// //
// Symbols in an anonymous namespace // Symbols in an anonymous namespace
// //
@@ -62,6 +71,12 @@ public:
MyClass() {} MyClass() {}
int function1(); int function1();
int function2(bool yesno, int number) {} int function2(bool yesno, int number) {}
int functionDefinedOutSideClass(char c);
}; };
int MyClass::functionDefinedOutSideClass(char c) {}
} // anonymous namespace } // anonymous namespace
int main() {}