diff options
author | Sami Shalayel <sami.shalayel@qt.io> | 2022-09-16 14:38:19 +0200 |
---|---|---|
committer | Sami Shalayel <sami.shalayel@qt.io> | 2022-09-26 10:59:15 +0200 |
commit | 60ca8dae85de1bd0df4d549f237534c68d75091c (patch) | |
tree | 8d969586701491765b2c85431c52d31b87b8c93f /tools | |
parent | 4b7bd4dae38e0335b7b1045dae5a5a3875c22708 (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.cpp | 16 |
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; } } |