aboutsummaryrefslogtreecommitdiffstats
path: root/src/lib/corelib/language/projectresolver.cpp
diff options
context:
space:
mode:
authorIvan Komissarov <abbapoh@gmail.com>2020-06-14 19:39:37 +0200
committerIvan Komissarov <ABBAPOH@gmail.com>2020-10-28 09:36:20 +0000
commitd2c0d37e421552dc86419651bb33ff64dda6283a (patch)
tree4f9c8a452e732d417dd6526b606324525560e22d /src/lib/corelib/language/projectresolver.cpp
parent99d52feb0b90097457c71324801352f6f844ed13 (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.cpp40
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)
{