aboutsummaryrefslogtreecommitdiffstats
path: root/sources/shiboken6/ApiExtractor/abstractmetatype.cpp
diff options
context:
space:
mode:
authorFriedemann Kleint <Friedemann.Kleint@qt.io>2021-10-19 16:54:01 +0200
committerFriedemann Kleint <Friedemann.Kleint@qt.io>2021-10-21 13:03:07 +0200
commitc0beb9f29f36ea3bc8be26675a05253cc5584fe4 (patch)
tree38e2c5b7e3d1167a701061c82940fc5f80a3ab38 /sources/shiboken6/ApiExtractor/abstractmetatype.cpp
parentbe8980798ad04a5c8a6cd32962349734ac6d223c (diff)
shiboken6: Implement opaque containers for getters (non-const)
Extract helpers from the opaque containers generation for fields and use them for function returns if the type is modified accordingly. [ChangeLog][shiboken6] Getters returning containers by reference can now be modified to return an opaque container by modifying the return type accordingly. Pick-to: 6.2 Task-number: PYSIDE-1605 Change-Id: Ieaf5eb92d248d3a23e511222e5f61823e85540c0 Reviewed-by: Christian Tismer <tismer@stackless.com> Reviewed-by: Cristian Maureira-Fredes <cristian.maureira-fredes@qt.io>
Diffstat (limited to 'sources/shiboken6/ApiExtractor/abstractmetatype.cpp')
-rw-r--r--sources/shiboken6/ApiExtractor/abstractmetatype.cpp36
1 files changed, 31 insertions, 5 deletions
diff --git a/sources/shiboken6/ApiExtractor/abstractmetatype.cpp b/sources/shiboken6/ApiExtractor/abstractmetatype.cpp
index 3cfc5b67f..80ab1828d 100644
--- a/sources/shiboken6/ApiExtractor/abstractmetatype.cpp
+++ b/sources/shiboken6/ApiExtractor/abstractmetatype.cpp
@@ -136,6 +136,8 @@ public:
QString formatSignature(bool minimal) const;
QString formatPythonSignature() const;
bool equals(const AbstractMetaTypeData &rhs) const;
+ template <class Predicate>
+ bool generateOpaqueContainer(Predicate p) const;
const TypeEntry *m_typeEntry;
AbstractMetaTypeList m_instantiations;
@@ -929,15 +931,16 @@ AbstractMetaType AbstractMetaType::fromAbstractMetaClass(const AbstractMetaClass
return fromTypeEntry(metaClass->typeEntry());
}
-bool AbstractMetaType::generateOpaqueContainer() const
+template <class Predicate> // Predicate(containerTypeEntry, signature)
+bool AbstractMetaTypeData::generateOpaqueContainer(Predicate pred) const
{
- if (!isContainer())
+ if (m_pattern != AbstractMetaType::ContainerPattern)
return false;
- auto *containerTypeEntry = static_cast<const ContainerTypeEntry *>(typeEntry());
+ auto *containerTypeEntry = static_cast<const ContainerTypeEntry *>(m_typeEntry);
auto kind = containerTypeEntry->containerKind();
if (kind != ContainerTypeEntry::ListContainer)
return false;
- const auto &instantation = d->m_instantiations.constFirst();
+ const auto &instantation = m_instantiations.constFirst();
if (instantation.referenceType() != NoReference)
return false;
const QString signature = instantation.cppSignature();
@@ -951,7 +954,7 @@ bool AbstractMetaType::generateOpaqueContainer() const
case TypeEntry::BasicValueType:
case TypeEntry::ObjectType:
case TypeEntry::CustomType:
- result = containerTypeEntry->generateOpaqueContainer(signature);
+ result = pred(containerTypeEntry, signature);
break;
default:
break;
@@ -959,6 +962,29 @@ bool AbstractMetaType::generateOpaqueContainer() const
return result;
}
+// Simple predicate for checking whether an opaque container should be generated
+static bool opaqueContainerPredicate(const ContainerTypeEntry *t,
+ const QString &signature)
+{
+ return t->generateOpaqueContainer(signature);
+}
+
+bool AbstractMetaType::generateOpaqueContainer() const
+{
+ return d->generateOpaqueContainer(opaqueContainerPredicate);
+}
+
+// Helper for determining whether a function should return an opaque container,
+// that is, the function return type is modified accordingly
+// (cf AbstractMetaFunction::generateOpaqueContainerReturn())
+bool AbstractMetaType::generateOpaqueContainerForGetter(const QString &modifiedType) const
+{
+ auto predicate = [&modifiedType](const ContainerTypeEntry *t, const QString &signature) {
+ return t->opaqueContainerName(signature) == modifiedType;
+ };
+ return d->generateOpaqueContainer(predicate);
+}
+
#ifndef QT_NO_DEBUG_STREAM
void AbstractMetaType::formatDebug(QDebug &debug) const
{