diff options
author | Friedemann Kleint <Friedemann.Kleint@qt.io> | 2021-10-19 16:54:01 +0200 |
---|---|---|
committer | Friedemann Kleint <Friedemann.Kleint@qt.io> | 2021-10-21 13:03:07 +0200 |
commit | c0beb9f29f36ea3bc8be26675a05253cc5584fe4 (patch) | |
tree | 38e2c5b7e3d1167a701061c82940fc5f80a3ab38 /sources/shiboken6/ApiExtractor/abstractmetatype.cpp | |
parent | be8980798ad04a5c8a6cd32962349734ac6d223c (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.cpp | 36 |
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 { |