aboutsummaryrefslogtreecommitdiffstats
path: root/tools
diff options
context:
space:
mode:
authorAndrei Golubev <andrei.golubev@qt.io>2022-04-14 11:07:19 +0200
committerAndrei Golubev <andrei.golubev@qt.io>2022-04-28 09:43:36 +0200
commite98faf1df401268dc6966b39963547a4de6f9171 (patch)
tree949e89e7c8e2e8cd4156b7d2ab6a51617daf9936 /tools
parentc1d5fe306505a3201b7f6f04ebb42e7ee00ff94d (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.cpp14
-rw-r--r--tools/qmltc/qmltccompilerpieces.cpp18
-rw-r--r--tools/qmltc/qmltccompilerpieces.h3
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 &current, 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 &current, 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(&current.endInit.body, object.type, p,
- value, accessor.name, constructQVariant);
+ value, accessor.name,
+ constructFromQObject);
}
};
@@ -728,7 +728,7 @@ void CodeGenerator::compileBinding(QmltcType &current, 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);