summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorFabian Kosmale <fabian.kosmale@qt.io>2020-07-13 15:20:46 +0200
committerFabian Kosmale <fabian.kosmale@qt.io>2020-07-14 17:06:46 +0200
commit8cdaeb26552313e7b9d67fa062a3d9ff597c2e06 (patch)
tree7ba18ecdb22417bb38c756f5379c6dd991b5000a /src
parentbb6a73260ec8272647265f42180963604ad0f755 (diff)
moc: allow wrapper generation for QProperty in pimpl class
Previously, only QNotifiedProperty was supported. As moc cannot determine by itself whether the backing property is a QProperty or a QNotifiedProperty, allow NOTIFY false to indicate that it is a plain QProperty. For symmetry, NOTIFY true is also allowed and means that the backing property is a QNotifiedProperty. Change-Id: I66f3105c976ef084198ce8658bc07499a3cb1cd8 Reviewed-by: Ulf Hermann <ulf.hermann@qt.io>
Diffstat (limited to 'src')
-rw-r--r--src/tools/moc/generator.cpp51
-rw-r--r--src/tools/moc/moc.cpp17
-rw-r--r--src/tools/moc/moc.h1
3 files changed, 56 insertions, 13 deletions
diff --git a/src/tools/moc/generator.cpp b/src/tools/moc/generator.cpp
index dda022050c..1853d9df52 100644
--- a/src/tools/moc/generator.cpp
+++ b/src/tools/moc/generator.cpp
@@ -1606,6 +1606,7 @@ void Generator::generateQPropertyApi()
};
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",
@@ -1630,10 +1631,16 @@ void Generator::generateQPropertyApi()
property.type.name.constData());
printAccessor();
if (stored) {
- fprintf(out, " thisPtr->%s->%s.setValue(thisPtr->%s, value);\n", property.accessor.constData(), property.storage.constData(), property.accessor.constData());
+ 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());
- fprintf(out, " target->setValue(thisPtr->%s, value);\n", property.accessor.constData());
+ if (isNotifiedProperty)
+ fprintf(out, " target->setValue(thisPtr->%s, value);\n", property.accessor.constData());
+ else
+ fprintf(out, " target->setValue(value);\n");
}
fprintf(out, "}\n");
@@ -1644,10 +1651,16 @@ void Generator::generateQPropertyApi()
property.type.name.constData());
printAccessor();
if (stored) {
- fprintf(out, " thisPtr->%s->%s.setValue(thisPtr->%s, std::move(value));\n", property.accessor.constData(), property.storage.constData(), property.accessor.constData());
+ 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());
- fprintf(out, " target->setValue(thisPtr->%s, std::move(value));\n", property.accessor.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");
@@ -1659,10 +1672,16 @@ void Generator::generateQPropertyApi()
property.type.name.constData());
printAccessor();
if (stored) {
- fprintf(out, " return thisPtr->%s->%s.setBinding(thisPtr->%s, binding);\n", property.accessor.constData(), property.storage.constData(), property.accessor.constData());
+ 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());
- fprintf(out, " return target->setBinding(thisPtr->%s, binding);\n", property.accessor.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());
}
@@ -1676,10 +1695,16 @@ void Generator::generateQPropertyApi()
property.type.name.constData());
printAccessor();
if (stored) {
- fprintf(out, " return thisPtr->%s->%s.setBinding(thisPtr->%s, std::move(binding));\n", property.accessor.constData(), property.storage.constData(), property.accessor.constData());
+ 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());
- fprintf(out, " return target->setBinding(thisPtr->%s, std::move(binding));\n", property.accessor.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());
}
@@ -1691,10 +1716,16 @@ void Generator::generateQPropertyApi()
property.name.constData());
printAccessor();
if (stored) {
- fprintf(out, " return thisPtr->%s->%s.setBinding(thisPtr->%s, binding);\n", property.accessor.constData(), property.storage.constData(), property.accessor.constData());
+ 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());
- fprintf(out, " return target->setBinding(thisPtr->%s, binding);\n", property.accessor.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");
}
diff --git a/src/tools/moc/moc.cpp b/src/tools/moc/moc.cpp
index 6acabbf2ce..ad9c684541 100644
--- a/src/tools/moc/moc.cpp
+++ b/src/tools/moc/moc.cpp
@@ -1387,8 +1387,19 @@ void Moc::parsePropertyAttributes(PropertyDef &propDef)
checkIsFunction(propDef.designable, "DESIGNABLE");
break;
case 'N': if (l != "NOTIFY") error(2);
- propDef.notify = v;
- break;
+ 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;
+ }
case 'U': if (l != "USER") error(2);
propDef.user = v + v2;
checkIsFunction(propDef.user, "USER");
@@ -1543,7 +1554,7 @@ void Moc::parsePrivateQProperty(ClassDef *def)
propDef.qpropertyname = stored ? name : (name + "()");
def->privateQProperties += PrivateQPropertyDef {
- type, name, setter, accessor, propDef.qpropertyname
+ type, name, setter, accessor, propDef.qpropertyname, propDef.isQPropertyWithNotifier
};
if (propDef.read.isEmpty())
diff --git a/src/tools/moc/moc.h b/src/tools/moc/moc.h
index b4bb105601..487e04e081 100644
--- a/src/tools/moc/moc.h
+++ b/src/tools/moc/moc.h
@@ -156,6 +156,7 @@ struct PrivateQPropertyDef
QByteArray setter;
QByteArray accessor;
QByteArray storage;
+ bool isNotifiedProperty;
};
Q_DECLARE_TYPEINFO(PrivateQPropertyDef, Q_MOVABLE_TYPE);