diff options
| author | Friedemann Kleint <Friedemann.Kleint@qt.io> | 2021-02-12 14:17:55 +0100 |
|---|---|---|
| committer | Friedemann Kleint <Friedemann.Kleint@qt.io> | 2021-02-17 15:16:15 +0100 |
| commit | 5fcbb17760d9ddf0a1e39c40baeaf28df9a4bb5e (patch) | |
| tree | 3a59f0fda60e5b0cd671a0fc163772e6ab78582a /sources/shiboken6/ApiExtractor/abstractmetabuilder.cpp | |
| parent | 1a53685c10dc3dab972a42fe02166ff0349320f4 (diff) | |
shiboken6: Improve detection of default/copy constructability
Add support for deleted functions. Extend the checks for default
constructability by checks for fields and base classes. Refactor the
check for copy constructability to recursively check on base
classes. Remove functionality for adding private copy constructors
which was apparently unused.
Change-Id: I8105f277699d6121aa8aa193d9cb16bf8133e901
Reviewed-by: Cristian Maureira-Fredes <cristian.maureira-fredes@qt.io>
Diffstat (limited to 'sources/shiboken6/ApiExtractor/abstractmetabuilder.cpp')
| -rw-r--r-- | sources/shiboken6/ApiExtractor/abstractmetabuilder.cpp | 45 |
1 files changed, 22 insertions, 23 deletions
diff --git a/sources/shiboken6/ApiExtractor/abstractmetabuilder.cpp b/sources/shiboken6/ApiExtractor/abstractmetabuilder.cpp index 16fe8e01b..e8c82c247 100644 --- a/sources/shiboken6/ApiExtractor/abstractmetabuilder.cpp +++ b/sources/shiboken6/ApiExtractor/abstractmetabuilder.cpp @@ -499,16 +499,12 @@ void AbstractMetaBuilderPrivate::traverseDom(const FileModelItem &dom) for (AbstractMetaClass *cls : qAsConst(m_metaClasses)) { cls->fixFunctions(); - const bool couldAddDefaultCtors = cls->isConstructible() - && !cls->isNamespace() - && (cls->attributes() & AbstractMetaAttributes::HasRejectedConstructor) == 0; - if (couldAddDefaultCtors) { - if (!cls->hasConstructors()) - cls->addDefaultConstructor(); - if (cls->typeEntry()->isValue() && !cls->isAbstract() && !cls->hasCopyConstructor()) - cls->addDefaultCopyConstructor(ancestorHasPrivateCopyConstructor(cls)); - } + if (cls->canAddDefaultConstructor()) + cls->addDefaultConstructor(); + if (cls->canAddDefaultCopyConstructor()) + cls->addDefaultCopyConstructor(); } + const auto &allEntries = types->entries(); ReportHandler::startProgress("Detecting inconsistencies in typesystem (" @@ -1804,10 +1800,25 @@ static bool applyArrayArgumentModifications(const FunctionModificationList &func } AbstractMetaFunction *AbstractMetaBuilderPrivate::traverseFunction(const FunctionModelItem &functionItem, - const AbstractMetaClass *currentClass) + AbstractMetaClass *currentClass) { - if (functionItem->isDeleted() || !functionItem->templateParameters().isEmpty()) + if (!functionItem->templateParameters().isEmpty()) + return nullptr; + + if (functionItem->isDeleted()) { + switch (functionItem->functionType()) { + case CodeModel::Constructor: + if (functionItem->isDefaultConstructor()) + currentClass->setHasDeletedDefaultConstructor(true); + break; + case CodeModel::CopyConstructor: + currentClass->setHasDeletedCopyConstructor(true); + break; + default: + break; + } return nullptr; + } QString functionName = functionItem->name(); QString className; if (currentClass) { @@ -2622,18 +2633,6 @@ AbstractMetaClassList AbstractMetaBuilderPrivate::getBaseClasses(const AbstractM return baseClasses; } -bool AbstractMetaBuilderPrivate::ancestorHasPrivateCopyConstructor(const AbstractMetaClass *metaClass) const -{ - if (metaClass->hasPrivateCopyConstructor()) - return true; - const AbstractMetaClassList &baseClasses = getBaseClasses(metaClass); - for (const AbstractMetaClass *cls : baseClasses) { - if (ancestorHasPrivateCopyConstructor(cls)) - return true; - } - return false; -} - std::optional<AbstractMetaType> AbstractMetaBuilderPrivate::inheritTemplateType(const AbstractMetaTypeList &templateTypes, const AbstractMetaType &metaType) |
