summaryrefslogtreecommitdiffstats
path: root/src/tools/moc
diff options
context:
space:
mode:
authorSimon Hausmann <simon.hausmann@qt.io>2020-03-27 18:36:11 +0100
committerSimon Hausmann <simon.hausmann@qt.io>2020-04-08 11:26:39 +0200
commit5422fb79486a1818d6355d75f019fe63120a43d0 (patch)
treea4b95a12034097d2941983cb216dff64081321f5 /src/tools/moc
parent0bfbe10ff20f271cff0c0af6ca1fb1894bb48d60 (diff)
Allow declaring QProperty<> based Q_PROPERTYies with a notify signal
This requires mostly making moc a bit more permissive, which has the advantage that it also simplifies the code a little bit. The newly added test case demonstrates how to connect such a property with a change signal. One test case needed to be changed regarding the callback as the publicProperty member now has a (permanent) observer and therefore re-assigning the binding will re-evaluate it as the value might have changed. Change-Id: Ia7edcec432de830bdd4e07d943c5d4550c175ca4 Reviewed-by: Ulf Hermann <ulf.hermann@qt.io> Reviewed-by: Olivier Goffart (Woboq GmbH) <ogoffart@woboq.com>
Diffstat (limited to 'src/tools/moc')
-rw-r--r--src/tools/moc/moc.cpp43
1 files changed, 17 insertions, 26 deletions
diff --git a/src/tools/moc/moc.cpp b/src/tools/moc/moc.cpp
index 56db54b457..9825e2244f 100644
--- a/src/tools/moc/moc.cpp
+++ b/src/tools/moc/moc.cpp
@@ -1266,16 +1266,6 @@ void Moc::createPropertyDef(PropertyDef &propDef)
next();
propDef.name = lexem();
- // Could be Q_PROPERTY(type field) and later QProperty<int> field; -- to be resolved later.
- if (lookup() == RPAREN) {
- propDef.isQProperty = true;
- propDef.designable = propDef.scriptable = propDef.stored = "true";
- propDef.user = "false";
- propDef.read = propDef.name + ".value";
- propDef.write = propDef.name + ".setValue";
- return;
- }
-
while (test(IDENTIFIER)) {
const QByteArray l = lexem();
if (l[0] == 'C' && l == "CONSTANT") {
@@ -1806,31 +1796,32 @@ void Moc::checkProperties(ClassDef *cdef)
QSet<QByteArray> definedProperties;
for (int i = 0; i < cdef->propertyList.count(); ++i) {
PropertyDef &p = cdef->propertyList[i];
- if (p.read.isEmpty() && p.member.isEmpty())
- continue;
if (definedProperties.contains(p.name)) {
QByteArray msg = "The property '" + p.name + "' is defined multiple times in class " + cdef->classname + ".";
warning(msg.constData());
}
definedProperties.insert(p.name);
- const auto skipProperty = [&](const QByteArray &msg) {
- const int rewind = index;
- if (p.location >= 0)
- index = p.location;
- warning(msg.constData());
- index = rewind;
- cdef->propertyList.removeAt(i);
- --i;
- };
-
- if (p.isQProperty) {
+ if (p.read.isEmpty() && p.member.isEmpty()) {
if (!cdef->qPropertyMembers.contains(p.name)) {
+ 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.";
- skipProperty(msg);
- break;
+ ", 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;
}
+ p.read = p.name + ".value";
+ p.write = p.name + ".setValue";
+ p.isQProperty = true;
+ p.designable = p.scriptable = p.stored = "true";
+ p.user = "false";
}
for (int j = 0; j < cdef->publicList.count(); ++j) {