diff options
| author | Friedemann Kleint <Friedemann.Kleint@qt.io> | 2020-12-18 19:16:59 +0100 |
|---|---|---|
| committer | Friedemann Kleint <Friedemann.Kleint@qt.io> | 2020-12-21 17:55:54 +0100 |
| commit | 44fc52f4f02e0f1c9fdbfa16d2bc1f6f073bfed0 (patch) | |
| tree | 7fadf08d8d07e6686c0916712c82fc3aa6c1f159 /sources/shiboken6/ApiExtractor/abstractmetabuilder.cpp | |
| parent | dacd0e5f2c087478029b68d0b65ead7ba8a49e81 (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.cpp | 18 |
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) |
