diff options
| -rw-r--r-- | src/lib/language/tst_language.cpp | 2 | ||||
| -rw-r--r-- | src/lib/tools/propertyfinder.cpp | 27 | ||||
| -rw-r--r-- | src/lib/tools/propertyfinder.h | 2 |
3 files changed, 20 insertions, 11 deletions
diff --git a/src/lib/language/tst_language.cpp b/src/lib/language/tst_language.cpp index 84bd96981..66b19f6a0 100644 --- a/src/lib/language/tst_language.cpp +++ b/src/lib/language/tst_language.cpp @@ -542,8 +542,6 @@ void TestLanguage::moduleProperties() QStringList valueStrings; foreach (const QVariant &v, values) valueStrings += v.toString(); - if (product->name == "merge_lists_with_duplicates") - QEXPECT_FAIL("", "This is broken.", Continue); QCOMPARE(valueStrings, expectedValues); } diff --git a/src/lib/tools/propertyfinder.cpp b/src/lib/tools/propertyfinder.cpp index 6e6bc5e46..4e5f32825 100644 --- a/src/lib/tools/propertyfinder.cpp +++ b/src/lib/tools/propertyfinder.cpp @@ -38,10 +38,11 @@ QVariantList PropertyFinder::propertyValues(const QVariantMap &properties, { m_moduleName = moduleName; m_key = key; - m_mergeType = mergeType; m_findOnlyOne = false; m_values.clear(); findModuleValues(properties); + if (mergeType == DoMergeLists) + mergeLists(&m_values); return m_values; } @@ -50,7 +51,6 @@ QVariant PropertyFinder::propertyValue(const QVariantMap &properties, const QStr { m_moduleName = moduleName; m_key = key; - m_mergeType = DoNotMergeLists; m_findOnlyOne = true; m_values.clear(); findModuleValues(properties); @@ -68,12 +68,7 @@ void PropertyFinder::findModuleValues(const QVariantMap &properties) if (modIt != moduleProperties.end()) { const QVariantMap moduleMap = modIt->toMap(); const QVariant property = moduleMap.value(m_key); - if (property.canConvert<QVariantList>() && m_mergeType == DoMergeLists) { - foreach (const QVariant &element, property.toList()) - addToList(element); - } else { - addToList(property); - } + addToList(property); moduleProperties.erase(modIt); } @@ -91,5 +86,21 @@ void PropertyFinder::addToList(const QVariant &value) m_values << value; } +void PropertyFinder::mergeLists(QVariantList *values) +{ + QVariantList::iterator it = values->begin(); + while (it != values->end()) { + if (it->canConvert<QVariantList>()) { + QVariantList sublist = it->toList(); + mergeLists(&sublist); + it = values->erase(it); + for (int k = sublist.count(); --k >= 0;) + it = values->insert(it, sublist.at(k)); + } else { + ++it; + } + } +} + } // namespace Internal } // namespace qbs diff --git a/src/lib/tools/propertyfinder.h b/src/lib/tools/propertyfinder.h index 2ae91d17d..d8da245df 100644 --- a/src/lib/tools/propertyfinder.h +++ b/src/lib/tools/propertyfinder.h @@ -49,11 +49,11 @@ public: private: void findModuleValues(const QVariantMap &properties); void addToList(const QVariant &value); + static void mergeLists(QVariantList *values); QString m_moduleName; QString m_key; QVariantList m_values; - MergeType m_mergeType; bool m_findOnlyOne; }; |
