aboutsummaryrefslogtreecommitdiffstats
path: root/src/qml/qmltc
diff options
context:
space:
mode:
authorSami Shalayel <[email protected]>2022-07-15 11:15:52 +0200
committerSami Shalayel <[email protected]>2022-08-15 11:20:32 +0200
commite9dc0ac68134bc6a9cc6522eaca6d893ee10b86d (patch)
treef584dbb5ff239bbe7f931f35d2b8e46465f3ff60 /src/qml/qmltc
parent70074e1acaca16afd6306a9c967ce4d15966c333 (diff)
Create Translation Bindings without CompiledData::Binding
To add translation bindings to qmltc, the methods used to create translation bindings need to be adapted to work without QV4::CompiledData::Binding as it is not available from qmltc. Instead, information already available from the QQmlJSScope should be used, along with a newly introduced helper class QQmlTranslation. Details: Add a QQmlTranslation class that represents a call to qsTr, qsTrId etc that knows how to translate itself (without needing any ExecutableCompilationUnit or Binding). It encapsulates the information needed to create a translation binding. ExecutableCompilationUnit::bindingValueAsString refactored so its functionality can be used without Binding. Instead, it uses only the translationId, see ExecutableCompilationUnit::translateFromId and ExecutableCompilationUnit::translateFrom. Refactored QQmlTranslationBinding to work with QQmlTranslation instead of CompiledData::Binding. Same for QQmlCppBinding::createTranslationBindingForBindable, QQmlTranslationPropertyBinding::create and QQmlCppBinding::createTranslationBindingForNonBindable. Changed TranslationBindingInformation to work without CompiledData::Binding, and also removed static unused QString ProxyTranslator::originStringFromInformation( const TranslationBindingInformation &translationBindingInformation) as I could not find out what this origin string is. Same for the translation debugging in qmldb_preview. Added QmltcCodeGenerator::generate_createTranslationBindingOnProperty. Added #if to avoid compilation error for standalone DOM compilation due to the new QQmlTranslation class. Task-number: QTBUG-105345 Change-Id: Iccd94d5cba4eaf63901233451fec48051c855c2a Reviewed-by: Qt CI Bot <[email protected]> Reviewed-by: Fabian Kosmale <[email protected]>
Diffstat (limited to 'src/qml/qmltc')
-rw-r--r--src/qml/qmltc/supportlibrary/qqmlcppbinding.cpp52
-rw-r--r--src/qml/qmltc/supportlibrary/qqmlcppbinding_p.h12
2 files changed, 64 insertions, 0 deletions
diff --git a/src/qml/qmltc/supportlibrary/qqmlcppbinding.cpp b/src/qml/qmltc/supportlibrary/qqmlcppbinding.cpp
index a9d4207c1b..fdea993124 100644
--- a/src/qml/qmltc/supportlibrary/qqmlcppbinding.cpp
+++ b/src/qml/qmltc/supportlibrary/qqmlcppbinding.cpp
@@ -108,4 +108,56 @@ void QQmlCppBinding::createBindingForNonBindable(const QV4::ExecutableCompilatio
});
}
+QUntypedPropertyBinding QQmlCppBinding::createTranslationBindingForBindable(
+ const QQmlRefPointer<QV4::ExecutableCompilationUnit> &unit, QObject *bindingTarget,
+ int metaPropertyIndex, const QQmlTranslation &translationData, const QString &propertyName)
+{
+ Q_UNUSED(propertyName);
+
+ if (metaPropertyIndex < 0) {
+ // TODO: align with existing logging of such
+ qCritical() << "invalid meta property index (internal error)";
+ return QUntypedPropertyBinding();
+ }
+
+ const QMetaObject *mo = bindingTarget->metaObject();
+ Q_ASSERT(mo);
+ QMetaProperty property = mo->property(metaPropertyIndex);
+ Q_ASSERT(QString::fromUtf8(property.name()) == propertyName);
+
+ return QQmlTranslationPropertyBinding::create(property.metaType(), unit, translationData);
+}
+
+void QQmlCppBinding::createTranslationBindingForNonBindable(
+ const QQmlRefPointer<QV4::ExecutableCompilationUnit> &unit,
+ const QQmlSourceLocation &location, const QQmlTranslation &translationData,
+ QObject *thisObject, QObject *bindingTarget, int metaPropertyIndex,
+ const QString &propertyName, int valueTypePropertyIndex)
+{
+ Q_UNUSED(propertyName);
+
+ if (metaPropertyIndex < 0) {
+ // TODO: align with existing logging of such
+ qCritical() << "invalid meta property index (internal error)";
+ return;
+ }
+
+ const QMetaObject *mo = bindingTarget->metaObject();
+ Q_ASSERT(mo);
+ QMetaProperty property = mo->property(metaPropertyIndex);
+ Q_ASSERT(QString::fromUtf8(property.name()) == propertyName);
+
+ createBindingInScope(
+ thisObject,
+ [&](const QQmlRefPointer<QQmlContextData> &ctxt, QV4::ExecutionContext *) -> void {
+ QQmlBinding *binding = QQmlBinding::createTranslationBinding(
+ unit, ctxt, propertyName, translationData, location, thisObject);
+ // almost as in qv4objectwrapper.cpp:535
+ Q_ASSERT(!property.isAlias()); // we convert aliases to (almost) real properties
+ binding->setTarget(bindingTarget, property.propertyIndex(), false,
+ valueTypePropertyIndex);
+ QQmlPropertyPrivate::setBinding(binding);
+ });
+}
+
QT_END_NAMESPACE
diff --git a/src/qml/qmltc/supportlibrary/qqmlcppbinding_p.h b/src/qml/qmltc/supportlibrary/qqmlcppbinding_p.h
index e692ab4007..0f2e6a4998 100644
--- a/src/qml/qmltc/supportlibrary/qqmlcppbinding_p.h
+++ b/src/qml/qmltc/supportlibrary/qqmlcppbinding_p.h
@@ -45,6 +45,18 @@ struct Q_QML_PRIVATE_EXPORT QQmlCppBinding
QObject *bindingTarget, int metaPropertyIndex,
int valueTypePropertyIndex,
const QString &propertyName);
+
+ static QUntypedPropertyBinding
+ createTranslationBindingForBindable(const QQmlRefPointer<QV4::ExecutableCompilationUnit> &unit,
+ QObject *bindingTarget, int metaPropertyIndex,
+ const QQmlTranslation &translationData,
+ const QString &propertyName);
+
+ static void createTranslationBindingForNonBindable(
+ const QQmlRefPointer<QV4::ExecutableCompilationUnit> &unit,
+ const QQmlSourceLocation &location, const QQmlTranslation &translationData,
+ QObject *thisObject, QObject *bindingTarget, int metaPropertyIndex,
+ const QString &propertyName, int valueTypePropertyIndex);
};
QT_END_NAMESPACE