From 4be3a8c2634c57589ff5521d6dbdf5e8c5f9fbcf Mon Sep 17 00:00:00 2001 From: Christian Kandeler Date: Fri, 2 Dec 2016 10:14:11 +0100 Subject: 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 --- src/lib/corelib/language/moduleloader.cpp | 5 +++++ .../language/testdata/erroneous/invalid-property-option.qbs | 5 +++++ .../erroneous/modules/module-with-wrong-property-option/m.qbs | 9 +++++++++ src/lib/corelib/language/tst_language.cpp | 2 ++ .../testdata/deprecated-property/modules/themodule/m.qbs | 1 + 5 files changed, 22 insertions(+) create mode 100644 src/lib/corelib/language/testdata/erroneous/invalid-property-option.qbs create mode 100644 src/lib/corelib/language/testdata/erroneous/modules/module-with-wrong-property-option/m.qbs 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" -- cgit v1.2.3