diff options
author | Christian Kandeler <christian.kandeler@qt.io> | 2016-12-02 10:14:11 +0100 |
---|---|---|
committer | Christian Kandeler <christian.kandeler@qt.io> | 2016-12-02 12:30:52 +0000 |
commit | 4be3a8c2634c57589ff5521d6dbdf5e8c5f9fbcf (patch) | |
tree | 4701b4992163add740fcadabf3ef22a524792e73 | |
parent | 269ee96ab9eadae10eb7482109a17f734c7232c1 (diff) | |
download | qbs-4be3a8c2634c57589ff5521d6dbdf5e8c5f9fbcf.tar.gz |
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>
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" |