diff options
author | Ivan Komissarov <abbapoh@gmail.com> | 2020-06-14 19:39:37 +0200 |
---|---|---|
committer | Ivan Komissarov <ABBAPOH@gmail.com> | 2020-10-28 09:36:20 +0000 |
commit | d2c0d37e421552dc86419651bb33ff64dda6283a (patch) | |
tree | 4f9c8a452e732d417dd6526b606324525560e22d /src/lib/corelib/language/projectresolver.cpp | |
parent | 99d52feb0b90097457c71324801352f6f844ed13 (diff) |
Implement missing check for allowed values in PropertyOptions
========== Performance data for Resolving ==========
Old instruction count: 10195378481
New instruction count: 10238464294
Relative change: 0 %
[ChangeLog] Qbs now checks string and stringList values according to the
allowedValues property in PropertyOptions
Change-Id: Ide88987c74b35f4172ffaf71aacd991536131ee5
Reviewed-by: Richard Weickelt <richard@weickelt.de>
Reviewed-by: Christian Kandeler <christian.kandeler@qt.io>
Diffstat (limited to 'src/lib/corelib/language/projectresolver.cpp')
-rw-r--r-- | src/lib/corelib/language/projectresolver.cpp | 40 |
1 files changed, 39 insertions, 1 deletions
diff --git a/src/lib/corelib/language/projectresolver.cpp b/src/lib/corelib/language/projectresolver.cpp index 4e8e94b4e..570b3513f 100644 --- a/src/lib/corelib/language/projectresolver.cpp +++ b/src/lib/corelib/language/projectresolver.cpp @@ -1778,6 +1778,7 @@ void ProjectResolver::evaluateProperty(const Item *item, const QString &propName } else if (pd.type() == PropertyDeclaration::VariantList) { v = v.toList(); } + checkAllowedValues(v, propValue->location(), pd, propName); result[propName] = v; break; } @@ -1788,15 +1789,52 @@ void ProjectResolver::evaluateProperty(const Item *item, const QString &propName VariantValuePtr vvp = std::static_pointer_cast<VariantValue>(propValue); QVariant v = vvp->value(); - if (v.isNull() && !item->propertyDeclaration(propName).isScalar()) // QTBUG-51237 + const PropertyDeclaration pd = item->propertyDeclaration(propName); + if (v.isNull() && !pd.isScalar()) // QTBUG-51237 v = QStringList(); + checkAllowedValues(v, propValue->location(), pd, propName); result[propName] = v; break; } } } +void ProjectResolver::checkAllowedValues( + const QVariant &value, const CodeLocation &loc, const PropertyDeclaration &decl, + const QString &key) const +{ + const auto type = decl.type(); + if (type != PropertyDeclaration::String && type != PropertyDeclaration::StringList) + return; + + if (value.isNull()) + return; + + const auto &allowedValues = decl.allowedValues(); + if (allowedValues.isEmpty()) + return; + + const auto checkValue = [this, &loc, &allowedValues, &key](const QString &value) + { + if (!allowedValues.contains(value)) { + const auto message = Tr::tr("Value '%1' is not allowed for property '%2'.") + .arg(value, key); + ErrorInfo error(message, loc); + handlePropertyError(error, m_setupParams, m_logger); + } + }; + + if (type == PropertyDeclaration::StringList) { + const auto strings = value.toStringList(); + for (const auto &string: strings) { + checkValue(string); + } + } else if (type == PropertyDeclaration::String) { + checkValue(value.toString()); + } +} + void ProjectResolver::collectPropertiesForExportItem(const QualifiedId &moduleName, const ValuePtr &value, Item *moduleInstance, QVariantMap &moduleProps) { |