aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChristian Kandeler <christian.kandeler@qt.io>2016-12-02 10:14:11 +0100
committerChristian Kandeler <christian.kandeler@qt.io>2016-12-02 12:30:52 +0000
commit4be3a8c2634c57589ff5521d6dbdf5e8c5f9fbcf (patch)
tree4701b4992163add740fcadabf3ef22a524792e73
parent269ee96ab9eadae10eb7482109a17f734c7232c1 (diff)
ModuleLoader: Check the names of PropertyOptions items
We must uphold the invariant that all property declarations refer to properties that actually exist. Task-number: QBS-1065 Change-Id: I3f6f4af2837b086c3afff33bed37bb79fda972a3 Reviewed-by: Joerg Bornemann <joerg.bornemann@qt.io>
-rw-r--r--src/lib/corelib/language/moduleloader.cpp5
-rw-r--r--src/lib/corelib/language/testdata/erroneous/invalid-property-option.qbs5
-rw-r--r--src/lib/corelib/language/testdata/erroneous/modules/module-with-wrong-property-option/m.qbs9
-rw-r--r--src/lib/corelib/language/tst_language.cpp2
-rw-r--r--tests/auto/blackbox/testdata/deprecated-property/modules/themodule/m.qbs1
5 files changed, 22 insertions, 0 deletions
diff --git a/src/lib/corelib/language/moduleloader.cpp b/src/lib/corelib/language/moduleloader.cpp
index ab4c0026b..873e10412 100644
--- a/src/lib/corelib/language/moduleloader.cpp
+++ b/src/lib/corelib/language/moduleloader.cpp
@@ -938,6 +938,10 @@ void ModuleLoader::handlePropertyOptions(Item *optionsItem)
throw ErrorInfo(Tr::tr("PropertyOptions item needs a name property"),
optionsItem->location());
}
+ if (!optionsItem->parent()->hasProperty(name)) {
+ throw ErrorInfo(Tr::tr("PropertyOptions item refers to non-existing property '%1'")
+ .arg(name), optionsItem->location());
+ }
const QString description = m_evaluator->stringValue(optionsItem, QLatin1String("description"));
const auto removalVersion = Version::fromString(m_evaluator->stringValue(optionsItem,
QLatin1String("removalVersion")));
@@ -1241,6 +1245,7 @@ void ModuleLoader::adjustDefiningItemsInGroupModuleInstances(const Item::Module
int prototypeChainLen = 0;
do {
instanceWithProperty = instanceWithProperty->prototype();
+ QBS_CHECK(instanceWithProperty);
++prototypeChainLen;
propValue = instanceWithProperty->properties().value(propName);
} while (!propValue);
diff --git a/src/lib/corelib/language/testdata/erroneous/invalid-property-option.qbs b/src/lib/corelib/language/testdata/erroneous/invalid-property-option.qbs
new file mode 100644
index 000000000..6e74faf8a
--- /dev/null
+++ b/src/lib/corelib/language/testdata/erroneous/invalid-property-option.qbs
@@ -0,0 +1,5 @@
+import qbs
+
+Product {
+ Depends { name: "module-with-wrong-property-option" }
+}
diff --git a/src/lib/corelib/language/testdata/erroneous/modules/module-with-wrong-property-option/m.qbs b/src/lib/corelib/language/testdata/erroneous/modules/module-with-wrong-property-option/m.qbs
new file mode 100644
index 000000000..8ea67f2c5
--- /dev/null
+++ b/src/lib/corelib/language/testdata/erroneous/modules/module-with-wrong-property-option/m.qbs
@@ -0,0 +1,9 @@
+import qbs
+
+Module {
+ property string someProp
+ PropertyOptions {
+ name: "s0meProp"
+ description: "Oops, spelt the property name wrong"
+ }
+}
diff --git a/src/lib/corelib/language/tst_language.cpp b/src/lib/corelib/language/tst_language.cpp
index 3af8e51d8..9823a8d34 100644
--- a/src/lib/corelib/language/tst_language.cpp
+++ b/src/lib/corelib/language/tst_language.cpp
@@ -564,6 +564,8 @@ void TestLanguage::erroneousFiles_data()
"component of the name of module 'prefix2.suffix'";
QTest::newRow("conflicting-properties-in-export-items")
<< "Export item in inherited item redeclares property 'theProp' with different type.";
+ QTest::newRow("invalid-property-option")
+ << "PropertyOptions item refers to non-existing property 's0meProp'";
}
void TestLanguage::erroneousFiles()
diff --git a/tests/auto/blackbox/testdata/deprecated-property/modules/themodule/m.qbs b/tests/auto/blackbox/testdata/deprecated-property/modules/themodule/m.qbs
index f7296da93..47f1ea664 100644
--- a/tests/auto/blackbox/testdata/deprecated-property/modules/themodule/m.qbs
+++ b/tests/auto/blackbox/testdata/deprecated-property/modules/themodule/m.qbs
@@ -3,6 +3,7 @@ import qbs
Module {
property bool newProp
property bool oldProp
+ property bool veryOldProp
PropertyOptions {
name: "newProp"