diff options
author | Christian Kandeler <christian.kandeler@theqtcompany.com> | 2015-07-29 13:49:30 +0200 |
---|---|---|
committer | Christian Kandeler <christian.kandeler@theqtcompany.com> | 2015-07-29 12:08:53 +0000 |
commit | decc3a892ba4d5ee8dbcf4031f590e28ee3d58e0 (patch) | |
tree | bd0f3e1e54e6dc24052ac234a45b75a3e20df7a4 | |
parent | 42cb5aced15115416c8e9bcdc16566eade9d26a4 (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>
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(); } |