diff options
author | Michael Brasser <mbrasser@ford.com> | 2017-08-17 18:24:39 -0500 |
---|---|---|
committer | Simon Hausmann <simon.hausmann@qt.io> | 2017-08-18 18:03:34 +0000 |
commit | cf1dcc857a5b9fdc55f21508c812bb4110cf93b7 (patch) | |
tree | 81ad9ad112de838786e2450fe72fc97bf23b9674 /src/qml/compiler/qqmlirbuilder.cpp | |
parent | ad63e8491bdf6e85af1a72a44ef643321e6ceec0 (diff) |
Support explicit enum value declaration in QML
Allow declarations such as:
enum MyEnum {
Value1 = 1,
Value2
}
Not all features of C++ enums are supported. Specifically, we don't yet
allow:
* Negative numbers (Value1 = -1)
* Assignment of other values (Value2 = Value1)
Change-Id: I4776f8d86bd0c8688c7dd8b7d4ccb2f72fdfe721
Task-number: QTBUG-14861
Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
Diffstat (limited to 'src/qml/compiler/qqmlirbuilder.cpp')
-rw-r--r-- | src/qml/compiler/qqmlirbuilder.cpp | 11 |
1 files changed, 8 insertions, 3 deletions
diff --git a/src/qml/compiler/qqmlirbuilder.cpp b/src/qml/compiler/qqmlirbuilder.cpp index b58920d812..a26c80e093 100644 --- a/src/qml/compiler/qqmlirbuilder.cpp +++ b/src/qml/compiler/qqmlirbuilder.cpp @@ -45,6 +45,7 @@ #include <private/qqmljslexer_p.h> #include <QCoreApplication> #include <QCryptographicHash> +#include <cmath> #ifndef V4_BOOTSTRAP #include <private/qqmlglobal_p.h> @@ -740,16 +741,20 @@ bool IRBuilder::visit(QQmlJS::AST::UiEnumDeclaration *node) enumeration->enumValues = New<PoolList<EnumValue>>(); QQmlJS::AST::UiEnumMemberList *e = node->members; - int i = -1; while (e) { EnumValue *enumValue = New<EnumValue>(); QString member = e->member.toString(); enumValue->nameIndex = registerString(member); - enumValue->value = ++i; - if (member.at(0).isLower()) COMPILE_EXCEPTION(e->memberToken, tr("Enum names must begin with an upper case letter")); + double part; + if (std::modf(e->value, &part) != 0.0) + COMPILE_EXCEPTION(e->valueToken, tr("Enum value must be an integer")); + if (e->value > std::numeric_limits<qint32>::max() || e->value < std::numeric_limits<qint32>::min()) + COMPILE_EXCEPTION(e->valueToken, tr("Enum value out of range")); + enumValue->value = e->value; + enumValue->location.line = e->memberToken.startLine; enumValue->location.column = e->memberToken.startColumn; enumeration->enumValues->append(enumValue); |