From b480acb3720c0d61c5c69a2b861af63b9d7c9f86 Mon Sep 17 00:00:00 2001 From: Simon Hausmann Date: Thu, 9 Apr 2020 16:04:55 +0200 Subject: Allow for private properties to be implemented using QProperty Recently the moc learned that Q_PROPERTY(int x ...) can mean that "x" is implemented as QProperty and then allows installing bindings, etc. - this works by scanning the same class' members. For our own use of QProperty, we need to place the QProperty member itself into the d-pointer to be able to maintain the ability to add new properties without breaking binary compatibility. That however means that moc can't know that a certain property is backed by QProperty - we don't scan the members of the private class. As a workaround, this change enables the syntax where the property type used in Q_PRIVATE_PROPERTY may be wrapped with QProperty. In addition this patch fixes the compilation of such declared properties by ensuring the accessor prefix (t->$accessor) is applied also for the QProperty related meta call variants. Change-Id: I8fbdc49319048b57f4eb0b65b56daba0459e9598 Reviewed-by: Olivier Goffart (Woboq GmbH) --- src/tools/moc/generator.cpp | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) (limited to 'src/tools/moc/generator.cpp') diff --git a/src/tools/moc/generator.cpp b/src/tools/moc/generator.cpp index c0e1dca748..acb7cdffe9 100644 --- a/src/tools/moc/generator.cpp +++ b/src/tools/moc/generator.cpp @@ -1504,8 +1504,12 @@ void Generator::generateStaticMetacall() const PropertyDef &p = cdef->propertyList.at(propindex); if (!p.isQProperty) continue; - fprintf(out, " case %d: observer->setSource(_t->%s); break;\n", - propindex, p.name.constData()); + QByteArray prefix = "_t->"; + if (p.inPrivateClass.size()) { + prefix += p.inPrivateClass + "->"; + } + fprintf(out, " case %d: observer->setSource(%s%s); break;\n", + propindex, prefix.constData(), p.name.constData()); } fprintf(out, " default: break;\n"); fprintf(out, " }\n"); @@ -1521,8 +1525,12 @@ void Generator::generateStaticMetacall() const PropertyDef &p = cdef->propertyList.at(propindex); if (!p.isQProperty) continue; - fprintf(out, " case %d: _t->%s.setBinding(*reinterpret_cast *>(_a[0])); break;\n", - propindex, p.name.constData(), p.type.constData()); + QByteArray prefix = "_t->"; + if (p.inPrivateClass.size()) { + prefix += p.inPrivateClass + "->"; + } + fprintf(out, " case %d: %s%s.setBinding(*reinterpret_cast *>(_a[0])); break;\n", + propindex, prefix.constData(), p.name.constData(), p.type.constData()); } fprintf(out, " default: break;\n"); fprintf(out, " }\n"); -- cgit v1.2.3