aboutsummaryrefslogtreecommitdiffstats
path: root/sources/shiboken6/ApiExtractor
diff options
context:
space:
mode:
Diffstat (limited to 'sources/shiboken6/ApiExtractor')
-rw-r--r--sources/shiboken6/ApiExtractor/abstractmetabuilder.cpp15
-rw-r--r--sources/shiboken6/ApiExtractor/abstractmetalang.cpp35
-rw-r--r--sources/shiboken6/ApiExtractor/abstractmetalang.h7
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);