aboutsummaryrefslogtreecommitdiffstats
path: root/sources/shiboken6/ApiExtractor/abstractmetabuilder.cpp
diff options
context:
space:
mode:
authorFriedemann Kleint <Friedemann.Kleint@qt.io>2020-12-18 19:16:59 +0100
committerFriedemann Kleint <Friedemann.Kleint@qt.io>2020-12-21 17:55:54 +0100
commit44fc52f4f02e0f1c9fdbfa16d2bc1f6f073bfed0 (patch)
tree7fadf08d8d07e6686c0916712c82fc3aa6c1f159 /sources/shiboken6/ApiExtractor/abstractmetabuilder.cpp
parentdacd0e5f2c087478029b68d0b65ead7ba8a49e81 (diff)
shiboken6: Refactor base class retrieval
AbstractMetaClass has a list of base class names and a list of AbstractMetaClass* base instances. AbstractMetaBuilder populates the instance list from the names in setupInheritance() and sets a flag. In a few places in AbstractMetaBuilder, the base class instances are needed before this has been completed. For this purpose, the helper AbstractMetaBuilder::getBaseClasses() is needed. Replace the set of classes m_setupInheritanceDone by a flag on AbstractMetaClass. This allows for adding an assert to AbstractMetaClass::baseClasses() ensuring setupInheritance() has been called and taking a shortcut in AbstractMetaBuilder::getBaseClasses(). In addition, classesTopologicalSorted() can use AbstractMetaClass::baseClasses() instead of searching with AbstractMetaBuilder::getBaseClasses() and can thus be made static. Change-Id: Iaf8209b6f6534ad91a96970a56c1e86cce054922 Reviewed-by: Christian Tismer <tismer@stackless.com> (cherry picked from commit e99ac18b134469854dff05fd3bb61158f9d9ccf9) Reviewed-by: Friedemann Kleint <Friedemann.Kleint@qt.io>
Diffstat (limited to 'sources/shiboken6/ApiExtractor/abstractmetabuilder.cpp')
-rw-r--r--sources/shiboken6/ApiExtractor/abstractmetabuilder.cpp18
1 files changed, 10 insertions, 8 deletions
diff --git a/sources/shiboken6/ApiExtractor/abstractmetabuilder.cpp b/sources/shiboken6/ApiExtractor/abstractmetabuilder.cpp
index ad354d901..9f2196d84 100644
--- a/sources/shiboken6/ApiExtractor/abstractmetabuilder.cpp
+++ b/sources/shiboken6/ApiExtractor/abstractmetabuilder.cpp
@@ -456,7 +456,7 @@ void AbstractMetaBuilderPrivate::traverseDom(const FileModelItem &dom)
ReportHandler::startProgress("Fixing class inheritance...");
for (AbstractMetaClass *cls : qAsConst(m_metaClasses)) {
- if (!cls->isNamespace()) {
+ if (cls->needsInheritanceSetup()) {
setupInheritance(cls);
if (cls->templateBaseClass())
inheritTemplateFunctions(cls);
@@ -1419,10 +1419,10 @@ void AbstractMetaBuilderPrivate::applyFunctionModifications(AbstractMetaFunction
bool AbstractMetaBuilderPrivate::setupInheritance(AbstractMetaClass *metaClass)
{
- if (m_setupInheritanceDone.contains(metaClass))
+ if (metaClass->inheritanceDone())
return true;
- m_setupInheritanceDone.insert(metaClass);
+ metaClass->setInheritanceDone(true);
QStringList baseClasses = metaClass->baseClassNames();
@@ -2590,6 +2590,9 @@ AbstractMetaClass* AbstractMetaBuilderPrivate::findTemplateClass(const QString &
AbstractMetaClassList AbstractMetaBuilderPrivate::getBaseClasses(const AbstractMetaClass *metaClass) const
{
+ // Shortcut if inheritance has already been set up
+ if (metaClass->inheritanceDone() || !metaClass->needsInheritanceSetup())
+ return metaClass->baseClasses();
AbstractMetaClassList baseClasses;
const QStringList &baseClassNames = metaClass->baseClassNames();
for (const QString& parent : baseClassNames) {
@@ -3015,7 +3018,7 @@ static bool addClassDependency(const AbstractMetaClassList &classList,
}
AbstractMetaClassList AbstractMetaBuilderPrivate::classesTopologicalSorted(const AbstractMetaClassList &classList,
- const Dependencies &additionalDependencies) const
+ const Dependencies &additionalDependencies)
{
ClassGraph graph(classList.cbegin(), classList.cend());
@@ -3033,8 +3036,7 @@ AbstractMetaClassList AbstractMetaBuilderPrivate::classesTopologicalSorted(const
graph.addEdge(enclosing, clazz);
}
- const AbstractMetaClassList &bases = getBaseClasses(clazz);
- for (AbstractMetaClass *baseClass : bases)
+ for (auto baseClass : clazz->baseClasses())
graph.addEdge(baseClass, clazz);
for (const auto &func : clazz->functions()) {
@@ -3101,9 +3103,9 @@ void AbstractMetaBuilderPrivate::pushScope(const NamespaceModelItem &item)
}
AbstractMetaClassList AbstractMetaBuilder::classesTopologicalSorted(const AbstractMetaClassList &classList,
- const Dependencies &additionalDependencies) const
+ const Dependencies &additionalDependencies)
{
- return d->classesTopologicalSorted(classList, additionalDependencies);
+ return AbstractMetaBuilderPrivate::classesTopologicalSorted(classList, additionalDependencies);
}
AbstractMetaArgumentList AbstractMetaBuilderPrivate::reverseList(const AbstractMetaArgumentList &list)