summaryrefslogtreecommitdiffstats
path: root/src/tools/moc/generator.cpp
diff options
context:
space:
mode:
authorLars Knoll <lars.knoll@qt.io>2020-08-21 13:00:02 +0200
committerLars Knoll <lars.knoll@qt.io>2020-09-02 22:44:27 +0200
commite6988d4d0bef2c3f474576250cb305a2f00a688b (patch)
tree9412573d07041918349dc2542673467739be73ce /src/tools/moc/generator.cpp
parente638e8a28d74af8129aaaf6b67fabbb5dbdf31e4 (diff)
Remove QNotifiedProperty and Q_PRIVATE_QPROPERTY
And all related functionality. This is being replaced by Q_BINDABLE_PROPERTY and Q_OBJECT_BINDABLE_PROPERTY in the next few commits. The new infrastructure coming will play nicer along with the existing property system. Commented out some autotests, that will get reimplemented with the updated infrastructure. Change-Id: I50c30bd4d5c6c6b6471f8eb93870e27d86f5a009 Reviewed-by: Ulf Hermann <ulf.hermann@qt.io>
Diffstat (limited to 'src/tools/moc/generator.cpp')
-rw-r--r--src/tools/moc/generator.cpp318
1 files changed, 29 insertions, 289 deletions
diff --git a/src/tools/moc/generator.cpp b/src/tools/moc/generator.cpp
index c36e01a79a..1d2fa5d1d7 100644
--- a/src/tools/moc/generator.cpp
+++ b/src/tools/moc/generator.cpp
@@ -671,11 +671,6 @@ void Generator::generateCode()
generateSignal(&cdef->signalList[signalindex], signalindex);
//
-// Generate QProperty forwarding API
-//
- generateQPropertyApi();
-
-//
// Generate plugin meta data
//
generatePluginMetaData();
@@ -1317,46 +1312,21 @@ void Generator::generateStaticMetacall()
prefix += p.inPrivateClass + "->";
}
- if (!p.qpropertyname.isEmpty() && p.stored != "true") {
- // nullptr checks needed.
- fprintf(out, " case %d:\n", propindex);
- if (p.gspec == PropertyDef::PointerSpec || p.gspec == PropertyDef::ReferenceSpec) {
- fprintf(out, " if (auto *source = %s%s)\n", prefix.constData(), p.qpropertyname.constData());
- fprintf(out, " _a[0] = const_cast<void*>(reinterpret_cast<const void*>(%ssource->value()));\n", p.gspec == PropertyDef::ReferenceSpec ? "&" : "");
- fprintf(out, " else\n");
- fprintf(out, " _a[0] = nullptr;\n");
- } else if (cdef->enumDeclarations.value(p.type, false)) {
- fprintf(out, " if (auto *source = %s%s)\n", prefix.constData(), p.qpropertyname.constData());
- fprintf(out, " *reinterpret_cast<int*>(_v) = QFlag(source->value()));\n");
- fprintf(out, " else\n");
- fprintf(out, " *reinterpret_cast<int*>(_v) = QFlag(%s())\n;", p.type.constData());
- } else if (!p.read.isEmpty()) {
- fprintf(out, " if (auto *source = %s%s)\n", prefix.constData(), p.qpropertyname.constData());
- fprintf(out, " *reinterpret_cast<%s*>(_v) = source->value();\n", p.type.constData());
- fprintf(out, " else\n");
- fprintf(out, " *reinterpret_cast<%s*>(_v) = %s()\n;", p.type.constData(), p.type.constData());
- } else {
- fprintf(out, " *reinterpret_cast< %s*>(_v) = %s%s;\n",
- p.type.constData(), prefix.constData(), p.member.constData());
- }
- fprintf(out, " break;\n");
- } else {
- if (p.gspec == PropertyDef::PointerSpec)
- fprintf(out, " case %d: _a[0] = const_cast<void*>(reinterpret_cast<const void*>(%s%s())); break;\n",
- propindex, prefix.constData(), p.read.constData());
- else if (p.gspec == PropertyDef::ReferenceSpec)
- fprintf(out, " case %d: _a[0] = const_cast<void*>(reinterpret_cast<const void*>(&%s%s())); break;\n",
- propindex, prefix.constData(), p.read.constData());
- else if (cdef->enumDeclarations.value(p.type, false))
- fprintf(out, " case %d: *reinterpret_cast<int*>(_v) = QFlag(%s%s()); break;\n",
- propindex, prefix.constData(), p.read.constData());
- else if (!p.read.isEmpty())
- fprintf(out, " case %d: *reinterpret_cast< %s*>(_v) = %s%s(); break;\n",
- propindex, p.type.constData(), prefix.constData(), p.read.constData());
- else
- fprintf(out, " case %d: *reinterpret_cast< %s*>(_v) = %s%s; break;\n",
- propindex, p.type.constData(), prefix.constData(), p.member.constData());
- }
+ if (p.gspec == PropertyDef::PointerSpec)
+ fprintf(out, " case %d: _a[0] = const_cast<void*>(reinterpret_cast<const void*>(%s%s())); break;\n",
+ propindex, prefix.constData(), p.read.constData());
+ else if (p.gspec == PropertyDef::ReferenceSpec)
+ fprintf(out, " case %d: _a[0] = const_cast<void*>(reinterpret_cast<const void*>(&%s%s())); break;\n",
+ propindex, prefix.constData(), p.read.constData());
+ else if (cdef->enumDeclarations.value(p.type, false))
+ fprintf(out, " case %d: *reinterpret_cast<int*>(_v) = QFlag(%s%s()); break;\n",
+ propindex, prefix.constData(), p.read.constData());
+ else if (!p.read.isEmpty())
+ fprintf(out, " case %d: *reinterpret_cast< %s*>(_v) = %s%s(); break;\n",
+ propindex, p.type.constData(), prefix.constData(), p.read.constData());
+ else
+ fprintf(out, " case %d: *reinterpret_cast< %s*>(_v) = %s%s; break;\n",
+ propindex, p.type.constData(), prefix.constData(), p.member.constData());
}
fprintf(out, " default: break;\n");
fprintf(out, " }\n");
@@ -1382,35 +1352,11 @@ void Generator::generateStaticMetacall()
prefix += p.inPrivateClass + "->";
}
if (cdef->enumDeclarations.value(p.type, false)) {
- if (!p.qpropertyname.isEmpty() && p.stored != "true") {
- fprintf(out, " case %d:\n", propindex);
- fprintf(out, " if (auto *destination = %s%s)\n", prefix.constData(), p.qpropertyname.constData());
- fprintf(out, " destination->setValue(QFlag(*reinterpret_cast<int*>(_v)));");
- fprintf(out, " break;");
- } else {
- fprintf(out, " case %d: %s%s(QFlag(*reinterpret_cast<int*>(_v))); break;\n",
- propindex, prefix.constData(), p.write.constData());
- }
+ fprintf(out, " case %d: %s%s(QFlag(*reinterpret_cast<int*>(_v))); break;\n",
+ propindex, prefix.constData(), p.write.constData());
} else if (!p.write.isEmpty()) {
- QByteArray optionalQPropertyOwner;
- if (p.isQPropertyWithNotifier) {
- optionalQPropertyOwner = "_t";
- if (p.inPrivateClass.size()) {
- optionalQPropertyOwner += "->";
- optionalQPropertyOwner += p.inPrivateClass;
- }
- optionalQPropertyOwner += ", ";
- }
-
- if (!p.qpropertyname.isEmpty() && p.stored != "true") {
- fprintf(out, " case %d:\n", propindex);
- fprintf(out, " if (auto *destination = %s%s)\n", prefix.constData(), p.qpropertyname.constData());
- fprintf(out, " destination->setValue(%s*reinterpret_cast<%s*>(_v));\n", optionalQPropertyOwner.constData(), p.type.constData());
- fprintf(out, " break;\n");
- } else {
- fprintf(out, " case %d: %s%s(%s*reinterpret_cast< %s*>(_v)); break;\n",
- propindex, prefix.constData(), p.write.constData(), optionalQPropertyOwner.constData(), p.type.constData());
- }
+ fprintf(out, " case %d: %s%s(*reinterpret_cast< %s*>(_v)); break;\n",
+ propindex, prefix.constData(), p.write.constData(), p.type.constData());
} else {
fprintf(out, " case %d:\n", propindex);
fprintf(out, " if (%s%s != *reinterpret_cast< %s*>(_v)) {\n",
@@ -1458,6 +1404,7 @@ void Generator::generateStaticMetacall()
}
fprintf(out, " }");
+#if 0
fprintf(out, " else ");
fprintf(out, "if (_c == QMetaObject::RegisterQPropertyObserver) {\n");
if (haveQProperties) {
@@ -1469,16 +1416,12 @@ void Generator::generateStaticMetacall()
if (!p.isQProperty)
continue;
QByteArray prefix = "_t->";
- if (p.inPrivateClass.size()) {
- prefix += p.inPrivateClass + "->";
- }
if (p.qpropertyname.isEmpty() || p.stored == "true") {
fprintf(out, " case %d: observer->setSource(%s%s); break;\n",
- propindex, prefix.constData(),
- p.qpropertyname.isEmpty() ? p.name.constData() : p.qpropertyname.constData());
+ propindex, prefix.constData(), p.bindingAccessor.constData());
} else {
fprintf(out, " case %d: if (auto *source = %s%s) observer->setSource(*source); break; \n",
- propindex, prefix.constData(), p.qpropertyname.constData());
+ propindex, prefix.constData(), p.bindingAccessor.constData());
}
}
fprintf(out, " default: break;\n");
@@ -1496,26 +1439,16 @@ void Generator::generateStaticMetacall()
if (!p.isQProperty)
continue;
QByteArray prefix = "_t->";
- QByteArray objectAccessor = "_t";
- if (p.inPrivateClass.size()) {
- prefix += p.inPrivateClass + "->";
- objectAccessor += "->";
- objectAccessor += p.inPrivateClass;
- }
- if (p.isQPropertyWithNotifier)
- objectAccessor += ", ";
- else
- objectAccessor.clear();
if (p.qpropertyname.isEmpty() || p.stored == "true") {
- fprintf(out, " case %d: %s%s.setBinding(%s*reinterpret_cast<QPropertyBinding<%s> *>(_a[0])); break;\n",
+ fprintf(out, " case %d: %s%s.setBinding(*reinterpret_cast<QPropertyBinding<%s> *>(_a[0])); break;\n",
propindex, prefix.constData(),
- p.qpropertyname.isEmpty() ? p.name.constData() : p.qpropertyname.constData(),
- objectAccessor.constData(), p.type.constData());
+ p.bindingAccessor.constData(),
+ p.type.constData());
} else {
- fprintf(out, " case %d: if (auto *source = %s%s) source->setBinding(%s*reinterpret_cast<QPropertyBinding<%s> *>(_a[0])); break;\n",
- propindex, prefix.constData(), p.qpropertyname.constData(),
- objectAccessor.constData(), p.type.constData());
+ fprintf(out, " case %d: if (auto *source = %s%s) source->setBinding(*reinterpret_cast<QPropertyBinding<%s> *>(_a[0])); break;\n",
+ propindex, prefix.constData(), p.bindingAccessor.constData(),
+ p.type.constData());
}
}
@@ -1523,7 +1456,7 @@ void Generator::generateStaticMetacall()
fprintf(out, " }\n");
}
fprintf(out, " }");
-
+#endif
fprintf(out, "\n#endif // QT_NO_PROPERTIES");
needElse = true;
}
@@ -1608,199 +1541,6 @@ 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 = Q_OFFSETOF(%s, %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);
- };
-
- const bool stored = (property.name == property.storage);
- const bool isNotifiedProperty = property.isNotifiedProperty;
-
- // 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);
- if (stored) {
- fprintf(out, " return thisPtr->%s->%s.value();\n", property.accessor.constData(), property.storage.constData());
- } else {
- fprintf(out, " if (auto *source = thisPtr->%s->%s)\n", property.accessor.constData(), property.storage.constData());
- fprintf(out, " return source->value();\n");
- fprintf(out, " else\n");
- fprintf(out, " return %s();\n", property.type.name.constData());
- }
- fprintf(out, "}\n");
-
- // property value setter
- fprintf(out, "\nvoid %s::_qt_property_api_%s::setValue(%s const &value)\n{\n",
- cdef->qualified.constData(),
- property.name.constData(),
- property.type.name.constData());
- printAccessor();
- if (stored) {
- if (isNotifiedProperty)
- fprintf(out, " thisPtr->%s->%s.setValue(thisPtr->%s, value);\n", property.accessor.constData(), property.storage.constData(), property.accessor.constData());
- else
- fprintf(out, " thisPtr->%s->%s.setValue(value);\n", property.accessor.constData(), property.storage.constData());
- } else {
- fprintf(out, " if (auto *target = thisPtr->%s->%s)\n", property.accessor.constData(), property.storage.constData());
- if (isNotifiedProperty)
- fprintf(out, " target->setValue(thisPtr->%s, value);\n", property.accessor.constData());
- else
- fprintf(out, " target->setValue(value);\n");
- }
- 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();
- if (stored) {
- if (isNotifiedProperty)
- fprintf(out, " thisPtr->%s->%s.setValue(thisPtr->%s, std::move(value));\n", property.accessor.constData(), property.storage.constData(), property.accessor.constData());
- else
- fprintf(out, " thisPtr->%s->%s.setValue(std::move(value));\n", property.accessor.constData(), property.storage.constData());
- } else {
- fprintf(out, " if (auto *target = thisPtr->%s->%s)\n", property.accessor.constData(), property.storage.constData());
- if (isNotifiedProperty)
- fprintf(out, " target->setValue(thisPtr->%s, std::move(value));\n", property.accessor.constData());
- else
- fprintf(out, " target->setValue(std::move(value));\n");
- }
- 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();
- if (stored) {
- if (isNotifiedProperty)
- fprintf(out, " return thisPtr->%s->%s.setBinding(thisPtr->%s, binding);\n", property.accessor.constData(), property.storage.constData(), property.accessor.constData());
- else
- fprintf(out, " return thisPtr->%s->%s.setBinding(binding);\n", property.accessor.constData(), property.storage.constData());
- } else {
- fprintf(out, " if (auto *target = thisPtr->%s->%s)\n", property.accessor.constData(), property.storage.constData());
- if (isNotifiedProperty)
- fprintf(out, " return target->setBinding(thisPtr->%s, binding);\n", property.accessor.constData());
- else
- fprintf(out, " return target->setBinding(binding);\n");
- fprintf(out, " else\n");
- fprintf(out, " return QPropertyBinding<%s>();\n", property.type.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();
- if (stored) {
- if (isNotifiedProperty)
- fprintf(out, " return thisPtr->%s->%s.setBinding(thisPtr->%s, std::move(binding));\n", property.accessor.constData(), property.storage.constData(), property.accessor.constData());
- else
- fprintf(out, " return thisPtr->%s->%s.setBinding(std::move(binding));\n", property.accessor.constData(), property.storage.constData());
- } else {
- fprintf(out, " if (auto *target = thisPtr->%s->%s)\n", property.accessor.constData(), property.storage.constData());
- if (isNotifiedProperty)
- fprintf(out, " return target->setBinding(thisPtr->%s, std::move(binding));\n", property.accessor.constData());
- else
- fprintf(out, " return target->setBinding(std::move(binding));\n");
- fprintf(out, " else\n");
- fprintf(out, " return QPropertyBinding<%s>();\n", property.type.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();
- if (stored) {
- if (isNotifiedProperty)
- fprintf(out, " return thisPtr->%s->%s.setBinding(thisPtr->%s, binding);\n", property.accessor.constData(), property.storage.constData(), property.accessor.constData());
- else
- fprintf(out, " return thisPtr->%s->%s.setBinding(binding);\n", property.accessor.constData(), property.storage.constData());
- } else {
- fprintf(out, " if (auto *target = thisPtr->%s->%s)\n", property.accessor.constData(), property.storage.constData());
- if (isNotifiedProperty)
- fprintf(out, " return target->setBinding(thisPtr->%s, binding);\n", property.accessor.constData());
- else
- fprintf(out, " return target->setBinding(binding);\n");
- fprintf(out, " else\n");
- fprintf(out, " return false;\n");
- }
-
- 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);
- if (stored) {
- fprintf(out, " return thisPtr->%s->%s.hasBinding();\n", property.accessor.constData(), property.storage.constData());
- } else {
- fprintf(out, " if (auto *source = thisPtr->%s->%s)\n", property.accessor.constData(), property.storage.constData());
- fprintf(out, " return source->hasBinding();\n");
- fprintf(out, " else\n");
- fprintf(out, " return false;\n");
- }
- 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);
- if (stored) {
- fprintf(out, " return thisPtr->%s->%s.binding();\n", property.accessor.constData(), property.storage.constData());
- } else {
- fprintf(out, " if (auto *source = thisPtr->%s->%s)\n", property.accessor.constData(), property.storage.constData());
- fprintf(out, " return source->binding();\n");
- fprintf(out, " else\n");
- fprintf(out, " return QPropertyBinding<%s>();\n", property.type.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();
- if (stored) {
- fprintf(out, " return thisPtr->%s->%s.takeBinding();\n", property.accessor.constData(), property.storage.constData());
- } else {
- fprintf(out, " if (auto *source = thisPtr->%s->%s)\n", property.accessor.constData(), property.storage.constData());
- fprintf(out, " return source->takeBinding();\n");
- fprintf(out, " else\n");
- fprintf(out, " return QPropertyBinding<%s>();\n", property.type.name.constData());
- }
- fprintf(out, "}\n");
-
- // property setter function
- fprintf(out, "\nvoid %s::%s(%s const& value)\n{\n",
- cdef->qualified.constData(),
- property.setter.constData(),
- property.type.name.constData());
- fprintf(out, " this->%s.setValue(value);\n", property.name.constData());
- fprintf(out, "}\n\n");
- }
-}
-
static CborError jsonValueToCbor(CborEncoder *parent, const QJsonValue &v);
static CborError jsonObjectToCbor(CborEncoder *parent, const QJsonObject &o)
{