aboutsummaryrefslogtreecommitdiffstats
path: root/src/lib/corelib/language
diff options
context:
space:
mode:
authorJoerg Bornemann <joerg.bornemann@digia.com>2014-07-09 14:54:13 +0200
committerChristian Kandeler <christian.kandeler@digia.com>2014-07-10 10:47:44 +0200
commit3b50726352fd1b1c5fc5424856ccb9446c87a30f (patch)
tree41fc8c9f1d0158b60aca9ccdee978b4d041f5f1f /src/lib/corelib/language
parent89513bce4f2996be93bdb30b32a1ef844d9cec36 (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')
-rw-r--r--src/lib/corelib/language/projectresolver.cpp10
-rw-r--r--src/lib/corelib/language/projectresolver.h1
-rw-r--r--src/lib/corelib/language/testdata/erroneous/duplicate_sources.qbs8
-rw-r--r--src/lib/corelib/language/testdata/erroneous/duplicate_sources_wildcards.qbs8
-rw-r--r--src/lib/corelib/language/testdata/filetags.qbs14
-rw-r--r--src/lib/corelib/language/tst_language.cpp10
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();
}