aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFabian Kosmale <fabian.kosmale@qt.io>2020-01-29 13:22:35 +0100
committerFabian Kosmale <fabian.kosmale@qt.io>2020-01-29 15:27:15 +0100
commitda9fee11bbf7842d72bbf7c0cd2072b020c71626 (patch)
treeb95ede099d5d2a48a6d8c7eaad14267e6217ef7e
parent4ad7a4d3dabea0c46872be2d6262a9c00e4e5079 (diff)
Required properties: Allow required default properties
This was already possible from C++, this change adds the required changes to the grammar to allow declaring required default properties in QML. Change-Id: I76cb4d70e573bf161676da8295ab257fe95ed4ae Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
-rw-r--r--src/qml/parser/qqmljs.g25
-rw-r--r--tests/auto/qml/qqmlcomponent/data/RequiredDefault.qml5
-rw-r--r--tests/auto/qml/qqmlcomponent/data/requiredDefault.1.qml5
-rw-r--r--tests/auto/qml/qqmlcomponent/data/requiredDefault.2.qml3
-rw-r--r--tests/auto/qml/qqmlcomponent/data/requiredDefault.3.qml6
-rw-r--r--tests/auto/qml/qqmlcomponent/data/requiredDefault.4.qml4
-rw-r--r--tests/auto/qml/qqmlcomponent/tst_qqmlcomponent.cpp16
-rw-r--r--tests/auto/qml/qqmllanguage/data/requiredProperties.3.qml4
-rw-r--r--tests/auto/qml/qqmllanguage/tst_qqmllanguage.cpp4
9 files changed, 64 insertions, 8 deletions
diff --git a/src/qml/parser/qqmljs.g b/src/qml/parser/qqmljs.g
index 397c0b51a5..2b00caf378 100644
--- a/src/qml/parser/qqmljs.g
+++ b/src/qml/parser/qqmljs.g
@@ -1247,6 +1247,31 @@ UiObjectMember: T_DEFAULT UiObjectMemberListPropertyNoInitialiser;
} break;
./
+UiObjectMember: T_DEFAULT T_REQUIRED UiObjectMemberPropertyNoInitialiser;
+/.
+ case $rule_number: {
+ AST::UiPublicMember *node = sym(3).UiPublicMember;
+ node->isDefaultMember = true;
+ node->defaultToken = loc(1);
+ node->isRequired = true;
+ node->requiredToken = loc(2);
+ sym(1).Node = node;
+ } break;
+./
+
+
+UiObjectMember: T_REQUIRED T_DEFAULT UiObjectMemberPropertyNoInitialiser;
+/.
+ case $rule_number: {
+ AST::UiPublicMember *node = sym(3).UiPublicMember;
+ node->isDefaultMember = true;
+ node->defaultToken = loc(2);
+ node->isRequired = true;
+ node->requiredToken = loc(1);
+ sym(1).Node = node;
+ } break;
+./
+
OptionalSemicolon: | Semicolon;
/.
/* we need OptionalSemicolon because UiScriptStatement might already parse the last semicolon
diff --git a/tests/auto/qml/qqmlcomponent/data/RequiredDefault.qml b/tests/auto/qml/qqmlcomponent/data/RequiredDefault.qml
new file mode 100644
index 0000000000..7e8f225a52
--- /dev/null
+++ b/tests/auto/qml/qqmlcomponent/data/RequiredDefault.qml
@@ -0,0 +1,5 @@
+import QtQuick 2.15
+
+Item {
+ required default property Text requiredDefault
+}
diff --git a/tests/auto/qml/qqmlcomponent/data/requiredDefault.1.qml b/tests/auto/qml/qqmlcomponent/data/requiredDefault.1.qml
new file mode 100644
index 0000000000..68dff22f33
--- /dev/null
+++ b/tests/auto/qml/qqmlcomponent/data/requiredDefault.1.qml
@@ -0,0 +1,5 @@
+import QtQuick 2.15
+
+RequiredDefault {
+ Text {text: "Hello, world!"}
+}
diff --git a/tests/auto/qml/qqmlcomponent/data/requiredDefault.2.qml b/tests/auto/qml/qqmlcomponent/data/requiredDefault.2.qml
new file mode 100644
index 0000000000..a6c4e8ea3f
--- /dev/null
+++ b/tests/auto/qml/qqmlcomponent/data/requiredDefault.2.qml
@@ -0,0 +1,3 @@
+import QtQuick 2.15
+
+RequiredDefault { }
diff --git a/tests/auto/qml/qqmlcomponent/data/requiredDefault.3.qml b/tests/auto/qml/qqmlcomponent/data/requiredDefault.3.qml
new file mode 100644
index 0000000000..19b3271858
--- /dev/null
+++ b/tests/auto/qml/qqmlcomponent/data/requiredDefault.3.qml
@@ -0,0 +1,6 @@
+import QtQuick 2.15
+import qt.test 1.0
+
+RequiredDefaultCpp {
+ Text {text: "Hello, world!"}
+}
diff --git a/tests/auto/qml/qqmlcomponent/data/requiredDefault.4.qml b/tests/auto/qml/qqmlcomponent/data/requiredDefault.4.qml
new file mode 100644
index 0000000000..acd56db328
--- /dev/null
+++ b/tests/auto/qml/qqmlcomponent/data/requiredDefault.4.qml
@@ -0,0 +1,4 @@
+import QtQuick 2.15
+import qt.test 1.0
+
+RequiredDefaultCpp { }
diff --git a/tests/auto/qml/qqmlcomponent/tst_qqmlcomponent.cpp b/tests/auto/qml/qqmlcomponent/tst_qqmlcomponent.cpp
index 2acc62ca28..43cbd93396 100644
--- a/tests/auto/qml/qqmlcomponent/tst_qqmlcomponent.cpp
+++ b/tests/auto/qml/qqmlcomponent/tst_qqmlcomponent.cpp
@@ -671,8 +671,20 @@ void tst_qqmlcomponent::setDataNoEngineNoSegfault()
QVERIFY(!c);
}
+class RequiredDefaultCpp : public QObject
+{
+ Q_OBJECT
+public:
+ Q_PROPERTY(QQuickItem *defaultProperty MEMBER m_defaultProperty NOTIFY defaultPropertyChanged REQUIRED)
+ Q_SIGNAL void defaultPropertyChanged();
+ Q_CLASSINFO("DefaultProperty", "defaultProperty")
+private:
+ QQuickItem *m_defaultProperty = nullptr;
+};
+
void tst_qqmlcomponent::testRequiredProperties_data()
{
+ qmlRegisterType<RequiredDefaultCpp>("qt.test", 1, 0, "RequiredDefaultCpp");
QTest::addColumn<QUrl>("testFile");
QTest::addColumn<bool>("shouldSucceed");
QTest::addColumn<QString>("errorMsg");
@@ -687,6 +699,10 @@ void tst_qqmlcomponent::testRequiredProperties_data()
QTest::addRow("setLater") << testFileUrl("requiredSetLater.qml") << true << "";
QTest::addRow("setViaAliasToSubcomponent") << testFileUrl("setViaAliasToSubcomponent.qml") << true << "";
QTest::addRow("aliasToSubcomponentNotSet") << testFileUrl("aliasToSubcomponentNotSet.qml") << false << "It can be set via the alias property i_alias";
+ QTest::addRow("required default set") << testFileUrl("requiredDefault.1.qml") << true << "";
+ QTest::addRow("required default not set") << testFileUrl("requiredDefault.2.qml") << false << "Required property requiredDefault was not initialized";
+ QTest::addRow("required default set (C++)") << testFileUrl("requiredDefault.3.qml") << true << "";
+ QTest::addRow("required default not set (C++)") << testFileUrl("requiredDefault.4.qml") << false << "Required property defaultProperty was not initialized";
}
diff --git a/tests/auto/qml/qqmllanguage/data/requiredProperties.3.qml b/tests/auto/qml/qqmllanguage/data/requiredProperties.3.qml
deleted file mode 100644
index 534322215f..0000000000
--- a/tests/auto/qml/qqmllanguage/data/requiredProperties.3.qml
+++ /dev/null
@@ -1,4 +0,0 @@
-import QtQuick 2.13
-Item {
- default required property int test // cannot have required default property
-}
diff --git a/tests/auto/qml/qqmllanguage/tst_qqmllanguage.cpp b/tests/auto/qml/qqmllanguage/tst_qqmllanguage.cpp
index 64696e7f3f..5027c0825f 100644
--- a/tests/auto/qml/qqmllanguage/tst_qqmllanguage.cpp
+++ b/tests/auto/qml/qqmllanguage/tst_qqmllanguage.cpp
@@ -1675,10 +1675,6 @@ void tst_qqmllanguage::requiredProperty()
QQmlComponent component(&engine, testFileUrl("requiredProperties.2.qml"));
QVERIFY(!component.errors().empty());
}
- {
- QQmlComponent component(&engine, testFileUrl("requiredProperties.3.qml"));
- QVERIFY(!component.errors().empty());
- }
}
class MyClassWithRequiredProperty : public QObject