From 190fb44882d2999c7d58a04f9223e3bcc8c08399 Mon Sep 17 00:00:00 2001
From: Nikolai Kosjar <nikolai.kosjar@digia.com>
Date: Thu, 12 Sep 2013 15:26:55 +0200
Subject: [PATCH] CppTools: Fix qualified ids in the symbol searcher

The leaves in the treeview contained qualified ids.

Change-Id: I290eaf9b1e666b6879d6d4b1f2483cfe7fb85362
Reviewed-by: Erik Verbruggen <erik.verbruggen@digia.com>
---
 .../cpptools/builtinindexingsupport.cpp       | 16 ++++++---
 .../cpptools/cppcurrentdocumentfilter.cpp     |  8 +++--
 src/plugins/cpptools/cppfunctionsfilter.cpp   |  1 -
 src/plugins/cpptools/searchsymbols.h          | 20 +++++------
 src/plugins/cpptools/symbolsearcher_test.cpp  | 33 +++++++++++++------
 .../testdata_basic/file1.cpp                  | 31 +++++++++++++----
 6 files changed, 72 insertions(+), 37 deletions(-)

diff --git a/src/plugins/cpptools/builtinindexingsupport.cpp b/src/plugins/cpptools/builtinindexingsupport.cpp
index f9d7215edf5..faec76d150e 100644
--- a/src/plugins/cpptools/builtinindexingsupport.cpp
+++ b/src/plugins/cpptools/builtinindexingsupport.cpp
@@ -119,13 +119,19 @@ public:
                 foreach (const ModelItemInfo &info, modelInfos) {
                     int index = matcher.indexIn(info.symbolName);
                     if (index != -1) {
-                        QString text = info.typeNameRepresentation();
-                        if (text.isEmpty())
-                            text = info.symbolName;
+                        QString text = info.symbolName;
+                        QString scope = info.symbolScope;
+                        if (info.type == ModelItemInfo::Method) {
+                            QString name;
+                            info.unqualifiedNameAndScope(info.symbolName, &name, &scope);
+                            text = name + info.symbolType;
+                        } else if (info.type == ModelItemInfo::Declaration){
+                            text = ModelItemInfo::representDeclaration(info.symbolName,
+                                                                       info.symbolType);
+                        }
 
                         Find::SearchResultItem item;
-                        item.path = info.symbolScope.split(QLatin1String("::"),
-                                                           QString::SkipEmptyParts);
+                        item.path = scope.split(QLatin1String("::"), QString::SkipEmptyParts);
                         item.text = text;
                         item.textMarkPos = -1;
                         item.textMarkLength = 0;
diff --git a/src/plugins/cpptools/cppcurrentdocumentfilter.cpp b/src/plugins/cpptools/cppcurrentdocumentfilter.cpp
index 69a4190d518..93b7e5907a0 100644
--- a/src/plugins/cpptools/cppcurrentdocumentfilter.cpp
+++ b/src/plugins/cpptools/cppcurrentdocumentfilter.cpp
@@ -86,9 +86,11 @@ QList<Locator::FilterEntry> CppCurrentDocumentFilter::matchesFor(QFutureInterfac
         if (future.isCanceled())
             break;
 
-        QString matchString = info.typeNameRepresentation();
-        if (matchString.isEmpty())
-            matchString = info.symbolName;
+        QString matchString = info.symbolName;
+        if (info.type == ModelItemInfo::Declaration)
+            matchString = ModelItemInfo::representDeclaration(info.symbolName, info.symbolType);
+        else if (info.type == ModelItemInfo::Method)
+            matchString += info.symbolType;
 
         if ((hasWildcard && regexp.exactMatch(matchString))
             || (!hasWildcard && matcher.indexIn(matchString) != -1))
diff --git a/src/plugins/cpptools/cppfunctionsfilter.cpp b/src/plugins/cpptools/cppfunctionsfilter.cpp
index d9230165a59..53c94b0f1ce 100644
--- a/src/plugins/cpptools/cppfunctionsfilter.cpp
+++ b/src/plugins/cpptools/cppfunctionsfilter.cpp
@@ -64,4 +64,3 @@ Locator::FilterEntry CppFunctionsFilter::filterEntryFromModelItemInfo(const CppT
 
     return filterEntry;
 }
-
diff --git a/src/plugins/cpptools/searchsymbols.h b/src/plugins/cpptools/searchsymbols.h
index c4e5a25cf87..e47b78b2ceb 100644
--- a/src/plugins/cpptools/searchsymbols.h
+++ b/src/plugins/cpptools/searchsymbols.h
@@ -106,19 +106,15 @@ struct CPPTOOLS_EXPORT ModelItemInfo
         }
     }
 
-    QString typeNameRepresentation() const
+    static QString representDeclaration(const QString &name, const QString &type)
     {
-        if (type == ModelItemInfo::Declaration) {
-            if (!symbolType.isEmpty()) {
-                const QString padding = symbolType.endsWith(QLatin1Char('*'))
-                    ? QString()
-                    : QString(QLatin1Char(' '));
-                return symbolType + padding + symbolName;
-            }
-        } else if (type == ModelItemInfo::Method) {
-            return symbolName + symbolType;
-        }
-        return QString();
+        if (type.isEmpty())
+            return QString();
+
+        const QString padding = type.endsWith(QLatin1Char('*'))
+            ? QString()
+            : QString(QLatin1Char(' '));
+        return type + padding + name;
     }
 
     QString shortNativeFilePath() const
diff --git a/src/plugins/cpptools/symbolsearcher_test.cpp b/src/plugins/cpptools/symbolsearcher_test.cpp
index 5d62fd836e4..c5529b7b467 100644
--- a/src/plugins/cpptools/symbolsearcher_test.cpp
+++ b/src/plugins/cpptools/symbolsearcher_test.cpp
@@ -118,7 +118,6 @@ public:
             = QtConcurrent::run(&SymbolSearcher::runSearch, symbolSearcher);
         search.waitForFinished();
         ResultDataList results = ResultData::fromSearchResultList(search.results());
-//        ResultData::printFilterEntries(results);
         return results;
     }
 
