aboutsummaryrefslogtreecommitdiffstats
path: root/sources/shiboken2/ApiExtractor/abstractmetalang.cpp
diff options
context:
space:
mode:
authorFriedemann Kleint <Friedemann.Kleint@qt.io>2019-12-13 10:57:36 +0100
committerFriedemann Kleint <Friedemann.Kleint@qt.io>2020-02-06 09:04:14 +0100
commit931bfe040c1f13b8c42540572abaa8e4aece89c0 (patch)
tree793ed7fb9329b2b6d4fd45546235c5c4a32e7fb3 /sources/shiboken2/ApiExtractor/abstractmetalang.cpp
parentba366999c39e864b2999e6df2693ced3dbe34046 (diff)
shiboken: Refactor base class handling
Change the m_baseClass pointer into a vector to handle multiple inheritance. It will receive the base classes which previously were handled as interfaces. Change-Id: Idc6a5d6ce53bb9bbe054397194b660bd748e3042 Reviewed-by: Cristian Maureira-Fredes <cristian.maureira-fredes@qt.io>
Diffstat (limited to 'sources/shiboken2/ApiExtractor/abstractmetalang.cpp')
-rw-r--r--sources/shiboken2/ApiExtractor/abstractmetalang.cpp23
1 files changed, 17 insertions, 6 deletions
diff --git a/sources/shiboken2/ApiExtractor/abstractmetalang.cpp b/sources/shiboken2/ApiExtractor/abstractmetalang.cpp
index b1e0cae67..08fedc5ee 100644
--- a/sources/shiboken2/ApiExtractor/abstractmetalang.cpp
+++ b/sources/shiboken2/ApiExtractor/abstractmetalang.cpp
@@ -80,7 +80,7 @@ const AbstractMetaClass *recurseClassHierarchy(const AbstractMetaClass *klass,
{
if (pred(klass))
return klass;
- if (auto base = klass->baseClass()) {
+ for (auto base : klass->baseClasses()) {
if (auto r = recurseClassHierarchy(base, pred))
return r;
}
@@ -1554,11 +1554,19 @@ QString AbstractMetaClass::name() const
return m_typeEntry->targetLangEntryName();
}
+void AbstractMetaClass::addBaseClass(AbstractMetaClass *baseClass)
+{
+ Q_ASSERT(baseClass);
+ m_baseClasses.append(baseClass);
+ m_isPolymorphic |= baseClass->isPolymorphic();
+}
+
void AbstractMetaClass::setBaseClass(AbstractMetaClass *baseClass)
{
- m_baseClass = baseClass;
- if (baseClass)
+ if (baseClass) {
+ m_baseClasses.prepend(baseClass);
m_isPolymorphic |= baseClass->isPolymorphic();
+ }
}
QString AbstractMetaClass::package() const
@@ -1674,7 +1682,7 @@ void AbstractMetaClass::setTemplateBaseClassInstantiations(AbstractMetaTypeList
bool AbstractMetaClass::deleteInMainThread() const
{
return typeEntry()->deleteInMainThread()
- || (m_baseClass && m_baseClass->deleteInMainThread());
+ || (!m_baseClasses.isEmpty() && m_baseClasses.constFirst()->deleteInMainThread());
}
static bool functions_contains(const AbstractMetaFunctionList &l, const AbstractMetaFunction *func)
@@ -2580,8 +2588,11 @@ void AbstractMetaClass::format(QDebug &d) const
d << " [final]";
if (attributes().testFlag(AbstractMetaAttributes::Deprecated))
d << " [deprecated]";
- if (m_baseClass)
- d << ", inherits \"" << m_baseClass->name() << '"';
+ if (!m_baseClasses.isEmpty()) {
+ d << ", inherits ";
+ for (auto b : m_baseClasses)
+ d << " \"" << b->name() << '"';
+ }
if (auto templateBase = templateBaseClass()) {
const auto instantiatedTypes = templateBaseClassInstantiations();
d << ", instantiates \"" << templateBase->name();