diff options
author | Simon Hausmann <simon.hausmann@digia.com> | 2014-03-06 16:19:42 +0100 |
---|---|---|
committer | The Qt Project <gerrit-noreply@qt-project.org> | 2014-03-11 18:31:21 +0100 |
commit | 914b72418b7e766026f2679254fcee93fc920866 (patch) | |
tree | 202634bd203c830ddc7eeb7dab1d071ca506b8a3 /tests/auto | |
parent | af7ba8a6194b83fe7380b8d4ae027e2f04e21f17 (diff) |
Add support for resolving translation bindings at compile time
Simple calls to qsTr and qsTrId are detected at type compile time and
reduced to a special Translation and TranslationById binding type, which
avoids allocating a QML binding at type instantiation type just to perform
a translation.
Change-Id: I61e4f2db2a8092b5e6870e174b832d9c20cd62b5
Reviewed-by: Lars Knoll <lars.knoll@digia.com>
Diffstat (limited to 'tests/auto')
-rw-r--r-- | tests/auto/qml/qml.pro | 4 | ||||
-rw-r--r-- | tests/auto/qml/qqmltranslation/data/translation.qml | 10 | ||||
-rw-r--r-- | tests/auto/qml/qqmltranslation/tst_qqmltranslation.cpp | 65 |
3 files changed, 70 insertions, 9 deletions
diff --git a/tests/auto/qml/qml.pro b/tests/auto/qml/qml.pro index 60c83a11b2..74369685f5 100644 --- a/tests/auto/qml/qml.pro +++ b/tests/auto/qml/qml.pro @@ -21,7 +21,6 @@ PUBLICTESTS += \ qqmlmoduleplugin \ qqmlnotifier \ qqmlqt \ - qqmltranslation \ qqmlxmlhttprequest \ qtqmlmodules \ qquickfolderlistmodel \ @@ -58,7 +57,8 @@ PRIVATETESTS += \ qqmlinstantiator \ qv4debugger \ qqmlenginecleanup \ - v4misc + v4misc \ + qqmltranslation qtHaveModule(widgets) { PUBLICTESTS += \ diff --git a/tests/auto/qml/qqmltranslation/data/translation.qml b/tests/auto/qml/qqmltranslation/data/translation.qml index 8435bedb28..b96471c9dd 100644 --- a/tests/auto/qml/qqmltranslation/data/translation.qml +++ b/tests/auto/qml/qqmltranslation/data/translation.qml @@ -1,13 +1,15 @@ import QtQuick 2.0 QtObject { + objectName: "test" + property string basic: qsTr("hello") property string basic2: qsTranslate("CustomContext", "goodbye") - property string basic3: if (1) qsTr("hello") + property string basic3: if (objectName.length > 0) qsTr("hello") property string disambiguation: qsTr("hi", "informal 'hello'") property string disambiguation2: qsTranslate("CustomContext", "see ya", "informal 'goodbye'") - property string disambiguation3: if (1) qsTr("hi", "informal 'hello'") + property string disambiguation3: if (objectName.length > 0) qsTr("hi", "informal 'hello'") property string _noop: QT_TR_NOOP("hello") property string _noop2: QT_TRANSLATE_NOOP("CustomContext", "goodbye") @@ -15,7 +17,7 @@ QtObject { property string noop2: qsTranslate("CustomContext", _noop2) property string singular: qsTr("%n duck(s)", "", 1) - property string singular2: if (1) qsTr("%n duck(s)", "", 1) + property string singular2: if (objectName.length > 0) qsTr("%n duck(s)", "", 1) property string plural: qsTr("%n duck(s)", "", 2) - property string plural2: if (1) qsTr("%n duck(s)", "", 2) + property string plural2: if (objectName.length > 0) qsTr("%n duck(s)", "", 2) } diff --git a/tests/auto/qml/qqmltranslation/tst_qqmltranslation.cpp b/tests/auto/qml/qqmltranslation/tst_qqmltranslation.cpp index 01e1cf85fb..d8e3d99e84 100644 --- a/tests/auto/qml/qqmltranslation/tst_qqmltranslation.cpp +++ b/tests/auto/qml/qqmltranslation/tst_qqmltranslation.cpp @@ -43,6 +43,9 @@ #include <QQmlEngine> #include <QQmlComponent> #include <QTranslator> +#include <QQmlContext> +#include <private/qqmlcompiler_p.h> +#include <private/qqmlengine_p.h> #include "../../shared/util.h" class tst_qqmltranslation : public QQmlDataTest @@ -61,16 +64,18 @@ void tst_qqmltranslation::translation_data() { QTest::addColumn<QString>("translation"); QTest::addColumn<QUrl>("testFile"); + QTest::addColumn<bool>("verifyCompiledData"); - QTest::newRow("qml") << QStringLiteral("qml_fr") << testFileUrl("translation.qml"); - QTest::newRow("qrc") << QStringLiteral(":/qml_fr.qm") << QUrl("qrc:/translation.qml"); - QTest::newRow("js") << QStringLiteral("qml_fr") << testFileUrl("jstranslation.qml"); + QTest::newRow("qml") << QStringLiteral("qml_fr") << testFileUrl("translation.qml") << true; + QTest::newRow("qrc") << QStringLiteral(":/qml_fr.qm") << QUrl("qrc:/translation.qml") << true; + QTest::newRow("js") << QStringLiteral("qml_fr") << testFileUrl("jstranslation.qml") << false; } void tst_qqmltranslation::translation() { QFETCH(QString, translation); QFETCH(QUrl, testFile); + QFETCH(bool, verifyCompiledData); QTranslator translator; translator.load(translation, dataDirectory()); @@ -81,6 +86,38 @@ void tst_qqmltranslation::translation() QObject *object = component.create(); QVERIFY(object != 0); + if (verifyCompiledData) { + QQmlContext *context = qmlContext(object); + QQmlEnginePrivate *engine = QQmlEnginePrivate::get(context->engine()); + QQmlTypeData *typeData = engine->typeLoader.getType(context->baseUrl()); + QQmlCompiledData *cdata = typeData->compiledData(); + QVERIFY(cdata); + + QSet<QString> compiledTranslations; + compiledTranslations << QStringLiteral("basic") + << QStringLiteral("disambiguation") + << QStringLiteral("singular") << QStringLiteral("plural"); + + const QV4::CompiledData::QmlUnit *unit = cdata->qmlUnit; + const QV4::CompiledData::Object *rootObject = unit->objectAt(unit->indexOfRootObject); + const QV4::CompiledData::Binding *binding = rootObject->bindingTable(); + for (quint32 i = 0; i < rootObject->nBindings; ++i, ++binding) { + const QString propertyName = unit->header.stringAt(binding->propertyNameIndex); + + const bool expectCompiledTranslation = compiledTranslations.contains(propertyName); + + if (expectCompiledTranslation) { + if (binding->type != QV4::CompiledData::Binding::Type_Translation) + qDebug() << "binding for property" << propertyName << "is not a compiled translation"; + QCOMPARE(binding->type, quint32(QV4::CompiledData::Binding::Type_Translation)); + } else { + if (binding->type == QV4::CompiledData::Binding::Type_Translation) + qDebug() << "binding for property" << propertyName << "is not supposed to be a compiled translation"; + QVERIFY(binding->type != QV4::CompiledData::Binding::Type_Translation); + } + } + } + QCOMPARE(object->property("basic").toString(), QLatin1String("bonjour")); QCOMPARE(object->property("basic2").toString(), QLatin1String("au revoir")); QCOMPARE(object->property("basic3").toString(), QLatin1String("bonjour")); @@ -109,6 +146,28 @@ void tst_qqmltranslation::idTranslation() QObject *object = component.create(); QVERIFY(object != 0); + { + QQmlContext *context = qmlContext(object); + QQmlEnginePrivate *engine = QQmlEnginePrivate::get(context->engine()); + QQmlTypeData *typeData = engine->typeLoader.getType(context->baseUrl()); + QQmlCompiledData *cdata = typeData->compiledData(); + QVERIFY(cdata); + + const QV4::CompiledData::QmlUnit *unit = cdata->qmlUnit; + const QV4::CompiledData::Object *rootObject = unit->objectAt(unit->indexOfRootObject); + const QV4::CompiledData::Binding *binding = rootObject->bindingTable(); + for (quint32 i = 0; i < rootObject->nBindings; ++i, ++binding) { + const QString propertyName = unit->header.stringAt(binding->propertyNameIndex); + if (propertyName == "idTranslation") { + if (binding->type != QV4::CompiledData::Binding::Type_TranslationById) + qDebug() << "binding for property" << propertyName << "is not a compiled translation"; + QCOMPARE(binding->type, quint32(QV4::CompiledData::Binding::Type_TranslationById)); + } else { + QVERIFY(binding->type != QV4::CompiledData::Binding::Type_Translation); + } + } + } + QCOMPARE(object->property("idTranslation").toString(), QLatin1String("bonjour tout le monde")); QCOMPARE(object->property("idTranslation2").toString(), QLatin1String("bonjour tout le monde")); QCOMPARE(object->property("idTranslation3").toString(), QLatin1String("bonjour tout le monde")); |