summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/lib/language/tst_language.cpp2
-rw-r--r--src/lib/tools/propertyfinder.cpp27
-rw-r--r--src/lib/tools/propertyfinder.h2
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;
};