aboutsummaryrefslogtreecommitdiffstats
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)
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();
}