diff options
author | Friedemann Kleint <Friedemann.Kleint@qt.io> | 2019-12-13 10:57:36 +0100 |
---|---|---|
committer | Friedemann Kleint <Friedemann.Kleint@qt.io> | 2020-02-06 09:04:14 +0100 |
commit | 931bfe040c1f13b8c42540572abaa8e4aece89c0 (patch) | |
tree | 793ed7fb9329b2b6d4fd45546235c5c4a32e7fb3 /sources/shiboken2/ApiExtractor/abstractmetalang.cpp | |
parent | ba366999c39e864b2999e6df2693ced3dbe34046 (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.cpp | 23 |
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(); |