diff options
6 files changed, 70 insertions, 23 deletions
diff --git a/src/declarative/qml/qmlengine.cpp b/src/declarative/qml/qmlengine.cpp index d06376a..d520d18 100644 --- a/src/declarative/qml/qmlengine.cpp +++ b/src/declarative/qml/qmlengine.cpp @@ -1218,6 +1218,7 @@ public: if (prefix.isEmpty()) { if (importType == QmlScriptParser::Import::Library && !vmaj && !vmin) { // unversioned library imports are always qualified - if only by final URI component + // XXX we need not support this int lastdot = uri.lastIndexOf(QLatin1Char('.')); QString defaultprefix = uri.mid(lastdot+1); s = set.value(defaultprefix); @@ -1249,10 +1250,10 @@ public: } else { url = base.resolved(QUrl(url)).toString(); } - s->urls.append(url); - s->majversions.append(vmaj); - s->minversions.append(vmin); - s->isLibrary.append(importType == QmlScriptParser::Import::Library); + s->urls.prepend(url); + s->majversions.prepend(vmaj); + s->minversions.prepend(vmin); + s->isLibrary.prepend(importType == QmlScriptParser::Import::Library); return true; } diff --git a/tests/auto/declarative/qmlparser/failingComponent.errors.txt b/tests/auto/declarative/qmlparser/failingComponent.errors.txt index 190a649..0cf0ef3 100644 --- a/tests/auto/declarative/qmlparser/failingComponent.errors.txt +++ b/tests/auto/declarative/qmlparser/failingComponent.errors.txt @@ -1,2 +1 @@ -3:5:Unable to create type FailingComponent -4:5:Cannot assign to non-existant property "a" +3:5:Type FailingComponent unavailable diff --git a/tests/auto/declarative/qmlparser/importNamespaceConflict.errors.txt b/tests/auto/declarative/qmlparser/importNamespaceConflict.errors.txt new file mode 100644 index 0000000..231998d --- /dev/null +++ b/tests/auto/declarative/qmlparser/importNamespaceConflict.errors.txt @@ -0,0 +1 @@ +4:1:Namespace Rectangle cannot be used as a type diff --git a/tests/auto/declarative/qmlparser/importNamespaceConflict.qml b/tests/auto/declarative/qmlparser/importNamespaceConflict.qml new file mode 100644 index 0000000..cd112af --- /dev/null +++ b/tests/auto/declarative/qmlparser/importNamespaceConflict.qml @@ -0,0 +1,4 @@ +import Test 1.0 as Rectangle +import Qt 4.6 + +Rectangle { } diff --git a/tests/auto/declarative/qmlparser/testtypes.h b/tests/auto/declarative/qmlparser/testtypes.h index ace7ef9..f700484 100644 --- a/tests/auto/declarative/qmlparser/testtypes.h +++ b/tests/auto/declarative/qmlparser/testtypes.h @@ -357,12 +357,13 @@ private: QML_DECLARE_TYPE(MyContainer); -class MyPropertyValueSource : public QmlPropertyValueSource +class MyPropertyValueSource : public QObject, public QmlPropertyValueSource { Q_OBJECT + Q_INTERFACES(QmlPropertyValueSource) public: MyPropertyValueSource() - : QmlPropertyValueSource(0) {} + : QmlPropertyValueSource() {} QmlMetaProperty prop; virtual void setTarget(const QmlMetaProperty &p) diff --git a/tests/auto/declarative/qmlparser/tst_qmlparser.cpp b/tests/auto/declarative/qmlparser/tst_qmlparser.cpp index 3047bb0..c21d672 100644 --- a/tests/auto/declarative/qmlparser/tst_qmlparser.cpp +++ b/tests/auto/declarative/qmlparser/tst_qmlparser.cpp @@ -48,14 +48,19 @@ private slots: void customVariantTypes(); void valueTypes(); - void imports_data(); - void imports(); + void importsBuiltin_data(); + void importsBuiltin(); + void importsLocal_data(); + void importsLocal(); + void importsInstalled_data(); + void importsInstalled(); // regression tests for crashes void crash1(); private: QmlEngine engine; + void testType(const QString& qml, const QString& type); }; #define VERIFY_ERRORS(errorfile) \ @@ -420,6 +425,10 @@ void tst_qmlparser::autoComponentCreation() void tst_qmlparser::propertyValueSource() { + QVERIFY(false); + +/* Does not compile... + QmlComponent component(&engine, TEST_FILE("propertyValueSource.qml")); VERIFY_ERRORS(0); MyTypeObject *object = qobject_cast<MyTypeObject *>(component.create()); @@ -432,6 +441,7 @@ void tst_qmlparser::propertyValueSource() QVERIFY(valueSource != 0); QCOMPARE(valueSource->prop.object(), object); QCOMPARE(valueSource->prop.name(), QString(QLatin1String("intProperty"))); +*/ } void tst_qmlparser::attachedProperties() @@ -502,6 +512,21 @@ public: TestType2(QObject *p=0) : QObject(p) {} }; +// Check that first child of qml is of given type. Empty type insists on error. +void tst_qmlparser::testType(const QString& qml, const QString& type) +{ + QmlComponent component(&engine, qml.toUtf8(), TEST_FILE("empty.qml")); // just a file for relative local imports + + if (type.isEmpty()) { + QVERIFY(component.isError()); + } else { + VERIFY_ERRORS(0); + QObject *object = component.create(); + QVERIFY(object != 0); + QCOMPARE(QString(object->metaObject()->className()), type); + } +} + QML_DECLARE_TYPE(TestType) QML_DECLARE_TYPE(TestType2) @@ -511,7 +536,7 @@ QML_DEFINE_TYPE(com.nokia.Test, 1, 8, 9, Test, TestType2) QML_DEFINE_TYPE(com.nokia.Test, 1, 12, 13, Test, TestType2) QML_DEFINE_TYPE(com.nokia.Test, 1, 9, 11, OldTest, TestType) -void tst_qmlparser::imports_data() +void tst_qmlparser::importsBuiltin_data() { QTest::addColumn<QString>("qml"); QTest::addColumn<QString>("type"); @@ -605,6 +630,19 @@ void tst_qmlparser::imports_data() "import com.nokia.Test 1.10 as T10\n" "T10.Test {}" << ""; +} + +void tst_qmlparser::importsBuiltin() +{ + QFETCH(QString, qml); + QFETCH(QString, type); + testType(qml,type); +} + +void tst_qmlparser::importsLocal_data() +{ + QTest::addColumn<QString>("qml"); + QTest::addColumn<QString>("type"); // import locals QTest::newRow("local import") @@ -624,6 +662,19 @@ void tst_qmlparser::imports_data() "import com.nokia.Test 1.0\n" "Test {}" << "TestType"; +} + +void tst_qmlparser::importsLocal() +{ + QFETCH(QString, qml); + QFETCH(QString, type); + testType(qml,type); +} + +void tst_qmlparser::importsInstalled_data() +{ + QTest::addColumn<QString>("qml"); + QTest::addColumn<QString>("type"); // import installed QTest::newRow("installed import") @@ -636,21 +687,11 @@ void tst_qmlparser::imports_data() << "QFxText"; } -void tst_qmlparser::imports() +void tst_qmlparser::importsInstalled() { QFETCH(QString, qml); QFETCH(QString, type); - - QmlComponent component(&engine, qml.toUtf8(), TEST_FILE("empty.qml")); // just a file for relative local imports - - if (type.isEmpty()) { - QVERIFY(component.isError()); - } else { - VERIFY_ERRORS(0); - QObject *object = component.create(); - QVERIFY(object != 0); - QCOMPARE(QString(object->metaObject()->className()), type); - } + testType(qml,type); } void tst_qmlparser::crash1() |