From e6b41d7e2fa5d1faa57f0d960204cad7afef92ca Mon Sep 17 00:00:00 2001
From: Nikolai Kosjar <nikolai.kosjar@digia.com>
Date: Tue, 10 Dec 2013 10:47:41 +0100
Subject: [PATCH] CppEditor: Use TypeHierarchyBuilder in
 FunctionHelper::overrides

...instead going the way over CppClass. This makes
FunctionHelper::overrides independent of the cppeditor plugin.

Change-Id: Ifaedb94da1f67b3876e06cce9e745aaf3c1050a7
Reviewed-by: Erik Verbruggen <erik.verbruggen@digia.com>
---
 .../cppvirtualfunctionassistprovider.cpp      | 26 ++++++++++---------
 src/plugins/cpptools/typehierarchybuilder.h   |  3 +++
 2 files changed, 17 insertions(+), 12 deletions(-)

diff --git a/src/plugins/cppeditor/cppvirtualfunctionassistprovider.cpp b/src/plugins/cppeditor/cppvirtualfunctionassistprovider.cpp
index 4530a47b982..aff4973e05b 100644
--- a/src/plugins/cppeditor/cppvirtualfunctionassistprovider.cpp
+++ b/src/plugins/cppeditor/cppvirtualfunctionassistprovider.cpp
@@ -30,8 +30,8 @@
 
 #include "cppvirtualfunctionassistprovider.h"
 
+#include "cppeditor.h"
 #include "cppeditorconstants.h"
-#include "cppelementevaluator.h"
 #include "cppvirtualfunctionproposalitem.h"
 
 #include <cplusplus/Icons.h>
@@ -41,6 +41,7 @@
 #include <coreplugin/actionmanager/command.h>
 
 #include <cpptools/symbolfinder.h>
+#include <cpptools/typehierarchybuilder.h>
 
 #include <texteditor/codeassist/basicproposalitemlistmodel.h>
 #include <texteditor/codeassist/genericproposal.h>
@@ -48,6 +49,7 @@
 #include <texteditor/codeassist/iassistinterface.h>
 #include <texteditor/codeassist/iassistprocessor.h>
 #include <texteditor/codeassist/iassistproposal.h>
+#include <texteditor/texteditorconstants.h>
 
 #include <utils/qtcassert.h>
 
@@ -287,23 +289,23 @@ QList<Symbol *> FunctionHelper::overrides(Function *function, Class *functionsCl
     QTC_ASSERT(referenceName && referenceType.isValid(), return result);
 
     // Find overrides
-    CppEditor::Internal::CppClass cppClass = CppClass(functionsClass);
-    cppClass.lookupDerived(staticClass, snapshot);
+    CppTools::TypeHierarchyBuilder builder(staticClass, snapshot);
+    const CppTools::TypeHierarchy &staticClassHierarchy = builder.buildDerivedTypeHierarchy();
 
-    QList<CppClass> l;
-    l << cppClass;
+    QList<CppTools::TypeHierarchy> l;
+    l.append(CppTools::TypeHierarchy(functionsClass));
+    l.append(staticClassHierarchy);
 
     while (!l.isEmpty()) {
         // Add derived
-        CppClass clazz = l.takeFirst();
-
-        QTC_ASSERT(clazz.declaration, continue);
-        Class *c = clazz.declaration->asClass();
+        const CppTools::TypeHierarchy hierarchy = l.takeFirst();
+        QTC_ASSERT(hierarchy.symbol(), continue);
+        Class *c = hierarchy.symbol()->asClass();
         QTC_ASSERT(c, continue);
 
-        foreach (const CppClass &d, clazz.derived) {
-            if (!l.contains(d))
-                l << d;
+        foreach (const CppTools::TypeHierarchy &t, hierarchy.hierarchy()) {
+            if (!l.contains(t))
+                l << t;
         }
 
         // Check member functions
diff --git a/src/plugins/cpptools/typehierarchybuilder.h b/src/plugins/cpptools/typehierarchybuilder.h
index 94d11510249..0820770de40 100644
--- a/src/plugins/cpptools/typehierarchybuilder.h
+++ b/src/plugins/cpptools/typehierarchybuilder.h
@@ -53,6 +53,9 @@ public:
     CPlusPlus::Symbol *symbol() const;
     const QList<TypeHierarchy> &hierarchy() const;
 
+    bool operator==(const TypeHierarchy &other) const
+    { return _symbol == other._symbol; }
+
 private:
     CPlusPlus::Symbol *_symbol;
     QList<TypeHierarchy> _hierarchy;
-- 
GitLab