diff options
Diffstat (limited to 'src/lib/corelib/language/propertydeclaration.cpp')
-rw-r--r-- | src/lib/corelib/language/propertydeclaration.cpp | 56 |
1 files changed, 56 insertions, 0 deletions
diff --git a/src/lib/corelib/language/propertydeclaration.cpp b/src/lib/corelib/language/propertydeclaration.cpp index 14ed52d1e..2dbe41afd 100644 --- a/src/lib/corelib/language/propertydeclaration.cpp +++ b/src/lib/corelib/language/propertydeclaration.cpp @@ -42,14 +42,46 @@ #include "deprecationinfo.h" #include <api/languageinfo.h> +#include <logging/translator.h> + +#include <tools/error.h> +#include <tools/qttools.h> #include <tools/stringconstants.h> +#include <QtCore/qmetatype.h> #include <QtCore/qshareddata.h> #include <QtCore/qstringlist.h> +#include <QtCore/qvariant.h> namespace qbs { namespace Internal { +// returns QMetaType::UnknownType for types that do not need conversion +static QMetaType::Type variantType(PropertyDeclaration::Type t) +{ + switch (t) { + case PropertyDeclaration::UnknownType: + break; + case PropertyDeclaration::Boolean: + return QMetaType::Bool; + case PropertyDeclaration::Integer: + return QMetaType::Int; + case PropertyDeclaration::Path: + return QMetaType::QString; + case PropertyDeclaration::PathList: + return QMetaType::QStringList; + case PropertyDeclaration::String: + return QMetaType::QString; + case PropertyDeclaration::StringList: + return QMetaType::QStringList; + case PropertyDeclaration::VariantList: + return QMetaType::QVariantList; + case PropertyDeclaration::Variant: + break; + } + return QMetaType::UnknownType; +} + class PropertyDeclarationData : public QSharedData { public: @@ -243,5 +275,29 @@ void PropertyDeclaration::setDeprecationInfo(const DeprecationInfo &deprecationI d->deprecationInfo = deprecationInfo; } +// see also: EvaluatorScriptClass::convertToPropertyType() +QVariant PropertyDeclaration::convertToPropertyType(const QVariant &v, Type t, + const QStringList &namePrefix, const QString &key) +{ + if (v.isNull() || !v.isValid()) + return v; + const auto vt = variantType(t); + if (vt == QMetaType::UnknownType) + return v; + + // Handle the foo,bar,bla stringlist syntax. + if (t == PropertyDeclaration::StringList && v.userType() == QMetaType::QString) + return v.toString().split(QLatin1Char(',')); + + QVariant c = v; + if (!qVariantConvert(c, vt)) { + QStringList name = namePrefix; + name << key; + throw ErrorInfo(Tr::tr("Value '%1' of property '%2' has incompatible type.") + .arg(v.toString(), name.join(QLatin1Char('.')))); + } + return c; +} + } // namespace Internal } // namespace qbs |