diff options
Diffstat (limited to 'sources/shiboken6/ApiExtractor')
-rw-r--r-- | sources/shiboken6/ApiExtractor/abstractmetabuilder.cpp | 15 | ||||
-rw-r--r-- | sources/shiboken6/ApiExtractor/abstractmetalang.cpp | 35 | ||||
-rw-r--r-- | sources/shiboken6/ApiExtractor/abstractmetalang.h | 7 |
3 files changed, 57 insertions, 0 deletions
diff --git a/sources/shiboken6/ApiExtractor/abstractmetabuilder.cpp b/sources/shiboken6/ApiExtractor/abstractmetabuilder.cpp index b0b449f0c..4220665eb 100644 --- a/sources/shiboken6/ApiExtractor/abstractmetabuilder.cpp +++ b/sources/shiboken6/ApiExtractor/abstractmetabuilder.cpp @@ -1454,6 +1454,21 @@ bool AbstractMetaBuilderPrivate::setupInheritance(AbstractMetaClass *metaClass) } } + // Super class set by attribute "default-superclass". + const QString defaultSuperclassName = metaClass->typeEntry()->defaultSuperclass(); + if (!defaultSuperclassName.isEmpty()) { + auto defaultSuper = AbstractMetaClass::findClass(m_metaClasses, defaultSuperclassName); + if (defaultSuper != nullptr) { + metaClass->setDefaultSuperclass(defaultSuper); + } else { + QString message; + QTextStream(&message) << "Class \"" << defaultSuperclassName + << "\" specified as \"default-superclass\" of \"" << metaClass->name() + << "\" could not be found in the code model."; + qCWarning(lcShiboken, "%s", qPrintable(message)); + } + } + return true; } diff --git a/sources/shiboken6/ApiExtractor/abstractmetalang.cpp b/sources/shiboken6/ApiExtractor/abstractmetalang.cpp index 25f29118f..7d2457795 100644 --- a/sources/shiboken6/ApiExtractor/abstractmetalang.cpp +++ b/sources/shiboken6/ApiExtractor/abstractmetalang.cpp @@ -90,6 +90,7 @@ public: Documentation m_doc; const AbstractMetaClass *m_enclosingClass = nullptr; + AbstractMetaClass *m_defaultSuperclass = nullptr; AbstractMetaClassList m_baseClasses; // Real base classes after setting up inheritance AbstractMetaTypeList m_baseTemplateInstantiations; AbstractMetaClass *m_extendedNamespace = nullptr; @@ -409,6 +410,17 @@ QString AbstractMetaClass::baseClassName() const return d->m_baseClasses.isEmpty() ? QString() : d->m_baseClasses.constFirst()->name(); } +// Attribute "default-superclass" +AbstractMetaClass *AbstractMetaClass::defaultSuperclass() const +{ + return d->m_defaultSuperclass; +} + +void AbstractMetaClass::setDefaultSuperclass(AbstractMetaClass *s) +{ + d->m_defaultSuperclass = s; +} + AbstractMetaClass *AbstractMetaClass::baseClass() const { return d->m_baseClasses.value(0, nullptr); @@ -419,6 +431,29 @@ const AbstractMetaClassList &AbstractMetaClass::baseClasses() const return d->m_baseClasses; } +// base classes including "defaultSuperclass". +AbstractMetaClassList AbstractMetaClass::typeSystemBaseClasses() const +{ + AbstractMetaClassList result = d->m_baseClasses; + if (d->m_defaultSuperclass != nullptr) { + result.removeAll(d->m_defaultSuperclass); + result.prepend(d->m_defaultSuperclass); + } + return result; +} + +// Recursive list of all base classes including defaultSuperclass +AbstractMetaClassList AbstractMetaClass::allTypeSystemAncestors() const +{ + AbstractMetaClassList result; + const AbstractMetaClassList baseClasses = typeSystemBaseClasses(); + for (AbstractMetaClass *base : baseClasses) { + result.append(base); + result.append(base->allTypeSystemAncestors()); + } + return result; +} + void AbstractMetaClass::addBaseClass(AbstractMetaClass *baseClass) { Q_ASSERT(baseClass); diff --git a/sources/shiboken6/ApiExtractor/abstractmetalang.h b/sources/shiboken6/ApiExtractor/abstractmetalang.h index dd35e9ee2..da4465917 100644 --- a/sources/shiboken6/ApiExtractor/abstractmetalang.h +++ b/sources/shiboken6/ApiExtractor/abstractmetalang.h @@ -193,8 +193,15 @@ public: QString baseClassName() const; + AbstractMetaClass *defaultSuperclass() const; // Attribute "default-superclass" + void setDefaultSuperclass(AbstractMetaClass *s); + AbstractMetaClass *baseClass() const; const AbstractMetaClassList &baseClasses() const; + // base classes including defaultSuperclass + AbstractMetaClassList typeSystemBaseClasses() const; + // Recursive list of all base classes including defaultSuperclass + AbstractMetaClassList allTypeSystemAncestors() const; void addBaseClass(AbstractMetaClass *base_class); void setBaseClass(AbstractMetaClass *base_class); |