summaryrefslogtreecommitdiffstats
path: root/src/tools/moc/generator.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/tools/moc/generator.cpp')
-rw-r--r--src/tools/moc/generator.cpp105
1 files changed, 105 insertions, 0 deletions
diff --git a/src/tools/moc/generator.cpp b/src/tools/moc/generator.cpp
index acb7cdffe9..976d49ad20 100644
--- a/src/tools/moc/generator.cpp
+++ b/src/tools/moc/generator.cpp
@@ -616,6 +616,11 @@ void Generator::generateCode()
generateSignal(&cdef->signalList[signalindex], signalindex);
//
+// Generate QProperty forwarding API
+//
+ generateQPropertyApi();
+
+//
// Generate plugin meta data
//
generatePluginMetaData();
@@ -1621,6 +1626,106 @@ void Generator::generateSignal(FunctionDef *def,int index)
fprintf(out, "}\n");
}
+void Generator::generateQPropertyApi()
+{
+ for (const PrivateQPropertyDef &property: cdef->privateQProperties) {
+ auto printAccessor = [this, property](bool constAccessor = false) {
+ const char *constOrNot = constAccessor ? "const " : " ";
+ fprintf(out, " const size_t propertyMemberOffset = reinterpret_cast<size_t>(&(static_cast<%s *>(nullptr)->%s));\n", cdef->qualified.constData(), property.name.constData());
+ fprintf(out, " %sauto *thisPtr = reinterpret_cast<%s%s *>(reinterpret_cast<%schar *>(this) - propertyMemberOffset);\n", constOrNot, constOrNot, cdef->qualified.constData(), constOrNot);
+ };
+
+ // property accessor
+ fprintf(out, "\n%s %s::_qt_property_api_%s::value() const\n{\n",
+ property.type.name.constData(),
+ cdef->qualified.constData(),
+ property.name.constData());
+ printAccessor(/*const*/true);
+ fprintf(out, " return thisPtr->%s->%s.value();\n", property.accessor.constData(), property.name.constData());
+ fprintf(out, "}\n");
+
+ // property value setter
+ fprintf(out, "\nvoid %s::_qt_property_api_%s::setValue(const %s &value)\n{\n",
+ cdef->qualified.constData(),
+ property.name.constData(),
+ property.type.name.constData());
+ printAccessor();
+ fprintf(out, " return thisPtr->%s->%s.setValue(value);\n", property.accessor.constData(), property.name.constData());
+ fprintf(out, "}\n");
+
+ // property value move setter
+ fprintf(out, "\nvoid %s::_qt_property_api_%s::setValue(%s &&value)\n{\n",
+ cdef->qualified.constData(),
+ property.name.constData(),
+ property.type.name.constData());
+ printAccessor();
+ fprintf(out, " return thisPtr->%s->%s.setValue(std::move(value));\n", property.accessor.constData(), property.name.constData());
+ fprintf(out, "}\n");
+
+ // binding setter
+ fprintf(out, "\nQPropertyBinding<%s> %s::_qt_property_api_%s::setBinding(const QPropertyBinding<%s> &binding)\n{\n",
+ property.type.name.constData(),
+ cdef->qualified.constData(),
+ property.name.constData(),
+ property.type.name.constData());
+ printAccessor();
+ fprintf(out, " return thisPtr->%s->%s.setBinding(binding);\n", property.accessor.constData(), property.name.constData());
+ fprintf(out, "}\n");
+
+ // binding move setter
+ fprintf(out, "\nQPropertyBinding<%s> %s::_qt_property_api_%s::setBinding(QPropertyBinding<%s> &&binding)\n{\n",
+ property.type.name.constData(),
+ cdef->qualified.constData(),
+ property.name.constData(),
+ property.type.name.constData());
+ printAccessor();
+ fprintf(out, " return thisPtr->%s->%s.setBinding(std::move(binding));\n", property.accessor.constData(), property.name.constData());
+ fprintf(out, "}\n");
+
+ // untyped binding setter
+ fprintf(out, "\nbool %s::_qt_property_api_%s::setBinding(const QUntypedPropertyBinding &binding)\n{\n",
+ cdef->qualified.constData(),
+ property.name.constData());
+ printAccessor();
+ fprintf(out, " return thisPtr->%s->%s.setBinding(binding);\n", property.accessor.constData(), property.name.constData());
+ fprintf(out, "}\n");
+
+ // binding bool getter
+ fprintf(out, "\nbool %s::_qt_property_api_%s::hasBinding() const\n{\n",
+ cdef->qualified.constData(),
+ property.name.constData());
+ printAccessor(/*const*/true);
+ fprintf(out, " return thisPtr->%s->%s.hasBinding();\n", property.accessor.constData(), property.name.constData());
+ fprintf(out, "}\n");
+
+ // binding getter
+ fprintf(out, "\nQPropertyBinding<%s> %s::_qt_property_api_%s::binding() const\n{\n",
+ property.type.name.constData(),
+ cdef->qualified.constData(),
+ property.name.constData());
+ printAccessor(/*const*/true);
+ fprintf(out, " return thisPtr->%s->%s.binding();\n", property.accessor.constData(), property.name.constData());
+ fprintf(out, "}\n");
+
+ // binding taker
+ fprintf(out, "\nQPropertyBinding<%s> %s::_qt_property_api_%s::takeBinding()\n{\n",
+ property.type.name.constData(),
+ cdef->qualified.constData(),
+ property.name.constData());
+ printAccessor();
+ fprintf(out, " return thisPtr->%s->%s.takeBinding();\n", property.accessor.constData(), property.name.constData());
+ fprintf(out, "}\n");
+
+ // property setter function
+ fprintf(out, "\nvoid %s::%s(const %s &value)\n{\n",
+ cdef->qualified.constData(),
+ property.setter.constData(),
+ property.type.name.constData());
+ fprintf(out, " %s->%s.setValue(value);\n", property.accessor.constData(), property.name.constData());
+ fprintf(out, "}\n\n");
+ }
+}
+
static CborError jsonValueToCbor(CborEncoder *parent, const QJsonValue &v);
static CborError jsonObjectToCbor(CborEncoder *parent, const QJsonObject &o)
{