aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--doc/qbs.qdoc6
-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
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();
}