diff options
author | Joerg Bornemann <joerg.bornemann@digia.com> | 2014-05-16 16:48:44 +0200 |
---|---|---|
committer | Christian Kandeler <christian.kandeler@digia.com> | 2014-05-16 18:07:44 +0200 |
commit | 1b2af7ac833fc6bc64997dc3410b632bc810de69 (patch) | |
tree | 4489c9b2a7241ec8ed0e263a35b4422dc4b3949b | |
parent | 97c589b44677733fb2b2aa7ba521faebf3241f3b (diff) |
yield error for conflicting Groups
Groups with the same fileTagsFilter that are defined in the same
file yield an error now.
Preparation to fix QBS-424.
Change-Id: Ifa85a0b6c7c9ab19946b6e339d2771164e926378
Reviewed-by: Christian Kandeler <christian.kandeler@digia.com>
4 files changed, 30 insertions, 0 deletions
diff --git a/src/lib/corelib/language/projectresolver.cpp b/src/lib/corelib/language/projectresolver.cpp index 346658bf2..8b58912ed 100644 --- a/src/lib/corelib/language/projectresolver.cpp +++ b/src/lib/corelib/language/projectresolver.cpp @@ -457,6 +457,17 @@ void ProjectResolver::resolveGroup(Item *item, ProjectContext *projectContext) if (Q_UNLIKELY(!files.isEmpty())) throw ErrorInfo(Tr::tr("Group.files and Group.fileTagsFilters are exclusive."), item->location()); + + ProductContext::ArtifactPropertiesInfo apinfo + = m_productContext->artifactPropertiesPerFilter.value(fileTagsFilter); + if (apinfo.first) { + if (apinfo.second.fileName() == item->location().fileName()) { + ErrorInfo error(Tr::tr("Conflicting fileTagsFilter in Group items.")); + error.append(Tr::tr("First item"), apinfo.second); + error.append(Tr::tr("Second item"), item->location()); + throw error; + } + } if (!isEnabled) return; ArtifactPropertiesPtr aprops = ArtifactProperties::create(); @@ -465,6 +476,8 @@ void ProjectResolver::resolveGroup(Item *item, ProjectContext *projectContext) cfg->setValue(evaluateModuleValues(item)); aprops->setPropertyMapInternal(cfg); m_productContext->product->artifactProperties += aprops; + m_productContext->artifactPropertiesPerFilter.insert(fileTagsFilter, + ProductContext::ArtifactPropertiesInfo(aprops, item->location())); return; } if (Q_UNLIKELY(files.isEmpty() && !item->hasProperty(QLatin1String("files")))) { diff --git a/src/lib/corelib/language/projectresolver.h b/src/lib/corelib/language/projectresolver.h index fa6569cd5..630786db7 100644 --- a/src/lib/corelib/language/projectresolver.h +++ b/src/lib/corelib/language/projectresolver.h @@ -80,6 +80,8 @@ private: QString buildDirectory; FileTags additionalFileTags; Item *item; + typedef QPair<ArtifactPropertiesPtr, CodeLocation> ArtifactPropertiesInfo; + QHash<QStringList, ArtifactPropertiesInfo> artifactPropertiesPerFilter; }; struct ModuleContext diff --git a/src/lib/corelib/language/testdata/erroneous/conflicting_fileTagsFilter.qbs b/src/lib/corelib/language/testdata/erroneous/conflicting_fileTagsFilter.qbs new file mode 100644 index 000000000..54b3343e4 --- /dev/null +++ b/src/lib/corelib/language/testdata/erroneous/conflicting_fileTagsFilter.qbs @@ -0,0 +1,13 @@ +import qbs 1.0 + +Application { + Group { + fileTagsFilter: "application" + qbs.install: true + } + Group { + fileTagsFilter: "application" + qbs.install: false + } +} + diff --git a/src/lib/corelib/language/tst_language.cpp b/src/lib/corelib/language/tst_language.cpp index 061e5c227..6873391e9 100644 --- a/src/lib/corelib/language/tst_language.cpp +++ b/src/lib/corelib/language/tst_language.cpp @@ -370,6 +370,8 @@ void TestLanguage::erroneousFiles_data() << "Unexpected item type 'Narf'"; QTest::newRow("invalid_child_item_type") << "Items of type 'Project' cannot contain items of type 'Depends'."; + QTest::newRow("conflicting_fileTagsFilter") + << "Conflicting fileTagsFilter in Group items"; } void TestLanguage::erroneousFiles() |