aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--examples/quick/tableview/gameoflife/gameoflifemodel.h2
-rw-r--r--src/qmlcompiler/qqmljscodegenerator.cpp17
-rw-r--r--tests/auto/qml/qjsengine/tst_qjsengine.cpp3
-rw-r--r--tests/auto/qml/qmlcppcodegen/data/stringLength.qml8
-rw-r--r--tests/auto/qml/qmlcppcodegen/tst_qmlcppcodegen.cpp1
-rw-r--r--tests/auto/qml/qqmlecmascript/testtypes.h23
-rw-r--r--tests/auto/qml/qqmllanguage/testtypes.h28
-rw-r--r--tests/auto/qml/qqmlmetatype/tst_qqmlmetatype.cpp4
-rw-r--r--tests/benchmarks/qml/holistic/testtypes.h5
9 files changed, 59 insertions, 32 deletions
diff --git a/examples/quick/tableview/gameoflife/gameoflifemodel.h b/examples/quick/tableview/gameoflife/gameoflifemodel.h
index dc5f67729a..f8a33c9d58 100644
--- a/examples/quick/tableview/gameoflife/gameoflifemodel.h
+++ b/examples/quick/tableview/gameoflife/gameoflifemodel.h
@@ -15,11 +15,11 @@ class GameOfLifeModel : public QAbstractTableModel
Q_OBJECT
QML_ELEMENT
- Q_ENUMS(Roles)
public:
enum Roles {
CellRole
};
+ Q_ENUM(Roles)
QHash<int, QByteArray> roleNames() const override {
return {
diff --git a/src/qmlcompiler/qqmljscodegenerator.cpp b/src/qmlcompiler/qqmljscodegenerator.cpp
index dbaec2060d..35902b889a 100644
--- a/src/qmlcompiler/qqmljscodegenerator.cpp
+++ b/src/qmlcompiler/qqmljscodegenerator.cpp
@@ -1575,7 +1575,9 @@ void QQmlJSCodeGenerator::generate_GetLookupHelper(int index)
: u"QQmlPrivate::AOTCompiledContext::InvalidStringId"_s;
const auto accumulatorIn = m_state.accumulatorIn();
const QQmlJSRegisterContent scope = m_state.accumulatorOut().scope();
- const bool isReferenceType = scope.containedType()->isReferenceType();
+ const QQmlJSRegisterContent originalScope
+ = scope.original().isValid() ? scope.original() : scope;
+ const bool isReferenceType = originalScope.containedType()->isReferenceType();
switch (m_state.accumulatorOut().variant()) {
case QQmlJSRegisterContent::Attachment: {
@@ -1637,8 +1639,9 @@ void QQmlJSCodeGenerator::generate_GetLookupHelper(int index)
const QString preparation = getLookupPreparation(
m_state.accumulatorOut(), m_state.accumulatorVariableOut, index);
generateLookup(lookup, initialization, preparation);
- } else if ((scope.containedType()->accessSemantics() == QQmlJSScope::AccessSemantics::Sequence
- || scope.contains(m_typeResolver->stringType()))
+ } else if ((originalScope.containedType()->accessSemantics()
+ == QQmlJSScope::AccessSemantics::Sequence
+ || originalScope.contains(m_typeResolver->stringType()))
&& m_jsUnitGenerator->lookupName(index) == u"length"_s) {
const QQmlJSScope::ConstPtr stored = accumulatorIn.storedType();
if (stored->isListProperty()) {
@@ -1656,6 +1659,14 @@ void QQmlJSCodeGenerator::generate_GetLookupHelper(int index)
m_state.accumulatorOut(),
m_state.accumulatorVariableIn + u".length()"_s)
+ u";\n"_s;
+ } else if (originalScope.contains(m_typeResolver->stringType())) {
+ m_body += m_state.accumulatorVariableOut + u" = "_s
+ + conversion(
+ m_typeResolver->sizeType(), m_state.accumulatorOut(),
+ conversion(m_state.accumulatorIn(), m_typeResolver->stringType(),
+ m_state.accumulatorVariableIn)
+ + u".length()"_s)
+ + u";\n"_s;
} else {
REJECT(u"access to 'length' property of sequence wrapped in non-sequence"_s);
}
diff --git a/tests/auto/qml/qjsengine/tst_qjsengine.cpp b/tests/auto/qml/qjsengine/tst_qjsengine.cpp
index c1c50594d5..2f855213ba 100644
--- a/tests/auto/qml/qjsengine/tst_qjsengine.cpp
+++ b/tests/auto/qml/qjsengine/tst_qjsengine.cpp
@@ -1073,12 +1073,13 @@ public:
One,
Two
};
+ Q_ENUM(Enum1)
enum Enum2 {
A = 0,
B,
C
};
- Q_ENUMS(Enum1 Enum2)
+ Q_ENUM(Enum2)
Q_INVOKABLE TestQMetaObject() {}
Q_INVOKABLE TestQMetaObject(int)
diff --git a/tests/auto/qml/qmlcppcodegen/data/stringLength.qml b/tests/auto/qml/qmlcppcodegen/data/stringLength.qml
index df9bbb7f2d..d09f032d65 100644
--- a/tests/auto/qml/qmlcppcodegen/data/stringLength.qml
+++ b/tests/auto/qml/qmlcppcodegen/data/stringLength.qml
@@ -1,6 +1,14 @@
+pragma Strict
import QtQml
QtObject {
objectName: "astringb"
property int stringLength: objectName.length
+ property string a: {
+ const value = objectName;
+ if (value && value.length > 0) {
+ return value;
+ }
+ return "no"
+ }
}
diff --git a/tests/auto/qml/qmlcppcodegen/tst_qmlcppcodegen.cpp b/tests/auto/qml/qmlcppcodegen/tst_qmlcppcodegen.cpp
index a90e2a6050..4038376897 100644
--- a/tests/auto/qml/qmlcppcodegen/tst_qmlcppcodegen.cpp
+++ b/tests/auto/qml/qmlcppcodegen/tst_qmlcppcodegen.cpp
@@ -5733,6 +5733,7 @@ void tst_QmlCppCodegen::stringLength()
QScopedPointer<QObject> object(component.create());
QVERIFY(!object.isNull());
QCOMPARE(object->property("stringLength").toInt(), 8);
+ QCOMPARE(object->property("a"), u"astringb"_s);
}
void tst_QmlCppCodegen::stringToByteArray()
diff --git a/tests/auto/qml/qqmlecmascript/testtypes.h b/tests/auto/qml/qqmlecmascript/testtypes.h
index e86fcbe947..bb4606b769 100644
--- a/tests/auto/qml/qqmlecmascript/testtypes.h
+++ b/tests/auto/qml/qqmlecmascript/testtypes.h
@@ -72,19 +72,15 @@ private:
class MyEnumContainer : public QObject
{
Q_OBJECT
- Q_ENUMS(RelatedEnum)
public:
enum RelatedEnum { RelatedInvalid = -1, RelatedValue = 42, MultiplyDefined = 666 };
+ Q_ENUM(RelatedEnum)
};
class MyQmlObject : public QObject
{
Q_OBJECT
- Q_ENUMS(MyEnum)
- Q_ENUMS(MyEnum2)
- Q_ENUMS(MyEnum3)
- Q_ENUMS(MyEnumContainer::RelatedEnum)
Q_PROPERTY(int deleteOnSet READ deleteOnSet WRITE setDeleteOnSet)
Q_PROPERTY(bool trueProperty READ trueProperty CONSTANT)
Q_PROPERTY(bool falseProperty READ falseProperty CONSTANT)
@@ -110,8 +106,13 @@ public:
MyQmlObject(): myinvokableObject(0), m_methodCalled(false), m_methodIntCalled(false), m_object(0), m_value(0), m_resetProperty(13), m_intProperty(0), m_buttons(0) {}
enum MyEnum { EnumValue1 = 0, EnumValue2 = 1 };
+ Q_ENUM(MyEnum)
+
enum MyEnum2 { EnumValue3 = 2, EnumValue4 = 3, EnumValue5 = -1 };
+ Q_ENUM(MyEnum2)
+
enum MyEnum3 { MultiplyDefined = 333 };
+ Q_ENUM(MyEnum3)
bool trueProperty() const { return true; }
bool falseProperty() const { return false; }
@@ -571,9 +572,6 @@ private:
class MyTypeObject : public QObject
{
Q_OBJECT
- Q_ENUMS(MyEnum)
- Q_ENUMS(MyEnumContainer::RelatedEnum)
- Q_FLAGS(MyFlags)
Q_PROPERTY(QString id READ id WRITE setId)
Q_PROPERTY(QObject *objectProperty READ objectProperty WRITE setObjectProperty)
@@ -636,6 +634,7 @@ public:
enum MyFlag { FlagVal1 = 0x01, FlagVal2 = 0x02, FlagVal3 = 0x04 };
Q_DECLARE_FLAGS(MyFlags, MyFlag)
+ Q_FLAG(MyFlags)
MyFlags flagPropertyValue;
MyFlags flagProperty() const {
return flagPropertyValue;
@@ -645,6 +644,7 @@ public:
}
enum MyEnum { EnumVal1, EnumVal2 };
+ Q_ENUM(MyEnum)
MyEnum enumPropertyValue;
MyEnum enumProperty() const {
return enumPropertyValue;
@@ -882,20 +882,20 @@ struct CompletelyUnknown;
class SingletonWithEnum : public QObject
{
Q_OBJECT
- Q_ENUMS(TestEnum)
public:
enum TestEnum {
TestValue = 42,
TestValue_MinusOne = -1
};
+ Q_ENUM(TestEnum)
};
class MyInvokableObject : public MyInvokableBaseObject
{
Q_OBJECT
- Q_ENUMS(TestEnum)
public:
enum TestEnum { EnumValue1, EnumValue2 };
+ Q_ENUM(TestEnum)
MyInvokableObject() { reset(); }
int invoked() const { return m_invoked; }
@@ -1353,7 +1353,6 @@ QML_DECLARE_TYPE(ScarceResourceObject)
class testQObjectApi : public QObject
{
Q_OBJECT
- Q_ENUMS(MyEnum)
Q_PROPERTY (int qobjectTestProperty READ qobjectTestProperty NOTIFY qobjectTestPropertyChanged FINAL)
Q_PROPERTY (int qobjectTestWritableProperty READ qobjectTestWritableProperty WRITE setQObjectTestWritableProperty NOTIFY qobjectTestWritablePropertyChanged)
Q_PROPERTY (int qobjectTestWritableFinalProperty READ qobjectTestWritableFinalProperty WRITE setQObjectTestWritableFinalProperty NOTIFY qobjectTestWritableFinalPropertyChanged FINAL)
@@ -1367,6 +1366,8 @@ public:
~testQObjectApi() {}
enum MyEnum { EnumValue1 = 25, EnumValue2 = 42 };
+ Q_ENUM(MyEnum)
+
Q_INVOKABLE int qobjectEnumTestMethod(MyEnum val) { return (static_cast<int>(val) + 5); }
Q_INVOKABLE int qobjectTestMethod(int increment = 1) { m_methodCallCount += increment; return m_methodCallCount; }
diff --git a/tests/auto/qml/qqmllanguage/testtypes.h b/tests/auto/qml/qqmllanguage/testtypes.h
index dfff6efead..1ca39eb434 100644
--- a/tests/auto/qml/qqmllanguage/testtypes.h
+++ b/tests/auto/qml/qqmllanguage/testtypes.h
@@ -282,19 +282,15 @@ private:
class MyEnumContainer : public QObject
{
Q_OBJECT
- Q_ENUMS(RelatedEnum)
public:
enum RelatedEnum { RelatedInvalid = -1, RelatedValue = 42 };
+ Q_ENUM(RelatedEnum)
};
class MyTypeObject : public QObject
{
Q_OBJECT
- Q_ENUMS(MyEnum)
- Q_ENUMS(MyMirroredEnum)
- Q_ENUMS(MyEnumContainer::RelatedEnum)
- Q_FLAGS(MyFlags)
Q_PROPERTY(QString id READ id WRITE setId)
Q_PROPERTY(QObject *objectProperty READ objectProperty WRITE setObjectProperty NOTIFY objectPropertyChanged)
@@ -370,6 +366,7 @@ public:
enum MyFlag { FlagVal1 = 0x01, FlagVal2 = 0x02, FlagVal3 = 0x04 };
Q_DECLARE_FLAGS(MyFlags, MyFlag)
+ Q_FLAG(MyFlags)
MyFlags flagPropertyValue;
MyFlags flagProperty() const {
return flagPropertyValue;
@@ -380,6 +377,8 @@ public:
}
enum MyEnum { EnumVal1, EnumVal2, lowercaseEnumVal };
+ Q_ENUM(MyEnum)
+
MyEnum enumPropertyValue;
MyEnum enumProperty() const {
return enumPropertyValue;
@@ -406,6 +405,8 @@ public:
MirroredEnumVal1 = Qt::AlignLeft,
MirroredEnumVal2 = Qt::AlignRight,
MirroredEnumVal3 = Qt::AlignHCenter };
+ Q_ENUM(MyMirroredEnum)
+
MyMirroredEnum mirroredEnumPropertyValue;
MyMirroredEnum mirroredEnumProperty() const {
return mirroredEnumPropertyValue;
@@ -1241,7 +1242,6 @@ class MyVersion2Class : public QObject
class MyEnum1Class : public QObject
{
Q_OBJECT
- Q_ENUMS(EnumA)
public:
MyEnum1Class() : value(A_Invalid) {}
@@ -1253,6 +1253,7 @@ public:
A_11 = 11,
A_13 = 13
};
+ Q_ENUM(EnumA)
Q_INVOKABLE void setValue(EnumA v) { value = v; }
@@ -1265,8 +1266,6 @@ private:
class MyEnum2Class : public QObject
{
Q_OBJECT
- Q_ENUMS(EnumB)
- Q_ENUMS(EnumE)
public:
MyEnum2Class() : valueA(MyEnum1Class::A_Invalid), valueB(B_Invalid), valueC(Qt::PlainText),
@@ -1280,6 +1279,7 @@ public:
B_31 = 31,
B_37 = 37
};
+ Q_ENUM(EnumB)
enum EnumE
{
@@ -1288,6 +1288,7 @@ public:
E_14 = 14,
E_76 = 76
};
+ Q_ENUM(EnumE)
MyEnum1Class::EnumA getValueA() { return valueA; }
EnumB getValueB() { return valueB; }
@@ -1328,12 +1329,14 @@ class MyEnumDerivedClass : public MyEnum2Class
class MyCompositeBaseType : public QObject
{
Q_OBJECT
- Q_ENUMS(CompositeEnum)
- Q_ENUMS(ScopedCompositeEnum)
public:
enum CompositeEnum { EnumValue0, EnumValue42 = 42 };
+ Q_ENUM(CompositeEnum)
+
enum class ScopedCompositeEnum : int { EnumValue15 = 15 };
+ Q_ENUM(ScopedCompositeEnum)
+
static QObject *qmlAttachedProperties(QObject *parent) { return new QObject(parent); }
};
@@ -1588,13 +1591,14 @@ Q_ENUM_NS(OtherScopedEnum)
class ScopedEnumsWithResolvedNameClash
{
Q_GADGET
- Q_ENUMS(ScopedEnum)
- Q_ENUMS(OtherScopedEnum)
Q_CLASSINFO("RegisterEnumClassesUnscoped", "false")
public:
enum class ScopedEnum : int { ScopedVal1, ScopedVal2, ScopedVal3, OtherScopedEnum };
+ Q_ENUM(ScopedEnum)
+
enum class OtherScopedEnum : int { ScopedVal1, ScopedVal2, ScopedVal3 };
+ Q_ENUM(OtherScopedEnum)
};
class AttachedType : public QObject
diff --git a/tests/auto/qml/qqmlmetatype/tst_qqmlmetatype.cpp b/tests/auto/qml/qqmlmetatype/tst_qqmlmetatype.cpp
index c0fa508acf..a32172c589 100644
--- a/tests/auto/qml/qqmlmetatype/tst_qqmlmetatype.cpp
+++ b/tests/auto/qml/qqmlmetatype/tst_qqmlmetatype.cpp
@@ -388,7 +388,7 @@ public:
ENUM_VALUE_1 = 1,
ENUM_VALUE_2 = 2
};
- Q_ENUMS(Controller1Enum)
+ Q_ENUM(Controller1Enum)
Controller1(QObject *parent = nullptr) : QObject(parent), m_string("Controller #1"),
m_enumVal(ENUM_VALUE_1)
@@ -408,7 +408,7 @@ public:
ENUM_VALUE_1 = 111,
ENUM_VALUE_2 = 222
};
- Q_ENUMS(Controller2Enum)
+ Q_ENUM(Controller2Enum)
Controller2(QObject *parent = nullptr) : QObject(parent), m_string("Controller #2"),
m_enumVal(ENUM_VALUE_1)
diff --git a/tests/benchmarks/qml/holistic/testtypes.h b/tests/benchmarks/qml/holistic/testtypes.h
index bd1d68993e..84304260d2 100644
--- a/tests/benchmarks/qml/holistic/testtypes.h
+++ b/tests/benchmarks/qml/holistic/testtypes.h
@@ -44,8 +44,6 @@ private:
class MyQmlObject : public QObject
{
Q_OBJECT
- Q_ENUMS(MyEnum)
- Q_ENUMS(MyEnum2)
Q_PROPERTY(int deleteOnSet READ deleteOnSet WRITE setDeleteOnSet)
Q_PROPERTY(bool trueProperty READ trueProperty CONSTANT)
Q_PROPERTY(bool falseProperty READ falseProperty CONSTANT)
@@ -62,7 +60,10 @@ public:
MyQmlObject(): myinvokableObject(0), m_methodCalled(false), m_methodIntCalled(false), m_object(0), m_value(0), m_resetProperty(13) {}
enum MyEnum { EnumValue1 = 0, EnumValue2 = 1 };
+ Q_ENUM(MyEnum)
+
enum MyEnum2 { EnumValue3 = 2, EnumValue4 = 3 };
+ Q_ENUM(MyEnum2)
bool trueProperty() const { return true; }
bool falseProperty() const { return false; }