aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNikolai Kosjar <nikolai.kosjar@digia.com>2013-09-12 14:06:36 +0200
committerNikolai Kosjar <nikolai.kosjar@digia.com>2013-09-13 15:40:48 +0200
commit91dbac03033a077e77cbc58bc1321ecf6f571bfb (patch)
treec71bc63a34c03a87682674c14bb147a05cfe659a
parentfeef5cac4ce92df71ec320ae7484d63b3b5e4a30 (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.cpp8
-rw-r--r--src/plugins/cpptools/cppfunctionsfilter.cpp13
-rw-r--r--src/plugins/cpptools/cpplocatorfilter.cpp2
-rw-r--r--src/plugins/cpptools/cpplocatorfilter_test.cpp67
-rw-r--r--src/plugins/cpptools/searchsymbols.cpp14
-rw-r--r--src/plugins/cpptools/searchsymbols.h14
-rw-r--r--tests/cpplocators/testdata_basic/file1.cpp15
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() {}