diff options
Diffstat (limited to 'src/tools')
-rw-r--r-- | src/tools/moc/generator.cpp | 318 | ||||
-rw-r--r-- | src/tools/moc/generator.h | 1 | ||||
-rw-r--r-- | src/tools/moc/keywords.cpp | 61 | ||||
-rw-r--r-- | src/tools/moc/moc.cpp | 157 | ||||
-rw-r--r-- | src/tools/moc/moc.h | 8 | ||||
-rw-r--r-- | src/tools/moc/parser.h | 1 | ||||
-rw-r--r-- | src/tools/moc/token.h | 1 | ||||
-rw-r--r-- | src/tools/moc/util/generate_keywords.cpp | 1 |
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" }, |