@@ -198,8 +197,10 @@ void CppToolsPlugin::test_builtinsymbolsearcher_data()
             << ResultData(_("int V2"), _("MyEnum"))
             << ResultData(_("MyClass"), _(""))
             << ResultData(_("MyClass()"), _("MyClass"))
-            << ResultData(_("function1()"), _("MyClass"))
-            << ResultData(_("function2(bool, int)"), _("MyClass"))
+            << ResultData(_("functionDeclaredOnly()"), _("MyClass"))
+            << ResultData(_("functionDefinedInClass(bool, int)"), _("MyClass"))
+            << ResultData(_("functionDefinedOutSideClass(char)"), _("MyClass"))
+            << ResultData(_("functionDefinedOutSideClass(char)"), _("MyClass"))
             << ResultData(_("int myVariable"), _("MyNamespace"))
             << ResultData(_("myFunction(bool, int)"), _("MyNamespace"))
             << ResultData(_("MyEnum"), _("MyNamespace"))
@@ -207,8 +208,12 @@ void CppToolsPlugin::test_builtinsymbolsearcher_data()
             << ResultData(_("int V2"), _("MyNamespace::MyEnum"))
             << ResultData(_("MyClass"), _("MyNamespace"))
             << ResultData(_("MyClass()"), _("MyNamespace::MyClass"))
-            << ResultData(_("function1()"), _("MyNamespace::MyClass"))
-            << ResultData(_("function2(bool, int)"), _("MyNamespace::MyClass"))
+            << ResultData(_("functionDeclaredOnly()"), _("MyNamespace::MyClass"))
+            << ResultData(_("functionDefinedInClass(bool, int)"), _("MyNamespace::MyClass"))
+            << ResultData(_("functionDefinedOutSideClass(char)"), _("MyNamespace::MyClass"))
+            << ResultData(_("functionDefinedOutSideClassAndNamespace(float)"), _("MyNamespace::MyClass"))
+            << ResultData(_("functionDefinedOutSideClass(char)"), _("MyNamespace::MyClass"))
+            << ResultData(_("functionDefinedOutSideClassAndNamespace(float)"), _("MyNamespace::MyClass"))
             << ResultData(_("int myVariable"), _("<anonymous namespace>"))
             << ResultData(_("myFunction(bool, int)"), _("<anonymous namespace>"))
             << ResultData(_("MyEnum"), _("<anonymous namespace>"))
