aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChristian Kandeler <christian.kandeler@qt.io>2018-10-19 13:40:09 +0200
committerChristian Kandeler <christian.kandeler@qt.io>2018-10-22 08:42:56 +0000
commitd90924f4e94a9da53e1ec2348ddb134bca0a86bf (patch)
tree55db4d3cdf24e6345c0e0f9f2bfe713b48df701b
parentb9e5dd581a06a97d45260fa9b393b135a9f1ad8f (diff)
Do not try to evaluate the properties of non-present modules
It's unnecessary and potentially harmful. Change-Id: Iff5a9a52a7aeb518617104c5eaa41cfeededbea5 Reviewed-by: Nikolai Kosjar <nikolai.kosjar@qt.io>
-rw-r--r--src/lib/corelib/language/projectresolver.cpp2
-rw-r--r--tests/auto/language/testdata/eval-error-in-non-present-module.qbs7
-rw-r--r--tests/auto/language/testdata/modules/broken/broken.qbs19
-rw-r--r--tests/auto/language/tst_language.cpp34
-rw-r--r--tests/auto/language/tst_language.h2
5 files changed, 64 insertions, 0 deletions
diff --git a/src/lib/corelib/language/projectresolver.cpp b/src/lib/corelib/language/projectresolver.cpp
index 97015dae4..59b4efc34 100644
--- a/src/lib/corelib/language/projectresolver.cpp
+++ b/src/lib/corelib/language/projectresolver.cpp
@@ -1620,6 +1620,8 @@ QVariantMap ProjectResolver::evaluateModuleValues(Item *item, bool lookupPrototy
? &m_elapsedTimeModPropEval : nullptr);
QVariantMap moduleValues;
for (const Item::Module &module : item->modules()) {
+ if (!module.item->isPresentModule())
+ continue;
const QString fullName = module.name.toString();
moduleValues[fullName] = evaluateProperties(module.item, lookupPrototype, true);
}
diff --git a/tests/auto/language/testdata/eval-error-in-non-present-module.qbs b/tests/auto/language/testdata/eval-error-in-non-present-module.qbs
new file mode 100644
index 000000000..c112bc6d4
--- /dev/null
+++ b/tests/auto/language/testdata/eval-error-in-non-present-module.qbs
@@ -0,0 +1,7 @@
+import qbs
+
+Product {
+ name: "p"
+ property bool moduleRequired
+ Depends { name: "broken"; required: moduleRequired }
+}
diff --git a/tests/auto/language/testdata/modules/broken/broken.qbs b/tests/auto/language/testdata/modules/broken/broken.qbs
new file mode 100644
index 000000000..b960117cf
--- /dev/null
+++ b/tests/auto/language/testdata/modules/broken/broken.qbs
@@ -0,0 +1,19 @@
+import qbs
+
+Module {
+ Probe {
+ id: theProbe
+
+ property stringList broken
+ property stringList fine
+
+ configure: {
+ broken = [["x"]];
+ fine = ["x"]
+ found = true;
+ }
+ }
+
+ property stringList broken: theProbe.broken
+ property stringList fine: theProbe.fine.filter(function(incl) { return incl != "y"; });
+}
diff --git a/tests/auto/language/tst_language.cpp b/tests/auto/language/tst_language.cpp
index 3a9325c29..ab5aaf759 100644
--- a/tests/auto/language/tst_language.cpp
+++ b/tests/auto/language/tst_language.cpp
@@ -665,6 +665,40 @@ void TestLanguage::enumerateProjectProperties()
QCOMPARE(exceptionCaught, false);
}
+void TestLanguage::evalErrorInNonPresentModule_data()
+{
+ QTest::addColumn<bool>("moduleRequired");
+ QTest::addColumn<QString>("errorMessage");
+
+ QTest::newRow("module required")
+ << true << "broken.qbs:4:5 Element at index 0 of list property 'broken' "
+ "does not have string type";
+ QTest::newRow("module not required") << false << QString();
+}
+
+void TestLanguage::evalErrorInNonPresentModule()
+{
+ QFETCH(bool, moduleRequired);
+ QFETCH(QString, errorMessage);
+ try {
+ SetupProjectParameters params = defaultParameters;
+ params.setProjectFilePath(testProject("eval-error-in-non-present-module.qbs"));
+ QVariantMap overridden{std::make_pair("products.p.moduleRequired", moduleRequired)};
+ params.setOverriddenValues(overridden);
+ TopLevelProjectPtr project = loader->loadProject(params);
+ QVERIFY(errorMessage.isEmpty());
+ QVERIFY(!!project);
+ QHash<QString, ResolvedProductPtr> products = productsFromProject(project);
+ QCOMPARE(products.size(), 1);
+ const ResolvedProductPtr product = products.value("p");
+ QVERIFY(!!product);
+ }
+ catch (const ErrorInfo &e) {
+ QVERIFY(!errorMessage.isEmpty());
+ QVERIFY2(e.toString().contains(errorMessage), qPrintable(e.toString()));
+ }
+}
+
void TestLanguage::defaultValue()
{
bool exceptionCaught = false;
diff --git a/tests/auto/language/tst_language.h b/tests/auto/language/tst_language.h
index d724e5fc6..660c1b9b6 100644
--- a/tests/auto/language/tst_language.h
+++ b/tests/auto/language/tst_language.h
@@ -95,6 +95,8 @@ private slots:
void dottedNames();
void emptyJsFile();
void enumerateProjectProperties();
+ void evalErrorInNonPresentModule_data();
+ void evalErrorInNonPresentModule();
void environmentVariable();
void errorInDisabledProduct();
void erroneousFiles_data();