From 55ff3783ce27c87517ae4758fdaca0f16a86367b Mon Sep 17 00:00:00 2001 From: Christian Kandeler Date: Fri, 2 Oct 2015 10:00:33 +0200 Subject: Fix using Properties items in Groups. In EvaluatorScriptClass, we overwrote the already existing outer item with a (non-working) new one. The original intention of that code is not entirely clear to me; my assumption is that it can continue to exist as a fallback where "outer" is used outside a group. Task-number: QBS-877 Change-Id: Ife0b7f85574f7d880307cd2f65f551a64ca3cf6f Reviewed-by: Joerg Bornemann --- src/lib/corelib/language/evaluatorscriptclass.cpp | 4 +++- src/lib/corelib/language/testdata/dummy.txt | 0 .../testdata/properties-block-in-group.qbs | 16 ++++++++++++++ src/lib/corelib/language/tst_language.cpp | 25 ++++++++++++++++++++++ src/lib/corelib/language/tst_language.h | 1 + 5 files changed, 45 insertions(+), 1 deletion(-) create mode 100644 src/lib/corelib/language/testdata/dummy.txt create mode 100644 src/lib/corelib/language/testdata/properties-block-in-group.qbs diff --git a/src/lib/corelib/language/evaluatorscriptclass.cpp b/src/lib/corelib/language/evaluatorscriptclass.cpp index 9ebd2e077..48c66606a 100644 --- a/src/lib/corelib/language/evaluatorscriptclass.cpp +++ b/src/lib/corelib/language/evaluatorscriptclass.cpp @@ -186,13 +186,15 @@ private: } if (cr.toBool()) { // condition is true, let's use the value of this alternative - if (alternative->value->sourceUsesOuter()) { + if (alternative->value->sourceUsesOuter() && !outerItem) { // Clone value but without alternatives. JSSourceValuePtr outerValue = JSSourceValue::create(); outerValue->setFile(value->file()); outerValue->setHasFunctionForm(value->hasFunctionForm()); outerValue->setSourceCode(value->sourceCode()); outerValue->setBaseValue(value->baseValue()); + if (value->sourceUsesBase()) + outerValue->setSourceUsesBaseFlag(); outerValue->setLocation(value->line(), value->column()); outerItem = Item::create(data->item->pool()); outerItem->setProperty(propertyName->toString(), outerValue); diff --git a/src/lib/corelib/language/testdata/dummy.txt b/src/lib/corelib/language/testdata/dummy.txt new file mode 100644 index 000000000..e69de29bb diff --git a/src/lib/corelib/language/testdata/properties-block-in-group.qbs b/src/lib/corelib/language/testdata/properties-block-in-group.qbs new file mode 100644 index 000000000..c2bfea0a8 --- /dev/null +++ b/src/lib/corelib/language/testdata/properties-block-in-group.qbs @@ -0,0 +1,16 @@ +import qbs + +Product { + name: "in-group" + property bool featureEnabled: true + Depends { name: "dummy" } + dummy.defines: ["BASEDEF"] + Group { + name: "the group" + files: ["dummy.txt" ] + Properties { + condition: featureEnabled + dummy.defines: outer.concat("FEATURE_ENABLED") + } + } +} diff --git a/src/lib/corelib/language/tst_language.cpp b/src/lib/corelib/language/tst_language.cpp index 8d0d09f3a..c3cb0560e 100644 --- a/src/lib/corelib/language/tst_language.cpp +++ b/src/lib/corelib/language/tst_language.cpp @@ -1424,6 +1424,31 @@ void TestLanguage::propertiesBlocks() } } +void TestLanguage::propertiesBlockInGroup() +{ + bool exceptionCaught = false; + try { + defaultParameters.setProjectFilePath(testProject("properties-block-in-group.qbs")); + const TopLevelProjectPtr project = loader->loadProject(defaultParameters); + QVERIFY(project); + QCOMPARE(project->allProducts().count(), 1); + const ResolvedProductConstPtr product = project->allProducts().first(); + const auto groupIt = std::find_if(product->groups.constBegin(), product->groups.constEnd(), + [](const GroupConstPtr &g) { return g->name == "the group"; }); + QVERIFY(groupIt != product->groups.constEnd()); + const QVariantMap propertyMap = (*groupIt)->properties->value(); + const QVariantList value = PropertyFinder().propertyValues(propertyMap, "dummy", "defines"); + QStringList stringListValue; + std::transform(value.constBegin(), value.constEnd(), std::back_inserter(stringListValue), + [](const QVariant &v) { return v.toString(); }); + QCOMPARE(stringListValue, QStringList() << "BASEDEF" << "FEATURE_ENABLED"); + } catch (const ErrorInfo &e) { + exceptionCaught = true; + qDebug() << e.toString(); + } + QCOMPARE(exceptionCaught, false); +} + void TestLanguage::qbsPropertiesInProjectCondition() { bool exceptionCaught = false; diff --git a/src/lib/corelib/language/tst_language.h b/src/lib/corelib/language/tst_language.h index 4442c5a73..6d4bfee99 100644 --- a/src/lib/corelib/language/tst_language.h +++ b/src/lib/corelib/language/tst_language.h @@ -106,6 +106,7 @@ private slots: void profileValuesAndOverriddenValues(); void propertiesBlocks_data(); void propertiesBlocks(); + void propertiesBlockInGroup(); void qbsPropertiesInProjectCondition(); void defaultValue(); void defaultValue_data(); -- cgit v1.2.3