diff options
author | Matthew Vogt <matthew.vogt@nokia.com> | 2012-06-19 12:57:57 +1000 |
---|---|---|
committer | Qt by Nokia <qt-info@nokia.com> | 2012-06-22 00:13:20 +0200 |
commit | 57e3325affbe8bbb8edcc2c6d072db28aee46438 (patch) | |
tree | 697e45faf1b8f4b3cb8cb9e465e443c169df6332 /src/qml/qml/qqmlimport.cpp | |
parent | 5e33b0f580d2b20f1a2989bf2ee8dde4525a2e39 (diff) |
Report clashing qmldir entries for components and scripts
If a qmldir contains multiple lines that install the same versioned
property for a single component name or script qualifier, report an
error rather than silently suppress one entry.
Task-number: QTBUG-25834
Change-Id: I25d3a24102a5a4fa3d82f1d31d7e52505026fff7
Reviewed-by: Chris Adams <christopher.adams@nokia.com>
Diffstat (limited to 'src/qml/qml/qqmlimport.cpp')
-rw-r--r-- | src/qml/qml/qqmlimport.cpp | 40 |
1 files changed, 33 insertions, 7 deletions
diff --git a/src/qml/qml/qqmlimport.cpp b/src/qml/qml/qqmlimport.cpp index 9bdc67a0ac..f1e907460d 100644 --- a/src/qml/qml/qqmlimport.cpp +++ b/src/qml/qml/qqmlimport.cpp @@ -852,19 +852,45 @@ bool QQmlImportsPrivate::addImport(const QQmlDirComponents &qmldircomponentsnetw typedef QQmlDirComponents::const_iterator ConstIterator; typedef QList<QQmlDirParser::Script>::const_iterator SConstIterator; - ConstIterator cend = qmldircomponents.end(); - for (ConstIterator cit = qmldircomponents.begin(); cit != cend; ++cit) { + ConstIterator cend = qmldircomponents.constEnd(); + for (ConstIterator cit = qmldircomponents.constBegin(); cit != cend; ++cit) { + for (ConstIterator cit2 = qmldircomponents.constBegin(); cit2 != cit; ++cit2) { + if ((cit2->typeName == cit->typeName) && + (cit2->majorVersion == cit->majorVersion) && + (cit2->minorVersion == cit->minorVersion)) { + // This is entry clashes with a predecessor + QQmlError error; + error.setDescription(tr("\"%1\" version %2.%3 is already defined in module \"%4\"") + .arg(cit->typeName).arg(cit->majorVersion).arg(cit->minorVersion).arg(importedUri)); + errors->prepend(error); + return false; + } + } + if (cit->majorVersion == vmaj) { lowest_min = qMin(lowest_min, cit->minorVersion); highest_min = qMax(highest_min, cit->minorVersion); } } - for (SConstIterator cit = qmldirscripts.constBegin(); - cit != qmldirscripts.constEnd(); ++cit) { - if (cit->majorVersion == vmaj) { - lowest_min = qMin(lowest_min, cit->minorVersion); - highest_min = qMax(highest_min, cit->minorVersion); + SConstIterator send = qmldirscripts.constEnd(); + for (SConstIterator sit = qmldirscripts.constBegin(); sit != send; ++sit) { + for (SConstIterator sit2 = qmldirscripts.constBegin(); sit2 != sit; ++sit2) { + if ((sit2->nameSpace == sit->nameSpace) && + (sit2->majorVersion == sit->majorVersion) && + (sit2->minorVersion == sit->minorVersion)) { + // This is entry clashes with a predecessor + QQmlError error; + error.setDescription(tr("\"%1\" version %2.%3 is already defined in module \"%4\"") + .arg(sit->nameSpace).arg(sit->majorVersion).arg(sit->minorVersion).arg(importedUri)); + errors->prepend(error); + return false; + } + } + + if (sit->majorVersion == vmaj) { + lowest_min = qMin(lowest_min, sit->minorVersion); + highest_min = qMax(highest_min, sit->minorVersion); } } |