diff options
author | Friedemann Kleint <Friedemann.Kleint@qt.io> | 2020-10-14 08:27:31 +0200 |
---|---|---|
committer | Friedemann Kleint <Friedemann.Kleint@qt.io> | 2020-10-15 16:23:28 +0200 |
commit | 5b29846a91564aef34edb618a7a014df7de96f3a (patch) | |
tree | ce135fc702e5c3679b3f5bc4dcd6cf9a27f79692 /sources | |
parent | 407df30afa155c9e0195a25ba16827385e507314 (diff) |
shiboken2: Enable setting up inheritance for templates early on
Split the code adding the specialized template functions from
AbstractMetaBuilderPrivate::inheritTemplate() into a separate function.
The part setting up the base classes can then be called at an
earlier stage so that it is known when traversing the functions.
Task-number: PYSIDE-1202
Change-Id: I958d357b78572c9b5130dbe1bf517d2af82a6f1a
Reviewed-by: Cristian Maureira-Fredes <cristian.maureira-fredes@qt.io>
Diffstat (limited to 'sources')
-rw-r--r-- | sources/shiboken2/ApiExtractor/abstractmetabuilder.cpp | 41 | ||||
-rw-r--r-- | sources/shiboken2/ApiExtractor/abstractmetabuilder_p.h | 1 |
2 files changed, 25 insertions, 17 deletions
diff --git a/sources/shiboken2/ApiExtractor/abstractmetabuilder.cpp b/sources/shiboken2/ApiExtractor/abstractmetabuilder.cpp index 838b28988..942d99cd3 100644 --- a/sources/shiboken2/ApiExtractor/abstractmetabuilder.cpp +++ b/sources/shiboken2/ApiExtractor/abstractmetabuilder.cpp @@ -514,6 +514,8 @@ void AbstractMetaBuilderPrivate::traverseDom(const FileModelItem &dom) for (AbstractMetaClass *cls : qAsConst(m_metaClasses)) { if (!cls->isNamespace()) { setupInheritance(cls); + if (cls->templateBaseClass()) + inheritTemplateFunctions(cls); if (!cls->hasVirtualDestructor() && cls->baseClass() && cls->baseClass()->hasVirtualDestructor()) cls->setHasVirtualDestructor(true); @@ -2617,17 +2619,6 @@ bool AbstractMetaBuilderPrivate::inheritTemplate(AbstractMetaClass *subclass, { QVector<TypeInfo> targs = info.instantiations(); AbstractMetaTypeList templateTypes; - QString errorMessage; - - if (subclass->isTypeDef()) { - subclass->setHasCloneOperator(templateClass->hasCloneOperator()); - subclass->setHasEqualsOperator(templateClass->hasEqualsOperator()); - subclass->setHasHashFunction(templateClass->hasHashFunction()); - subclass->setHasNonPrivateConstructor(templateClass->hasNonPrivateConstructor()); - subclass->setHasPrivateDestructor(templateClass->hasPrivateDestructor()); - subclass->setHasProtectedDestructor(templateClass->hasProtectedDestructor()); - subclass->setHasVirtualDestructor(templateClass->hasVirtualDestructor()); - } for (const TypeInfo &i : qAsConst(targs)) { QString typeName = i.qualifiedName().join(colonColon()); @@ -2672,6 +2663,28 @@ bool AbstractMetaBuilderPrivate::inheritTemplate(AbstractMetaClass *subclass, } } + subclass->setTemplateBaseClass(templateClass); + subclass->setTemplateBaseClassInstantiations(templateTypes); + subclass->setBaseClass(templateClass->baseClass()); + return true; +} + +void AbstractMetaBuilderPrivate::inheritTemplateFunctions(AbstractMetaClass *subclass) +{ + QString errorMessage; + auto templateClass = subclass->templateBaseClass(); + + if (subclass->isTypeDef()) { + subclass->setHasCloneOperator(templateClass->hasCloneOperator()); + subclass->setHasEqualsOperator(templateClass->hasEqualsOperator()); + subclass->setHasHashFunction(templateClass->hasHashFunction()); + subclass->setHasNonPrivateConstructor(templateClass->hasNonPrivateConstructor()); + subclass->setHasPrivateDestructor(templateClass->hasPrivateDestructor()); + subclass->setHasProtectedDestructor(templateClass->hasProtectedDestructor()); + subclass->setHasVirtualDestructor(templateClass->hasVirtualDestructor()); + } + + const auto &templateTypes = subclass->templateBaseClassInstantiations(); const AbstractMetaFunctionList &subclassFuncs = subclass->functions(); const AbstractMetaFunctionList &templateClassFunctions = templateClass->functions(); for (const AbstractMetaFunction *function : templateClassFunctions) { @@ -2774,12 +2787,6 @@ bool AbstractMetaBuilderPrivate::inheritTemplate(AbstractMetaClass *subclass, f->replaceType(fieldType); subclass->addField(f.take()); } - - subclass->setTemplateBaseClass(templateClass); - subclass->setTemplateBaseClassInstantiations(templateTypes); - subclass->setBaseClass(templateClass->baseClass()); - - return true; } void AbstractMetaBuilderPrivate::parseQ_Properties(AbstractMetaClass *metaClass, diff --git a/sources/shiboken2/ApiExtractor/abstractmetabuilder_p.h b/sources/shiboken2/ApiExtractor/abstractmetabuilder_p.h index 671775130..103f16d15 100644 --- a/sources/shiboken2/ApiExtractor/abstractmetabuilder_p.h +++ b/sources/shiboken2/ApiExtractor/abstractmetabuilder_p.h @@ -162,6 +162,7 @@ public: bool inheritTemplate(AbstractMetaClass *subclass, const AbstractMetaClass *templateClass, const TypeInfo &info); + void inheritTemplateFunctions(AbstractMetaClass *subclass); AbstractMetaType *inheritTemplateType(const AbstractMetaTypeList &templateTypes, const AbstractMetaType *metaType); |