diff options
author | Andrei Golubev <andrei.golubev@qt.io> | 2022-04-14 11:07:19 +0200 |
---|---|---|
committer | Andrei Golubev <andrei.golubev@qt.io> | 2022-04-28 09:43:36 +0200 |
commit | e98faf1df401268dc6966b39963547a4de6f9171 (patch) | |
tree | 949e89e7c8e2e8cd4156b7d2ab6a51617daf9936 /tools | |
parent | c1d5fe306505a3201b7f6f04ebb42e7ee00ff94d (diff) |
qmltc: Support setting Gradient property of Rectangle
Fixes: QTBUG-102560
Pick-to: 6.3
Change-Id: I7c339d2807a723f38e18e06b944362449d89ad7a
Reviewed-by: Ulf Hermann <ulf.hermann@qt.io>
Diffstat (limited to 'tools')
-rw-r--r-- | tools/qmltc/prototype/codegenerator.cpp | 14 | ||||
-rw-r--r-- | tools/qmltc/qmltccompilerpieces.cpp | 18 | ||||
-rw-r--r-- | tools/qmltc/qmltccompilerpieces.h | 3 |
3 files changed, 24 insertions, 11 deletions
diff --git a/tools/qmltc/prototype/codegenerator.cpp b/tools/qmltc/prototype/codegenerator.cpp index 122528607a..223b6e7691 100644 --- a/tools/qmltc/prototype/codegenerator.cpp +++ b/tools/qmltc/prototype/codegenerator.cpp @@ -174,11 +174,10 @@ CodeGenerator::toOrderedSequence(typename QmlIR::PoolList<QmlIR::Binding>::Itera static QStringList generate_assignToSpecialAlias(const QQmlJSScope::ConstPtr &type, const QString &propertyName, const QQmlJSMetaProperty &p, const QString &value, - const QString &accessor, bool constructQVariant) + const QString &accessor) { Q_UNUSED(type); Q_UNUSED(propertyName); - Q_UNUSED(constructQVariant); Q_ASSERT(p.isValid()); Q_ASSERT(!p.isList()); // NB: this code does not handle list properties @@ -595,7 +594,7 @@ void CodeGenerator::compileBinding(QmltcType ¤t, const QmlIR::Binding &bin } const auto addPropertyLine = [&](const QString &propertyName, const QQmlJSMetaProperty &p, - const QString &value, bool constructQVariant = false) { + const QString &value, bool constructFromQObject = false) { // TODO: there mustn't be this special case. instead, alias resolution // must be done in QQmlJSImportVisitor subclass, that would handle this // mess (see resolveValidateOrSkipAlias() in qml2cppdefaultpasses.cpp) @@ -604,11 +603,12 @@ void CodeGenerator::compileBinding(QmltcType ¤t, const QmlIR::Binding &bin + object.type->internalName() + u"' which is a QML type compiled to C++. The assignment is special" + u"in this case"; - current.endInit.body += generate_assignToSpecialAlias( - object.type, propertyName, p, value, accessor.name, constructQVariant); + current.endInit.body += generate_assignToSpecialAlias(object.type, propertyName, p, + value, accessor.name); } else { QmltcCodeGenerator::generate_assignToProperty(¤t.endInit.body, object.type, p, - value, accessor.name, constructQVariant); + value, accessor.name, + constructFromQObject); } }; @@ -728,7 +728,7 @@ void CodeGenerator::compileBinding(QmltcType ¤t, const QmlIR::Binding &bin const QString refName = u"listref_" + propertyName; current.endInit.body << refName + u".append(" + value + u");"; } else { - addPropertyLine(propertyName, p, value, /* through QVariant = */ true); + addPropertyLine(propertyName, p, value, /* fromQObject = */ true); } }; diff --git a/tools/qmltc/qmltccompilerpieces.cpp b/tools/qmltc/qmltccompilerpieces.cpp index beb1328d31..35e4e49295 100644 --- a/tools/qmltc/qmltccompilerpieces.cpp +++ b/tools/qmltc/qmltccompilerpieces.cpp @@ -38,7 +38,7 @@ void QmltcCodeGenerator::generate_assignToProperty(QStringList *block, const QQmlJSScope::ConstPtr &type, const QQmlJSMetaProperty &p, const QString &value, const QString &accessor, - bool constructQVariant) + bool constructFromQObject) { Q_ASSERT(block); Q_ASSERT(p.isValid()); @@ -49,7 +49,11 @@ void QmltcCodeGenerator::generate_assignToProperty(QStringList *block, if (type->hasOwnProperty(p.propertyName())) { Q_ASSERT(!p.isPrivate()); // this object is compiled, so just assignment should work fine - *block << u"%1->m_%2 = %3;"_qs.arg(accessor, propertyName, value); + auto [prologue, wrappedValue, epilogue] = + QmltcCodeGenerator::wrap_mismatchingTypeConversion(p, value); + *block += prologue; + *block << u"%1->m_%2 = %3;"_qs.arg(accessor, propertyName, wrappedValue); + *block += epilogue; } else if (QString propertySetter = p.write(); !propertySetter.isEmpty()) { // there's a WRITE function auto [prologue, wrappedValue, epilogue] = @@ -62,7 +66,7 @@ void QmltcCodeGenerator::generate_assignToProperty(QStringList *block, // this property is weird, fallback to `setProperty` *block << u"{ // couldn't find property setter, so using QObject::setProperty()"_qs; QString val = value; - if (constructQVariant) { + if (constructFromQObject) { const QString variantName = u"var_" + propertyName; *block << u"QVariant " + variantName + u";"; *block << variantName + u".setValue(" + val + u");"; @@ -168,6 +172,14 @@ QmltcCodeGenerator::wrap_mismatchingTypeConversion(const QQmlJSMetaProperty &p, prologue << variantName + u".setValue(" + value + u");"; epilogue << u"}"_qs; value = u"std::move(" + variantName + u")"; + } else if (isDerivedFromBuiltin(propType, u"QJSValue"_qs)) { + const QString jsvalueName = u"jsvalue_" + p.propertyName(); + prologue << u"{ // accepts QJSValue"_qs; + // Note: do not assume we have the engine, acquire it from `this` + prologue << u"auto e = qmlEngine(this);"_qs; + prologue << u"QJSValue " + jsvalueName + u" = e->toScriptValue(" + value + u");"; + epilogue << u"}"_qs; + value = u"std::move(" + jsvalueName + u")"; } return { prologue, value, epilogue }; } diff --git a/tools/qmltc/qmltccompilerpieces.h b/tools/qmltc/qmltccompilerpieces.h index e65807437e..a081122b33 100644 --- a/tools/qmltc/qmltccompilerpieces.h +++ b/tools/qmltc/qmltccompilerpieces.h @@ -76,7 +76,8 @@ struct QmltcCodeGenerator static void generate_assignToProperty(QStringList *block, const QQmlJSScope::ConstPtr &type, const QQmlJSMetaProperty &p, const QString &value, - const QString &accessor, bool constructQVariant = false); + const QString &accessor, + bool constructFromQObject = false); static void generate_setIdValue(QStringList *block, const QString &context, qsizetype index, const QString &accessor, const QString &idString); |