aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/qml/qml/qqmldirparser.cpp27
-rw-r--r--src/qml/qml/qqmldirparser_p.h3
-rw-r--r--tests/auto/qml/qqmldirparser/data/dependency/qmldir3
-rw-r--r--tests/auto/qml/qqmldirparser/tst_qqmldirparser.cpp32
4 files changed, 65 insertions, 0 deletions
diff --git a/src/qml/qml/qqmldirparser.cpp b/src/qml/qml/qqmldirparser.cpp
index 7068818f15..83e1c9c757 100644
--- a/src/qml/qml/qqmldirparser.cpp
+++ b/src/qml/qml/qqmldirparser.cpp
@@ -231,6 +231,28 @@ bool QQmlDirParser::parse(const QString &source)
reportError(lineNumber, 0, QString::fromLatin1("designersupported does not expect any argument"));
else
_designerSupported = true;
+ } else if (sections[0] == QLatin1String("depends")) {
+ if (sectionCount != 3) {
+ reportError(lineNumber, 0,
+ QString::fromLatin1("depends requires 2 arguments, but %1 were provided").arg(sectionCount - 1));
+ continue;
+ }
+
+ const QString &version = sections[2];
+ const int dotIndex = version.indexOf(QLatin1Char('.'));
+ bool validVersionNumber = false;
+ const int majorVersion = parseInt(QStringRef(&version, 0, dotIndex), &validVersionNumber);
+ if (validVersionNumber) {
+ const int minorVersion = parseInt(QStringRef(&version, dotIndex+1, version.length()-dotIndex-1), &validVersionNumber);
+
+ if (validVersionNumber) {
+ Component entry(sections[1], QString(), majorVersion, minorVersion);
+ entry.internal = true;
+ _dependencies.insert(entry.typeName, entry);
+ }
+ } else {
+ reportError(lineNumber, 0, QString(QLatin1String("invalid version %1")).arg(version));
+ }
} else if (sectionCount == 2) {
// No version specified (should only be used for relative qmldir files)
const Component entry(sections[0], sections[1], -1, -1);
@@ -348,6 +370,11 @@ QHash<QString, QQmlDirParser::Component> QQmlDirParser::components() const
return _components;
}
+QHash<QString, QQmlDirParser::Component> QQmlDirParser::dependencies() const
+{
+ return _dependencies;
+}
+
QList<QQmlDirParser::Script> QQmlDirParser::scripts() const
{
return _scripts;
diff --git a/src/qml/qml/qqmldirparser_p.h b/src/qml/qml/qqmldirparser_p.h
index 54843a13b0..bbe61dfb96 100644
--- a/src/qml/qml/qqmldirparser_p.h
+++ b/src/qml/qml/qqmldirparser_p.h
@@ -119,6 +119,7 @@ public:
};
QHash<QString,Component> components() const;
+ QHash<QString,Component> dependencies() const;
QList<Script> scripts() const;
QList<Plugin> plugins() const;
bool designerSupported() const;
@@ -137,12 +138,14 @@ public:
#endif
private:
+ bool maybeAddComponent(const QString &typeName, const QString &fileName, const QString &version, QHash<QString,Component> &hash, int lineNumber = -1, bool multi = true);
void reportError(quint16 line, quint16 column, const QString &message);
private:
QList<QQmlJS::DiagnosticMessage> _errors;
QString _typeNamespace;
QHash<QString,Component> _components; // multi hash
+ QHash<QString,Component> _dependencies;
QList<Script> _scripts;
QList<Plugin> _plugins;
bool _designerSupported;
diff --git a/tests/auto/qml/qqmldirparser/data/dependency/qmldir b/tests/auto/qml/qqmldirparser/data/dependency/qmldir
new file mode 100644
index 0000000000..0754dbceea
--- /dev/null
+++ b/tests/auto/qml/qqmldirparser/data/dependency/qmldir
@@ -0,0 +1,3 @@
+plugin foo
+depends bar 1.0
+
diff --git a/tests/auto/qml/qqmldirparser/tst_qqmldirparser.cpp b/tests/auto/qml/qqmldirparser/tst_qqmldirparser.cpp
index 017a92b590..615df08d5c 100644
--- a/tests/auto/qml/qqmldirparser/tst_qqmldirparser.cpp
+++ b/tests/auto/qml/qqmldirparser/tst_qqmldirparser.cpp
@@ -125,6 +125,7 @@ void tst_qqmldirparser::parse_data()
QTest::addColumn<QStringList>("plugins");
QTest::addColumn<QStringList>("components");
QTest::addColumn<QStringList>("scripts");
+ QTest::addColumn<QStringList>("dependencies");
QTest::addColumn<bool>("designerSupported");
QTest::newRow("empty")
@@ -133,6 +134,7 @@ void tst_qqmldirparser::parse_data()
<< QStringList()
<< QStringList()
<< QStringList()
+ << QStringList()
<< false;
QTest::newRow("no-content")
@@ -141,6 +143,7 @@ void tst_qqmldirparser::parse_data()
<< QStringList()
<< QStringList()
<< QStringList()
+ << QStringList()
<< false;
QTest::newRow("one-section")
@@ -149,6 +152,7 @@ void tst_qqmldirparser::parse_data()
<< QStringList()
<< QStringList()
<< QStringList()
+ << QStringList()
<< false;
QTest::newRow("four-sections")
@@ -157,6 +161,7 @@ void tst_qqmldirparser::parse_data()
<< QStringList()
<< QStringList()
<< QStringList()
+ << QStringList()
<< false;
QTest::newRow("incomplete-module")
@@ -165,6 +170,7 @@ void tst_qqmldirparser::parse_data()
<< QStringList()
<< QStringList()
<< QStringList()
+ << QStringList()
<< false;
QTest::newRow("excessive-module")
@@ -173,6 +179,7 @@ void tst_qqmldirparser::parse_data()
<< QStringList()
<< QStringList()
<< QStringList()
+ << QStringList()
<< false;
QTest::newRow("repeated-module")
@@ -181,6 +188,7 @@ void tst_qqmldirparser::parse_data()
<< QStringList()
<< QStringList()
<< QStringList()
+ << QStringList()
<< false;
QTest::newRow("non-first-module")
@@ -189,6 +197,7 @@ void tst_qqmldirparser::parse_data()
<< (QStringList() << "foo|")
<< QStringList()
<< QStringList()
+ << QStringList()
<< false;
QTest::newRow("incomplete-plugin")
@@ -197,6 +206,7 @@ void tst_qqmldirparser::parse_data()
<< QStringList()
<< QStringList()
<< QStringList()
+ << QStringList()
<< false;
QTest::newRow("excessive-plugin")
@@ -205,6 +215,7 @@ void tst_qqmldirparser::parse_data()
<< QStringList()
<< QStringList()
<< QStringList()
+ << QStringList()
<< false;
QTest::newRow("name-plugin")
@@ -213,6 +224,7 @@ void tst_qqmldirparser::parse_data()
<< (QStringList() << "foo|")
<< QStringList()
<< QStringList()
+ << QStringList()
<< false;
QTest::newRow("name-path-plugin")
@@ -221,6 +233,7 @@ void tst_qqmldirparser::parse_data()
<< (QStringList() << "foo|bar")
<< QStringList()
<< QStringList()
+ << QStringList()
<< false;
QTest::newRow("unversioned-component")
@@ -229,6 +242,7 @@ void tst_qqmldirparser::parse_data()
<< QStringList()
<< (QStringList() << "foo|bar|-1|-1|false")
<< QStringList()
+ << QStringList()
<< false;
QTest::newRow("invalid-versioned-component")
@@ -237,6 +251,7 @@ void tst_qqmldirparser::parse_data()
<< QStringList()
<< QStringList()
<< QStringList()
+ << QStringList()
<< false;
QTest::newRow("versioned-component")
@@ -245,6 +260,7 @@ void tst_qqmldirparser::parse_data()
<< QStringList()
<< (QStringList() << "foo|bar|33|66|false")
<< QStringList()
+ << QStringList()
<< false;
QTest::newRow("versioned-script")
@@ -253,6 +269,7 @@ void tst_qqmldirparser::parse_data()
<< QStringList()
<< QStringList()
<< (QStringList() << "foo|bar.js|33|66")
+ << QStringList()
<< false;
QTest::newRow("multiple")
@@ -263,6 +280,7 @@ void tst_qqmldirparser::parse_data()
<< "ComponentA|componenta-1_5.qml|1|5|false"
<< "ComponentB|componentb-1_5.qml|1|5|false")
<< (QStringList() << "ScriptA|scripta-1_0.js|1|0")
+ << QStringList()
<< false;
QTest::newRow("designersupported-yes")
@@ -271,6 +289,7 @@ void tst_qqmldirparser::parse_data()
<< (QStringList() << "foo|")
<< QStringList()
<< QStringList()
+ << QStringList()
<< true;
QTest::newRow("designersupported-no")
@@ -279,7 +298,17 @@ void tst_qqmldirparser::parse_data()
<< (QStringList() << "foo|")
<< QStringList()
<< QStringList()
+ << QStringList()
<< false;
+
+ QTest::newRow("dependency")
+ << "dependency/qmldir"
+ << QStringList()
+ << (QStringList() << "foo|")
+ << QStringList()
+ << QStringList()
+ << (QStringList() << "bar||1|0|true")
+ << false;
}
void tst_qqmldirparser::parse()
@@ -289,6 +318,7 @@ void tst_qqmldirparser::parse()
QFETCH(QStringList, plugins);
QFETCH(QStringList, components);
QFETCH(QStringList, scripts);
+ QFETCH(QStringList, dependencies);
QFETCH(bool, designerSupported);
QFile f(testFile(file));
@@ -307,6 +337,8 @@ void tst_qqmldirparser::parse()
QCOMPARE(toStringList(p.plugins()), plugins);
QCOMPARE(toStringList(p.components()), components);
QCOMPARE(toStringList(p.scripts()), scripts);
+ QCOMPARE(toStringList(p.dependencies()), dependencies);
+
QCOMPARE(p.designerSupported(), designerSupported);
}