@@ -216,8 +221,12 @@ void CppToolsPlugin::test_builtinsymbolsearcher_data()
             << 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(_("functionDeclaredOnly()"), _("<anonymous namespace>::MyClass"))
+            << ResultData(_("functionDefinedInClass(bool, int)"), _("<anonymous namespace>::MyClass"))
+            << ResultData(_("functionDefinedOutSideClass(char)"), _("<anonymous namespace>::MyClass"))
+            << ResultData(_("functionDefinedOutSideClass(char)"), _("<anonymous namespace>::MyClass"))
+            << ResultData(_("main()"), _(""))
+
         );
 
     // Check Classes
@@ -246,11 +255,15 @@ void CppToolsPlugin::test_builtinsymbolsearcher_data()
         << searchParameters
         << (ResultDataList()
             << ResultData(_("myFunction(bool, int)"), _(""))
-            << ResultData(_("function2(bool, int)"), _("MyClass"))
+            << ResultData(_("functionDefinedInClass(bool, int)"), _("MyClass"))
+            << ResultData(_("functionDefinedOutSideClass(char)"), _("MyClass"))
             << ResultData(_("myFunction(bool, int)"), _("MyNamespace"))
-            << ResultData(_("function2(bool, int)"), _("MyNamespace::MyClass"))
+            << ResultData(_("functionDefinedInClass(bool, int)"), _("MyNamespace::MyClass"))
+            << ResultData(_("functionDefinedOutSideClass(char)"), _("MyNamespace::MyClass"))
+            << ResultData(_("functionDefinedOutSideClassAndNamespace(float)"), _("MyNamespace::MyClass"))
             << ResultData(_("myFunction(bool, int)"), _("<anonymous namespace>"))
-            << ResultData(_("function2(bool, int)"), _("<anonymous namespace>::MyClass"))
+            << ResultData(_("functionDefinedInClass(bool, int)"), _("<anonymous namespace>::MyClass"))
+            << ResultData(_("functionDefinedOutSideClass(char)"), _("<anonymous namespace>::MyClass"))
         );
 
     // Check Enums
diff --git a/tests/cppsymbolsearcher/testdata_basic/file1.cpp b/tests/cppsymbolsearcher/testdata_basic/file1.cpp
index 75c772cfb21..98a53752377 100644
--- a/tests/cppsymbolsearcher/testdata_basic/file1.cpp
+++ b/tests/cppsymbolsearcher/testdata_basic/file1.cpp
@@ -1,9 +1,13 @@
 // Copyright header
 
+#define GENERATE_FUNC void myFunctionGenerated() {}
+
 //
 // Symbols in a global namespace
 //
 
+GENERATE_FUNC
+
 int myVariable;
 
 int myFunction(bool yesno, int number) {}
@@ -14,10 +18,13 @@ class MyClass
 {
 public:
     MyClass() {}
-    int function1();
-    int function2(bool yesno, int number) {}
+    int functionDeclaredOnly();
+    int functionDefinedInClass(bool yesno, int number) {}
+    int functionDefinedOutSideClass(char c);
 };
 
+int MyClass::functionDefinedOutSideClass(char c) {}
+
 //
 // Symbols in a named namespace
 //
@@ -34,12 +41,18 @@ class MyClass
 {
 public:
     MyClass() {}
-    int function1();
-    int function2(bool yesno, int number) {}
+    int functionDeclaredOnly();
+    int functionDefinedInClass(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
 //
@@ -56,8 +69,14 @@ class MyClass
 {
 public:
     MyClass() {}
-    int function1();
-    int function2(bool yesno, int number) {}
+    int functionDeclaredOnly();
+    int functionDefinedInClass(bool yesno, int number) {}
+    int functionDefinedOutSideClass(char c);
 };
 
+int MyClass::functionDefinedOutSideClass(char c) {}
+
 } // anonymous namespace
+
+
+int main() {}
-- 
GitLab