diff options
author | Joerg Bornemann <joerg.bornemann@digia.com> | 2014-07-09 14:54:13 +0200 |
---|---|---|
committer | Christian Kandeler <christian.kandeler@digia.com> | 2014-07-10 10:47:44 +0200 |
commit | 3b50726352fd1b1c5fc5424856ccb9446c87a30f (patch) | |
tree | 41fc8c9f1d0158b60aca9ccdee978b4d041f5f1f /src/lib/corelib/language | |
parent | 89513bce4f2996be93bdb30b32a1ef844d9cec36 (diff) |
prohibit duplicate source files in enabled groups
Having the same source files in more than one enabled group is
considered an error. There's no proper way to define conflict
resolution rules.
Task-number: QBS-593
Change-Id: I93d25b7e3484ce3a4da4e10299e1a3bf10951ca2
Reviewed-by: Christian Kandeler <christian.kandeler@digia.com>
Diffstat (limited to 'src/lib/corelib/language')
6 files changed, 35 insertions, 16 deletions
diff --git a/src/lib/corelib/language/projectresolver.cpp b/src/lib/corelib/language/projectresolver.cpp index ebe60e032..d61956249 100644 --- a/src/lib/corelib/language/projectresolver.cpp +++ b/src/lib/corelib/language/projectresolver.cpp @@ -533,12 +533,20 @@ void ProjectResolver::resolveGroup(Item *item, ProjectContext *projectContext) group->fileTags, group->overrideTags, group->files); ErrorInfo fileError; if (group->enabled) { - foreach (const SourceArtifactConstPtr &a, group->files) { + const ValuePtr filesValue = item->property(QLatin1String("files")); + foreach (const SourceArtifactConstPtr &a, group->allFiles()) { if (!FileInfo(a->absoluteFilePath).exists()) { fileError.append(Tr::tr("File '%1' does not exist.") .arg(a->absoluteFilePath), item->property(QLatin1String("files"))->location()); } + CodeLocation &loc = m_productContext->sourceArtifactLocations[a->absoluteFilePath]; + if (loc.isValid()) { + fileError.append(Tr::tr("Duplicate source file '%1' at %2 and %3.") + .arg(a->absoluteFilePath, loc.toString(), + filesValue->location().toString())); + } + loc = filesValue->location(); } if (fileError.hasError()) throw ErrorInfo(fileError); diff --git a/src/lib/corelib/language/projectresolver.h b/src/lib/corelib/language/projectresolver.h index 630786db7..422f4d4ce 100644 --- a/src/lib/corelib/language/projectresolver.h +++ b/src/lib/corelib/language/projectresolver.h @@ -82,6 +82,7 @@ private: Item *item; typedef QPair<ArtifactPropertiesPtr, CodeLocation> ArtifactPropertiesInfo; QHash<QStringList, ArtifactPropertiesInfo> artifactPropertiesPerFilter; + QHash<QString, CodeLocation> sourceArtifactLocations; }; struct ModuleContext diff --git a/src/lib/corelib/language/testdata/erroneous/duplicate_sources.qbs b/src/lib/corelib/language/testdata/erroneous/duplicate_sources.qbs new file mode 100644 index 000000000..0546ac2e7 --- /dev/null +++ b/src/lib/corelib/language/testdata/erroneous/duplicate_sources.qbs @@ -0,0 +1,8 @@ +import qbs + +Product { + files: ["main.cpp"] + Group { + files: ["main.cpp"] + } +} diff --git a/src/lib/corelib/language/testdata/erroneous/duplicate_sources_wildcards.qbs b/src/lib/corelib/language/testdata/erroneous/duplicate_sources_wildcards.qbs new file mode 100644 index 000000000..a51aa26d1 --- /dev/null +++ b/src/lib/corelib/language/testdata/erroneous/duplicate_sources_wildcards.qbs @@ -0,0 +1,8 @@ +import qbs + +Product { + files: ["*.qbs"] + Group { + files: ["duplicate_sources_wildcards.qbs"] + } +} diff --git a/src/lib/corelib/language/testdata/filetags.qbs b/src/lib/corelib/language/testdata/filetags.qbs index 38182e5f1..eb1cf57c6 100644 --- a/src/lib/corelib/language/testdata/filetags.qbs +++ b/src/lib/corelib/language/testdata/filetags.qbs @@ -44,30 +44,18 @@ Project { Product { name: "override_file_tag_via_group" - files: "main.cpp" // gets file tag "cpp" through the FileTagger Group { - files: product.files + files: "main.cpp" // gets file tag "cpp" through the FileTagger fileTags: ["c++"] } } Product { name: "add_file_tag_via_group" - files: "main.cpp" Group { overrideTags: false files: "main.cpp" fileTags: ["zzz"] } } - - Product { - name: "add_file_tag_via_group_and_file_ref" - files: "main.cpp" - Group { - overrideTags: false - files: product.files - fileTags: ["zzz"] - } - } } diff --git a/src/lib/corelib/language/tst_language.cpp b/src/lib/corelib/language/tst_language.cpp index 333968450..48252a5b4 100644 --- a/src/lib/corelib/language/tst_language.cpp +++ b/src/lib/corelib/language/tst_language.cpp @@ -368,6 +368,13 @@ void TestLanguage::erroneousFiles_data() << "Items of type 'Project' cannot contain items of type 'Depends'."; QTest::newRow("conflicting_fileTagsFilter") << "Conflicting fileTagsFilter in Group items"; + QTest::newRow("duplicate_sources") + << "Duplicate source file '.*main.cpp' " + "at .*duplicate_sources.qbs:4:12 and .*duplicate_sources.qbs:6:16."; + QTest::newRow("duplicate_sources_wildcards") + << "Duplicate source file '.*duplicate_sources_wildcards.qbs' " + "at .*duplicate_sources_wildcards.qbs:4:12 " + "and .*duplicate_sources_wildcards.qbs:6:16."; } void TestLanguage::erroneousFiles() @@ -378,7 +385,7 @@ void TestLanguage::erroneousFiles() defaultParameters.setProjectFilePath(testProject("/erroneous/") + fileName); loader->loadProject(defaultParameters); } catch (const ErrorInfo &e) { - if (!e.toString().contains(errorMessage)) { + if (!e.toString().contains(QRegExp(errorMessage))) { qDebug() << "Message: " << e.toString(); qDebug() << "Expected: " << errorMessage; QFAIL("Unexpected error message."); @@ -1234,7 +1241,6 @@ void TestLanguage::fileTags_data() QTest::newRow("set_file_tag_via_group") << 2 << (QStringList() << "c++"); QTest::newRow("override_file_tag_via_group") << 2 << (QStringList() << "c++"); QTest::newRow("add_file_tag_via_group") << 2 << (QStringList() << "cpp" << "zzz"); - QTest::newRow("add_file_tag_via_group_and_file_ref") << 2 << (QStringList() << "cpp" << "zzz"); QTest::newRow("cleanup") << 0 << QStringList(); } |