summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEike Ziller <eike.ziller@qt.io>2018-03-08 19:25:04 +0100
committerEike Ziller <eike.ziller@qt.io>2018-03-09 08:21:07 +0000
commit711ac6602f67a711eeeb307174408cdc5cf0ab3a (patch)
treed7e2627b3a158f43cd49fab0de08d15797658183
parent32188f448ab9cfc0e7ed3da4f95c3f9ce2953795 (diff)
downloadqt-creator-711ac6602f67a711eeeb307174408cdc5cf0ab3a.tar.gz
Fix C++ type hierarchy
Dynamic casts between library boundaries tend to fail. Add an "explicit cast" to CppClass via virtual functions as a quickfix. This is a recurring issue, e.g. d2769f30037aa, 3f11ef92167ba and 2ffd0e2d0da5d to name just a few... This was introduced in 5e861d2be6729 Task-number: QTCREATORBUG-20001 Change-Id: Ie5a89a028d587e4e9d1ecec920a7c7d17497dbde Reviewed-by: Ivan Donchevskii <ivan.donchevskii@qt.io>
-rw-r--r--src/plugins/cppeditor/cpptypehierarchy.cpp2
-rw-r--r--src/plugins/cpptools/cppelementevaluator.cpp10
-rw-r--r--src/plugins/cpptools/cppelementevaluator.h10
3 files changed, 19 insertions, 3 deletions
diff --git a/src/plugins/cppeditor/cpptypehierarchy.cpp b/src/plugins/cppeditor/cpptypehierarchy.cpp
index 0b3198d4c9..ad581602f0 100644
--- a/src/plugins/cppeditor/cpptypehierarchy.cpp
+++ b/src/plugins/cppeditor/cpptypehierarchy.cpp
@@ -154,7 +154,7 @@ void CppTypeHierarchyWidget::perform()
if (evaluator.identifiedCppElement()) {
const QSharedPointer<CppElement> &cppElement = evaluator.cppElement();
CppElement *element = cppElement.data();
- if (CppClass *cppClass = dynamic_cast<CppClass *>(element)) {
+ if (CppClass *cppClass = element->toCppClass()) {
m_inspectedClass->setText(cppClass->name);
m_inspectedClass->setLink(cppClass->link);
QStandardItem *bases = new QStandardItem(tr("Bases"));
diff --git a/src/plugins/cpptools/cppelementevaluator.cpp b/src/plugins/cpptools/cppelementevaluator.cpp
index df9ebefa3d..513926802b 100644
--- a/src/plugins/cpptools/cppelementevaluator.cpp
+++ b/src/plugins/cpptools/cppelementevaluator.cpp
@@ -63,6 +63,11 @@ CppElement::CppElement() : helpCategory(TextEditor::HelpItem::Unknown)
CppElement::~CppElement()
{}
+CppClass *CppElement::toCppClass()
+{
+ return nullptr;
+}
+
class Unknown : public CppElement
{
public:
@@ -156,6 +161,11 @@ bool CppClass::operator==(const CppClass &other)
return this->declaration == other.declaration;
}
+CppClass *CppClass::toCppClass()
+{
+ return this;
+}
+
void CppClass::lookupBases(Symbol *declaration, const LookupContext &context)
{
typedef QPair<ClassOrNamespace *, CppClass *> Data;
diff --git a/src/plugins/cpptools/cppelementevaluator.h b/src/plugins/cpptools/cppelementevaluator.h
index 0755bd3004..0bececefaf 100644
--- a/src/plugins/cpptools/cppelementevaluator.h
+++ b/src/plugins/cpptools/cppelementevaluator.h
@@ -81,6 +81,8 @@ private:
QString m_diagnosis;
};
+class CppClass;
+
class CPPTOOLS_EXPORT CppElement
{
protected:
@@ -89,6 +91,8 @@ protected:
public:
virtual ~CppElement();
+ virtual CppClass *toCppClass();
+
TextEditor::HelpItem::Category helpCategory;
QStringList helpIdCandidates;
QString helpMark;
@@ -96,7 +100,7 @@ public:
QString tooltip;
};
-class CppDeclarableElement : public CppElement
+class CPPTOOLS_EXPORT CppDeclarableElement : public CppElement
{
public:
explicit CppDeclarableElement(CPlusPlus::Symbol *declaration);
@@ -109,7 +113,7 @@ public:
QIcon icon;
};
-class CppClass : public CppDeclarableElement
+class CPPTOOLS_EXPORT CppClass : public CppDeclarableElement
{
public:
CppClass();
@@ -117,6 +121,8 @@ public:
bool operator==(const CppClass &other);
+ CppClass *toCppClass() final;
+
void lookupBases(CPlusPlus::Symbol *declaration, const CPlusPlus::LookupContext &context);
void lookupDerived(CPlusPlus::Symbol *declaration, const CPlusPlus::Snapshot &snapshot);