aboutsummaryrefslogtreecommitdiffstats
path: root/sources/shiboken6/ApiExtractor/abstractmetabuilder.cpp
diff options
context:
space:
mode:
authorFriedemann Kleint <Friedemann.Kleint@qt.io>2021-02-12 14:17:55 +0100
committerFriedemann Kleint <Friedemann.Kleint@qt.io>2021-02-17 15:16:15 +0100
commit5fcbb17760d9ddf0a1e39c40baeaf28df9a4bb5e (patch)
tree3a59f0fda60e5b0cd671a0fc163772e6ab78582a /sources/shiboken6/ApiExtractor/abstractmetabuilder.cpp
parent1a53685c10dc3dab972a42fe02166ff0349320f4 (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.cpp45
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)