aboutsummaryrefslogtreecommitdiffstats
path: root/tools
diff options
context:
space:
mode:
authorSami Shalayel <sami.shalayel@qt.io>2022-09-16 14:38:19 +0200
committerSami Shalayel <sami.shalayel@qt.io>2022-09-26 10:59:15 +0200
commit60ca8dae85de1bd0df4d549f237534c68d75091c (patch)
tree8d969586701491765b2c85431c52d31b87b8c93f /tools
parent4b7bd4dae38e0335b7b1045dae5a5a3875c22708 (diff)
qmltc: stop using QQmlListReference to append
Instead of using a QQmlListReference to append into lists, use directly the underlying QList<T*> for types compiled with qmltc and QQmlListProperty<T> for types not compiled with qmltc (e.g. types defined in c++). Add a test that tests the private c++ backed "data" property of QQuickItem and different kind of lists (QtObjects and HelloWorlds). Also, append multiple objects to QLists in one go. Fixes: QTBUG-104664 Change-Id: Id5ce6307a241c4c8a167feca677ba5e9b492bc07 Reviewed-by: Ulf Hermann <ulf.hermann@qt.io>
Diffstat (limited to 'tools')
-rw-r--r--tools/qmltc/qmltccompilerpieces.cpp16
1 files changed, 10 insertions, 6 deletions
diff --git a/tools/qmltc/qmltccompilerpieces.cpp b/tools/qmltc/qmltccompilerpieces.cpp
index eedec2f469..a53bb89796 100644
--- a/tools/qmltc/qmltccompilerpieces.cpp
+++ b/tools/qmltc/qmltccompilerpieces.cpp
@@ -92,17 +92,21 @@ void QmltcCodeGenerator::generate_assignToListProperty(
const bool populateLocalListProperty = qmlListVarName.isEmpty();
if (populateLocalListProperty) {
- qmlListVarName = u"listref_%1"_s.arg(p.propertyName());
- *block << u"QQmlListReference %1(%2, %3);"_s.arg(
- qmlListVarName, accessor,
- QQmlJSUtils::toLiteral(p.propertyName(), u"QByteArrayLiteral"));
- *block << QStringLiteral("Q_ASSERT(%1.canAppend());").arg(qmlListVarName);
+ auto [extensionPrologue, extensionAccessor, extensionEpilogue] =
+ QmltcCodeGenerator::wrap_extensionType(
+ type, p, QmltcCodeGenerator::wrap_privateClass(accessor, p));
+
+ qmlListVarName = u"listprop_%1"_s.arg(p.propertyName());
+ *block << u"QQmlListProperty<%1> %2;"_s.arg(p.type()->internalName(), qmlListVarName);
+ *block << extensionPrologue;
+ *block << u"%1 = %2->%3();"_s.arg(qmlListVarName, extensionAccessor, p.read());
+ *block << extensionEpilogue;
}
for (const QString &value : values) {
auto [prologue, wrappedValue, epilogue] =
QmltcCodeGenerator::wrap_mismatchingTypeConversion(p, value);
*block << prologue;
- *block << u"%1.append(%2);"_s.arg(qmlListVarName, wrappedValue);
+ *block << u"%1.append(std::addressof(%1), %2);"_s.arg(qmlListVarName, wrappedValue);
*block << epilogue;
}
}