diff options
-rw-r--r-- | doc/qbs.qdoc | 6 | ||||
-rw-r--r-- | src/lib/corelib/language/projectresolver.cpp | 10 | ||||
-rw-r--r-- | src/lib/corelib/language/projectresolver.h | 1 | ||||
-rw-r--r-- | src/lib/corelib/language/testdata/erroneous/duplicate_sources.qbs | 8 | ||||
-rw-r--r-- | src/lib/corelib/language/testdata/erroneous/duplicate_sources_wildcards.qbs | 8 | ||||
-rw-r--r-- | src/lib/corelib/language/testdata/filetags.qbs | 14 | ||||
-rw-r--r-- | src/lib/corelib/language/tst_language.cpp | 10 |
7 files changed, 38 insertions, 19 deletions
diff --git a/doc/qbs.qdoc b/doc/qbs.qdoc index fb5865e59..e64e822e3 100644 --- a/doc/qbs.qdoc +++ b/doc/qbs.qdoc @@ -635,11 +635,11 @@ \code Product { Depends: "cpp" - files: ["main.cpp"] // Gets the file tag "cpp" through a FileTagger item. Group { overrideTags: false // The overrideTags property defaults to true. - files: ["main.cpp"] - fileTags: ["foobar"] // Gets the file tag "foobar" in addition to "cpp". + fileTags: ["foobar"] + files: ["main.cpp"] // Gets the file tag "cpp" through a FileTagger item and + // "foobar" from this group's fileTags property. } // ... } 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(); } |