diff options
author | Eike Ziller <eike.ziller@qt.io> | 2018-03-08 19:25:04 +0100 |
---|---|---|
committer | Eike Ziller <eike.ziller@qt.io> | 2018-03-09 08:21:07 +0000 |
commit | 711ac6602f67a711eeeb307174408cdc5cf0ab3a (patch) | |
tree | d7e2627b3a158f43cd49fab0de08d15797658183 | |
parent | 32188f448ab9cfc0e7ed3da4f95c3f9ce2953795 (diff) | |
download | qt-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.cpp | 2 | ||||
-rw-r--r-- | src/plugins/cpptools/cppelementevaluator.cpp | 10 | ||||
-rw-r--r-- | src/plugins/cpptools/cppelementevaluator.h | 10 |
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); |