From 564c1038d1645d76004ad93651aa392d71d45490 Mon Sep 17 00:00:00 2001 From: Shawn Rutledge Date: Wed, 24 Sep 2014 17:36:53 +0200 Subject: qmldir parser: add support for "depends component version" syntax Dependency declarations are initially for the benefit of qmlimportscanner which does not (yet) use this parser. This patch adds support for dependencies into the qmldir parser for completeness, along with autotests. It is necessary to prevent errors at runtime when parsing a qmldir which contains the "depends" declaration. Task-number: QTBUG-41489 Change-Id: Ief2524a30140c42874f94f1735755b171e15dcf7 Reviewed-by: Eskil Abrahamsen Blomfeldt --- src/qml/qml/qqmldirparser.cpp | 27 +++++++++++++++++++++++++++ src/qml/qml/qqmldirparser_p.h | 3 +++ 2 files changed, 30 insertions(+) (limited to 'src') 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 QQmlDirParser::components() const return _components; } +QHash QQmlDirParser::dependencies() const +{ + return _dependencies; +} + QList 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 components() const; + QHash dependencies() const; QList