summaryrefslogtreecommitdiffstats
path: root/src/tools/moc
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
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')
-rw-r--r--src/tools/moc/generator.cpp318
-rw-r--r--src/tools/moc/generator.h1
-rw-r--r--src/tools/moc/keywords.cpp61
-rw-r--r--src/tools/moc/moc.cpp157
-rw-r--r--src/tools/moc/moc.h8
-rw-r--r--src/tools/moc/parser.h1
-rw-r--r--src/tools/moc/token.h1
-rw-r--r--src/tools/moc/util/generate_keywords.cpp1
8 files changed, 85 insertions, 463 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)
{
diff --git a/src/tools/moc/generator.h b/src/tools/moc/generator.h
index a9bf229c71..35128cb543 100644
--- a/src/tools/moc/generator.h
+++ b/src/tools/moc/generator.h
@@ -63,7 +63,6 @@ private:
void generateMetacall();
void generateStaticMetacall();
void generateSignal(FunctionDef *def, int index);
- void generateQPropertyApi();
void generatePluginMetaData();
QMultiMap<QByteArray, int> automaticPropertyMetaTypesHelper();
QMap<int, QMultiMap<QByteArray, int>>
diff --git a/src/tools/moc/keywords.cpp b/src/tools/moc/keywords.cpp
index 6a56d2cea5..cc7d747f5b 100644
--- a/src/tools/moc/keywords.cpp
+++ b/src/tools/moc/keywords.cpp
@@ -30,12 +30,12 @@
// DO NOT EDIT.
static const short keyword_trans[][128] = {
- {0,0,0,0,0,0,0,0,0,588,585,0,0,0,0,0,
+ {0,0,0,0,0,0,0,0,0,579,576,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 588,252,586,589,8,38,239,587,25,26,236,234,30,235,27,237,
+ 579,252,577,580,8,38,239,578,25,26,236,234,30,235,27,237,
22,22,22,22,22,22,22,22,22,22,34,41,23,39,24,43,
0,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,
- 8,21,8,8,8,8,8,8,8,8,8,31,591,32,238,8,
+ 8,21,8,8,8,8,8,8,8,8,8,31,582,32,238,8,
0,1,2,3,4,5,6,7,8,9,8,8,10,11,12,13,
14,8,15,16,17,18,19,20,8,8,8,36,245,37,248,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
@@ -177,7 +177,7 @@ static const short keyword_trans[][128] = {
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,42,0,0,0,28,0,
- 594,594,594,594,594,594,594,594,594,594,0,0,0,0,0,0,
+ 585,585,585,585,585,585,585,585,585,585,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
@@ -336,7 +336,7 @@ static const short keyword_trans[][128] = {
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,593,0,0,0,0,592,
+ 0,0,0,0,0,0,0,0,0,0,584,0,0,0,0,583,
0,0,0,0,0,0,0,0,0,0,0,0,0,258,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
@@ -378,8 +378,8 @@ static const short keyword_trans[][128] = {
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,475,424,408,416,380,0,484,0,0,0,574,364,358,
- 386,0,566,472,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,475,424,408,416,380,0,484,0,0,0,565,364,358,
+ 386,0,557,472,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
@@ -443,7 +443,7 @@ static const short keyword_trans[][128] = {
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 549,557,0,517,0,0,0,0,0,0,0,0,0,0,0,0,
+ 549,0,0,517,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}
};
@@ -1013,39 +1013,30 @@ static const struct
{CHARACTER, 0, 84, 555, CHARACTER},
{CHARACTER, 0, 89, 556, CHARACTER},
{Q_PRIVATE_PROPERTY_TOKEN, 0, 0, 0, CHARACTER},
- {CHARACTER, 0, 80, 558, CHARACTER},
- {CHARACTER, 0, 82, 559, CHARACTER},
- {CHARACTER, 0, 79, 560, CHARACTER},
- {CHARACTER, 0, 80, 561, CHARACTER},
- {CHARACTER, 0, 69, 562, CHARACTER},
- {CHARACTER, 0, 82, 563, CHARACTER},
- {CHARACTER, 0, 84, 564, CHARACTER},
- {CHARACTER, 0, 89, 565, CHARACTER},
- {Q_PRIVATE_QPROPERTY_TOKEN, 0, 0, 0, CHARACTER},
- {CHARACTER, 0, 69, 567, CHARACTER},
- {CHARACTER, 0, 86, 568, CHARACTER},
- {CHARACTER, 0, 73, 569, CHARACTER},
- {CHARACTER, 0, 83, 570, CHARACTER},
- {CHARACTER, 0, 73, 571, CHARACTER},
- {CHARACTER, 0, 79, 572, CHARACTER},
- {CHARACTER, 0, 78, 573, CHARACTER},
+ {CHARACTER, 0, 69, 558, CHARACTER},
+ {CHARACTER, 0, 86, 559, CHARACTER},
+ {CHARACTER, 0, 73, 560, CHARACTER},
+ {CHARACTER, 0, 83, 561, CHARACTER},
+ {CHARACTER, 0, 73, 562, CHARACTER},
+ {CHARACTER, 0, 79, 563, CHARACTER},
+ {CHARACTER, 0, 78, 564, CHARACTER},
{Q_REVISION_TOKEN, 0, 0, 0, CHARACTER},
- {CHARACTER, 0, 79, 575, CHARACTER},
- {CHARACTER, 0, 67, 576, CHARACTER},
- {CHARACTER, 0, 95, 577, CHARACTER},
- {CHARACTER, 0, 73, 578, CHARACTER},
- {CHARACTER, 0, 78, 579, CHARACTER},
- {CHARACTER, 0, 67, 580, CHARACTER},
- {CHARACTER, 0, 76, 581, CHARACTER},
- {CHARACTER, 0, 85, 582, CHARACTER},
- {CHARACTER, 0, 68, 583, CHARACTER},
- {CHARACTER, 0, 69, 584, CHARACTER},
+ {CHARACTER, 0, 79, 566, CHARACTER},
+ {CHARACTER, 0, 67, 567, CHARACTER},
+ {CHARACTER, 0, 95, 568, CHARACTER},
+ {CHARACTER, 0, 73, 569, CHARACTER},
+ {CHARACTER, 0, 78, 570, CHARACTER},
+ {CHARACTER, 0, 67, 571, CHARACTER},
+ {CHARACTER, 0, 76, 572, CHARACTER},
+ {CHARACTER, 0, 85, 573, CHARACTER},
+ {CHARACTER, 0, 68, 574, CHARACTER},
+ {CHARACTER, 0, 69, 575, CHARACTER},
{Q_MOC_INCLUDE_TOKEN, 0, 0, 0, CHARACTER},
{NEWLINE, 0, 0, 0, NOTOKEN},
{QUOTE, 0, 0, 0, NOTOKEN},
{SINGLEQUOTE, 0, 0, 0, NOTOKEN},
{WHITESPACE, 0, 0, 0, NOTOKEN},
- {HASH, 0, 35, 590, HASH},
+ {HASH, 0, 35, 581, HASH},
{PP_HASHHASH, 0, 0, 0, NOTOKEN},
{BACKSLASH, 0, 0, 0, NOTOKEN},
{CPP_COMMENT, 0, 0, 0, NOTOKEN},
diff --git a/src/tools/moc/moc.cpp b/src/tools/moc/moc.cpp
index 84eb751bee..1a20d32d7c 100644
--- a/src/tools/moc/moc.cpp
+++ b/src/tools/moc/moc.cpp
@@ -576,35 +576,6 @@ bool Moc::parseMaybeFunction(const ClassDef *cdef, FunctionDef *def)
}
-// Try to parse QProperty<MyType> propertName; members
-bool Moc::parseMaybeQProperty(ClassDef *def)
-{
- if (!test(IDENTIFIER))
- return false;
-
- bool hasNotifier = false;
- if (lexem() == "QNotifiedProperty") {
- hasNotifier = true;
- } else if (lexem() != "QProperty") {
- return false;
- }
-
- if (!test(LANGLE))
- return false;
-
- until(RANGLE);
-
- next();
- const auto propName = lexem();
-
- if (!test(SEMIC))
- return false;
-
- def->qPropertyMembersMaybeWithNotifier.insert(propName, hasNotifier);
-
- return true;
-}
-
void Moc::parse()
{
QList<NamespaceDef> namespaceList;
@@ -893,9 +864,6 @@ void Moc::parse()
case Q_PRIVATE_PROPERTY_TOKEN:
parsePrivateProperty(&def);
break;
- case Q_PRIVATE_QPROPERTY_TOKEN:
- parsePrivateQProperty(&def);
- break;
case ENUM: {
EnumDef enumDef;
if (parseEnum(&enumDef))
@@ -953,9 +921,7 @@ void Moc::parse()
}
}
} else {
- index = rewind - 1;
- if (!parseMaybeQProperty(&def))
- index = rewind;
+ index = rewind;
}
}
}
@@ -1055,8 +1021,8 @@ static QByteArrayList requiredQtContainers(const QList<ClassDef> &classes)
const QByteArray pattern = candidate + '<';
for (const auto &c : classes) {
- if (!c.privateQProperties.isEmpty())
- needsQProperty = true;
+ for (const auto &p : c.propertyList)
+ needsQProperty |= p.isQProperty;
if (any_type_contains(c.propertyList, pattern) ||
any_arg_contains(c.slotList, pattern) ||
any_arg_contains(c.signalList, pattern) ||
@@ -1385,19 +1351,8 @@ void Moc::parsePropertyAttributes(PropertyDef &propDef)
checkIsFunction(propDef.designable, "DESIGNABLE");
break;
case 'N': if (l != "NOTIFY") error(2);
- if (v == "false") {
- if (!propDef.isQProperty)
- error(1);
- propDef.isQPropertyWithNotifier = false;
- break;
- } else if (v == "true") {
- if (!propDef.isQProperty)
- error(1);
- break;
- } else {
- propDef.notify = v;
- break;
- }
+ propDef.notify = v;
+ break;
case 'U': if (l != "USER") error(2);
propDef.user = v + v2;
checkIsFunction(propDef.user, "USER");
@@ -1494,19 +1449,19 @@ void Moc::parsePluginData(ClassDef *def)
QByteArray Moc::parsePropertyAccessor()
{
- next(IDENTIFIER);
- QByteArray accessor = lexem();
- while (test(SCOPE)) {
- accessor += lexem();
- next(IDENTIFIER);
+ int nesting = 0;
+ QByteArray accessor;
+ while (1) {
+ Token t = peek();
+ if (!nesting && (t == RPAREN || t == COMMA))
+ break;
+ t = next();
+ if (t == LPAREN)
+ ++nesting;
+ if (t == RPAREN)
+ --nesting;
accessor += lexem();
}
- // also allow void functions
- if (test(LPAREN)) {
- next(RPAREN);
- accessor += "()";
- }
-
return accessor;
}
@@ -1523,48 +1478,6 @@ void Moc::parsePrivateProperty(ClassDef *def)
def->propertyList += propDef;
}
-void Moc::parsePrivateQProperty(ClassDef *def)
-{
- next(LPAREN);
- const QByteArray accessor = parsePropertyAccessor();
- next(COMMA);
- const Type type = parseType();
- next(COMMA);
- next(IDENTIFIER);
- const QByteArray name = lexem();
- next(COMMA);
- next(IDENTIFIER);
- const QByteArray setter = lexem();
-
- PropertyDef propDef;
- propDef.name = name;
- propDef.type = type.name;
- propDef.isQProperty = true;
- propDef.isQPropertyWithNotifier = true;
- propDef.inPrivateClass = accessor;
- propDef.designable = propDef.scriptable = propDef.stored = "true";
- propDef.user = "false";
-
- if (test(COMMA))
- parsePropertyAttributes(propDef);
-
- const bool stored = propDef.stored == "true";
- propDef.qpropertyname = stored ? name : (name + "()");
-
- def->privateQProperties += PrivateQPropertyDef {
- type, name, setter, accessor, propDef.qpropertyname, propDef.isQPropertyWithNotifier
- };
-
- if (propDef.read.isEmpty())
- propDef.read = propDef.qpropertyname + (stored ? ".value" : "->value");
- if (propDef.write.isEmpty())
- propDef.write = propDef.qpropertyname + (stored ? ".setValue" : "->setValue");
-
- next(RPAREN);
-
- def->propertyList += propDef;
-}
-
void Moc::parseEnumOrFlag(BaseDef *def, bool isFlag)
{
next(LPAREN);
@@ -1895,33 +1808,19 @@ void Moc::checkProperties(ClassDef *cdef)
warning(msg.constData());
}
- if (p.read.isEmpty() && p.member.isEmpty()) {
-
- auto qPropertyMemberIt = cdef->qPropertyMembersMaybeWithNotifier.constFind(p.name);
- const bool knownQPropertyMember = qPropertyMemberIt != cdef->qPropertyMembersMaybeWithNotifier.constEnd();
- if (!knownQPropertyMember && !p.isQProperty) {
- const int rewind = index;
- if (p.location >= 0)
- index = p.location;
- QByteArray msg = "Property declaration " + p.name + " has neither an associated QProperty<> member"
- ", nor a READ accessor function nor an associated MEMBER variable. The property will be invalid.";
- warning(msg.constData());
- index = rewind;
- if (p.write.isEmpty()) {
- cdef->propertyList.removeAt(i);
- --i;
- }
- continue;
+ if (p.read.isEmpty() && p.member.isEmpty() && !p.isQProperty) {
+ const int rewind = index;
+ if (p.location >= 0)
+ index = p.location;
+ QByteArray msg = "Property declaration " + p.name + " has neither an associated QProperty<> member"
+ ", nor a READ accessor function nor an associated MEMBER variable. The property will be invalid.";
+ warning(msg.constData());
+ index = rewind;
+ if (p.write.isEmpty()) {
+ cdef->propertyList.removeAt(i);
+ --i;
}
- const bool stored = p.stored == "true";
- p.qpropertyname = stored ? p.name : (p.name + "()");
- p.read = p.qpropertyname + (stored ? ".value" : "->value");
- p.write = p.qpropertyname + (stored ? ".setValue" : "->setValue");;
- p.isQProperty = true;
- const bool hasNotifier = knownQPropertyMember && qPropertyMemberIt.value();
- p.isQPropertyWithNotifier = hasNotifier;
- p.designable = p.scriptable = p.stored = "true";
- p.user = "false";
+ continue;
}
for (int j = 0; j < cdef->publicList.count(); ++j) {
diff --git a/src/tools/moc/moc.h b/src/tools/moc/moc.h
index 487e04e081..def5a8e82d 100644
--- a/src/tools/moc/moc.h
+++ b/src/tools/moc/moc.h
@@ -132,7 +132,7 @@ struct PropertyDef
return (s == write);
}
- QByteArray name, type, member, read, write, reset, designable, scriptable, stored, user, notify, inPrivateClass, qpropertyname;
+ QByteArray name, type, member, read, write, reset, designable, scriptable, stored, user, notify, inPrivateClass;
int notifyId = -1; // -1 means no notifyId, >= 0 means signal defined in this class, < -1 means signal not defined in this class
enum Specification { ValueSpec, ReferenceSpec, PointerSpec };
Specification gspec = ValueSpec;
@@ -141,7 +141,6 @@ struct PropertyDef
bool final = false;
bool required = false;
bool isQProperty = false;
- bool isQPropertyWithNotifier = false;
int location = -1; // token index, used for error reporting
@@ -156,7 +155,6 @@ struct PrivateQPropertyDef
QByteArray setter;
QByteArray accessor;
QByteArray storage;
- bool isNotifiedProperty;
};
Q_DECLARE_TYPEINFO(PrivateQPropertyDef, Q_MOVABLE_TYPE);
@@ -202,8 +200,6 @@ struct ClassDef : BaseDef {
QList<FunctionDef> signalList, slotList, methodList, publicList;
QList<QByteArray> nonClassSignalList;
QList<PropertyDef> propertyList;
- QList<PrivateQPropertyDef> privateQProperties;
- QHash<QByteArray, bool> qPropertyMembersMaybeWithNotifier;
int revisionedMethods = 0;
bool hasQObject = false;
@@ -262,7 +258,6 @@ public:
bool parseFunction(FunctionDef *def, bool inMacro = false);
bool parseMaybeFunction(const ClassDef *cdef, FunctionDef *def);
- bool parseMaybeQProperty(ClassDef *def);
void parseSlots(ClassDef *def, FunctionDef::Access access);
void parseSignals(ClassDef *def);
@@ -280,7 +275,6 @@ public:
void parseSlotInPrivate(ClassDef *def, FunctionDef::Access access);
QByteArray parsePropertyAccessor();
void parsePrivateProperty(ClassDef *def);
- void parsePrivateQProperty(ClassDef *def);
void parseFunctionArguments(FunctionDef *def);
diff --git a/src/tools/moc/parser.h b/src/tools/moc/parser.h
index 63f4cf0d9a..f014d7e6b5 100644
--- a/src/tools/moc/parser.h
+++ b/src/tools/moc/parser.h
@@ -57,6 +57,7 @@ public:
inline bool hasNext() const { return (index < symbols.size()); }
inline Token next() { if (index >= symbols.size()) return NOTOKEN; return symbols.at(index++).token; }
+ inline Token peek() { if (index >= symbols.size()) return NOTOKEN; return symbols.at(index).token; }
bool test(Token);
void next(Token);
void next(Token, const char *msg);
diff --git a/src/tools/moc/token.h b/src/tools/moc/token.h
index 0b6e9c4f7c..c11ec6a38c 100644
--- a/src/tools/moc/token.h
+++ b/src/tools/moc/token.h
@@ -178,7 +178,6 @@ QT_BEGIN_NAMESPACE
F(Q_INVOKABLE_TOKEN) \
F(Q_SCRIPTABLE_TOKEN) \
F(Q_PRIVATE_PROPERTY_TOKEN) \
- F(Q_PRIVATE_QPROPERTY_TOKEN) \
F(Q_REVISION_TOKEN) \
F(Q_MOC_INCLUDE_TOKEN) \
F(SPECIAL_TREATMENT_MARK) \
diff --git a/src/tools/moc/util/generate_keywords.cpp b/src/tools/moc/util/generate_keywords.cpp
index 02a36c5000..c2cfe37fab 100644
--- a/src/tools/moc/util/generate_keywords.cpp
+++ b/src/tools/moc/util/generate_keywords.cpp
@@ -242,7 +242,6 @@ static const Keyword keywords[] = {
{ "Q_SLOT", "Q_SLOT_TOKEN" },
{ "Q_SCRIPTABLE", "Q_SCRIPTABLE_TOKEN" },
{ "Q_PRIVATE_PROPERTY", "Q_PRIVATE_PROPERTY_TOKEN" },
- { "Q_PRIVATE_QPROPERTY", "Q_PRIVATE_QPROPERTY_TOKEN" },
{ "Q_REVISION", "Q_REVISION_TOKEN" },
{ "Q_MOC_INCLUDE", "Q_MOC_INCLUDE_TOKEN" },
{ "\n", "NEWLINE" },