summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristian Kandeler <christian.kandeler@theqtcompany.com>2015-07-29 13:49:30 +0200
committerChristian Kandeler <christian.kandeler@theqtcompany.com>2015-07-29 12:08:53 +0000
commitdecc3a892ba4d5ee8dbcf4031f590e28ee3d58e0 (patch)
treebd0f3e1e54e6dc24052ac234a45b75a3e20df7a4
parent42cb5aced15115416c8e9bcdc16566eade9d26a4 (diff)
downloadqbs-decc3a892ba4d5ee8dbcf4031f590e28ee3d58e0.tar.gz
Fix evaluation of "product" in list properties.
When collecting list values, the one from the module prototype had no scope, so "product" and "project" were not available. Change-Id: If07ac0ebe68726dc3936a7d0b3a7629d4b41abd6 Reviewed-by: Joerg Bornemann <joerg.bornemann@theqtcompany.com>
-rw-r--r--src/lib/corelib/language/modulemerger.cpp12
-rw-r--r--src/lib/corelib/language/testdata/moduleproperties.qbs7
-rw-r--r--src/lib/corelib/language/testdata/modules/dummy/dummy.qbs1
-rw-r--r--src/lib/corelib/language/tst_language.cpp3
4 files changed, 20 insertions, 3 deletions
diff --git a/src/lib/corelib/language/modulemerger.cpp b/src/lib/corelib/language/modulemerger.cpp
index 577f9098c..13f29b95f 100644
--- a/src/lib/corelib/language/modulemerger.cpp
+++ b/src/lib/corelib/language/modulemerger.cpp
@@ -199,9 +199,15 @@ void ModuleMerger::appendPrototypeValueToNextChain(Item *moduleProto, const QStr
ValuePtr protoValue = moduleProto->property(propertyName);
if (!protoValue)
return;
- ValuePtr cloned = protoValue->clone();
- cloned->setDefiningItem(moduleProto);
- lastInNextChain(sv)->setNext(cloned);
+ Item * const clonedModulePrototype = moduleProto->clone(moduleProto->pool());
+ Item * const scope = Item::create(clonedModulePrototype->pool());
+ scope->setFile(clonedModulePrototype->file());
+ m_mergedModuleItem->scope()->copyProperty(QLatin1String("project"), scope);
+ m_mergedModuleItem->scope()->copyProperty(QLatin1String("product"), scope);
+ clonedModulePrototype->setScope(scope);
+ const ValuePtr clonedValue = protoValue->clone();
+ clonedValue->setDefiningItem(clonedModulePrototype);
+ lastInNextChain(sv)->setNext(clonedValue);
}
ValuePtr ModuleMerger::lastInNextChain(const ValuePtr &v)
diff --git a/src/lib/corelib/language/testdata/moduleproperties.qbs b/src/lib/corelib/language/testdata/moduleproperties.qbs
index 4777b7783..7b782751a 100644
--- a/src/lib/corelib/language/testdata/moduleproperties.qbs
+++ b/src/lib/corelib/language/testdata/moduleproperties.qbs
@@ -23,4 +23,11 @@ Project {
Depends { name: "dummyqt"; submodules: ["gui", "network"] }
Depends { name: "dummy" }
}
+
+ Product {
+ name: "list_property_that_references_product"
+ type: ["blubb"]
+ Depends { name: "dummy" }
+ dummy.listProp: ["x"]
+ }
}
diff --git a/src/lib/corelib/language/testdata/modules/dummy/dummy.qbs b/src/lib/corelib/language/testdata/modules/dummy/dummy.qbs
index a04c7c463..9fdd73459 100644
--- a/src/lib/corelib/language/testdata/modules/dummy/dummy.qbs
+++ b/src/lib/corelib/language/testdata/modules/dummy/dummy.qbs
@@ -11,4 +11,5 @@ DummyBase {
property string upperCaseProductName: productName.toUpperCase()
property string zort: "zort in dummy"
property pathList includePaths
+ property stringList listProp: product.type.contains("blubb") ? ["123"] : ["456"]
}
diff --git a/src/lib/corelib/language/tst_language.cpp b/src/lib/corelib/language/tst_language.cpp
index c73b26665..d6ab07273 100644
--- a/src/lib/corelib/language/tst_language.cpp
+++ b/src/lib/corelib/language/tst_language.cpp
@@ -951,6 +951,9 @@ void TestLanguage::moduleProperties_data()
QTest::newRow("merge_lists_with_prototype_values")
<< "rpaths"
<< (QStringList() << "/opt/qt/lib" << "$ORIGIN");
+ QTest::newRow("list_property_that_references_product")
+ << "listProp"
+ << (QStringList() << "x" << "123");
QTest::newRow("cleanup") << QString() << QStringList();
}