aboutsummaryrefslogtreecommitdiffstats
path: root/src/qml/parser
diff options
context:
space:
mode:
authorUlf Hermann <ulf.hermann@qt.io>2023-02-16 11:28:33 +0100
committerUlf Hermann <ulf.hermann@qt.io>2023-02-22 11:00:19 +0100
commitbdb2bb561054ad7e95ced2f4b79533d13000172b (patch)
tree8cf445d89c335bd13ca21720c87aa5bc69271ece /src/qml/parser
parent763dad999dc5bf6109158283c9dc6b396a4e75f6 (diff)
QML: Allow pragmas with multiple values
This will be needed in follow-up changes. Task-number: QTBUG-94807 Change-Id: I6243ea31290251c30dd0aceaae878568bc1c0525 Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io> Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
Diffstat (limited to 'src/qml/parser')
-rw-r--r--src/qml/parser/qqmljs.g27
-rw-r--r--src/qml/parser/qqmljsast.cpp9
-rw-r--r--src/qml/parser/qqmljsast_p.h47
-rw-r--r--src/qml/parser/qqmljsastfwd_p.h1
-rw-r--r--src/qml/parser/qqmljsastvisitor_p.h4
5 files changed, 83 insertions, 5 deletions
diff --git a/src/qml/parser/qqmljs.g b/src/qml/parser/qqmljs.g
index 394edf0fed..13c54d387b 100644
--- a/src/qml/parser/qqmljs.g
+++ b/src/qml/parser/qqmljs.g
@@ -217,6 +217,7 @@ public:
AST::UiProgram *UiProgram;
AST::UiHeaderItemList *UiHeaderItemList;
+ AST::UiPragmaValueList *UiPragmaValueList;
AST::UiPragma *UiPragma;
AST::UiImport *UiImport;
AST::UiParameterList *UiParameterList;
@@ -717,10 +718,31 @@ UiHeaderItemList: UiHeaderItemList UiImport;
./
PragmaId: JsIdentifier;
+PragmaValue: JsIdentifier;
Semicolon: T_AUTOMATIC_SEMICOLON;
Semicolon: T_SEMICOLON;
+UiPragmaValueList: PragmaValue;
+/.
+ case $rule_number: {
+ AST::UiPragmaValueList *list
+ = new (pool) AST::UiPragmaValueList(stringRef(1));
+ list->location = loc(1);
+ sym(1).Node = list;
+ } break;
+./
+
+UiPragmaValueList: UiPragmaValueList T_COMMA PragmaValue;
+/.
+ case $rule_number: {
+ AST::UiPragmaValueList *list
+ = new (pool) AST::UiPragmaValueList(sym(1).UiPragmaValueList, stringRef(3));
+ list->location = loc(3);
+ sym(1).Node = list;
+ } break;
+./
+
UiPragma: T_PRAGMA PragmaId Semicolon;
/.
case $rule_number: {
@@ -731,10 +753,11 @@ UiPragma: T_PRAGMA PragmaId Semicolon;
} break;
./
-UiPragma: T_PRAGMA PragmaId T_COLON JsIdentifier Semicolon;
+UiPragma: T_PRAGMA PragmaId T_COLON UiPragmaValueList Semicolon;
/.
case $rule_number: {
- AST::UiPragma *pragma = new (pool) AST::UiPragma(stringRef(2), stringRef(4));
+ AST::UiPragma *pragma = new (pool) AST::UiPragma(
+ stringRef(2), sym(4).UiPragmaValueList->finish());
pragma->pragmaToken = loc(1);
pragma->semicolonToken = loc(5);
sym(1).Node = pragma;
diff --git a/src/qml/parser/qqmljsast.cpp b/src/qml/parser/qqmljsast.cpp
index 5408f29900..e3ed876473 100644
--- a/src/qml/parser/qqmljsast.cpp
+++ b/src/qml/parser/qqmljsast.cpp
@@ -1336,6 +1336,15 @@ void UiImport::accept0(BaseVisitor *visitor)
visitor->endVisit(this);
}
+void UiPragmaValueList::accept0(BaseVisitor *visitor)
+{
+ if (visitor->visit(this)) {
+ }
+
+ visitor->endVisit(this);
+}
+
+
void UiPragma::accept0(BaseVisitor *visitor)
{
if (visitor->visit(this)) {
diff --git a/src/qml/parser/qqmljsast_p.h b/src/qml/parser/qqmljsast_p.h
index 77af38aaca..e7052f324e 100644
--- a/src/qml/parser/qqmljsast_p.h
+++ b/src/qml/parser/qqmljsast_p.h
@@ -222,6 +222,7 @@ public:
Kind_UiObjectInitializer,
Kind_UiObjectMemberList,
Kind_UiArrayMemberList,
+ Kind_UiPragmaValueList,
Kind_UiPragma,
Kind_UiProgram,
Kind_UiParameterList,
@@ -3074,13 +3075,53 @@ public:
UiObjectMember *member;
};
+class QML_PARSER_EXPORT UiPragmaValueList: public Node
+{
+public:
+ QQMLJS_DECLARE_AST_NODE(UiPragmaValueList)
+
+ UiPragmaValueList(QStringView value)
+ : value(value)
+ , next(this)
+ {
+ kind = K;
+ }
+
+ UiPragmaValueList(UiPragmaValueList *previous, QStringView value)
+ : value(value)
+ {
+ kind = K;
+ next = previous->next;
+ previous->next = this;
+ }
+
+ void accept0(BaseVisitor *visitor) override;
+
+ SourceLocation firstSourceLocation() const override
+ { return location; }
+
+ SourceLocation lastSourceLocation() const override
+ { return lastListElement(this)->location; }
+
+ UiPragmaValueList *finish()
+ {
+ UiPragmaValueList *head = next;
+ next = nullptr;
+ return head;
+ }
+
+ QStringView value;
+ UiPragmaValueList *next;
+ SourceLocation location;
+};
+
class QML_PARSER_EXPORT UiPragma: public Node
{
public:
QQMLJS_DECLARE_AST_NODE(UiPragma)
- UiPragma(QStringView name, QStringView value = {})
- : name(name), value(value)
+ UiPragma(QStringView name, UiPragmaValueList *values = nullptr)
+ : name(name), values(values)
{ kind = K; }
void accept0(BaseVisitor *visitor) override;
@@ -3093,7 +3134,7 @@ public:
// attributes
QStringView name;
- QStringView value;
+ UiPragmaValueList *values;
SourceLocation pragmaToken;
SourceLocation semicolonToken;
};
diff --git a/src/qml/parser/qqmljsastfwd_p.h b/src/qml/parser/qqmljsastfwd_p.h
index e06da8b4c1..ab807386c2 100644
--- a/src/qml/parser/qqmljsastfwd_p.h
+++ b/src/qml/parser/qqmljsastfwd_p.h
@@ -128,6 +128,7 @@ class TypeAnnotation;
// ui elements
class UiProgram;
+class UiPragmaValueList;
class UiPragma;
class UiImport;
class UiPublicMember;
diff --git a/src/qml/parser/qqmljsastvisitor_p.h b/src/qml/parser/qqmljsastvisitor_p.h
index 450cfaad40..b4ee47ef0d 100644
--- a/src/qml/parser/qqmljsastvisitor_p.h
+++ b/src/qml/parser/qqmljsastvisitor_p.h
@@ -60,6 +60,7 @@ public:
// Ui
virtual bool visit(UiProgram *) = 0;
virtual bool visit(UiHeaderItemList *) = 0;
+ virtual bool visit(UiPragmaValueList *) = 0;
virtual bool visit(UiPragma *) = 0;
virtual bool visit(UiImport *) = 0;
virtual bool visit(UiPublicMember *) = 0;
@@ -84,6 +85,7 @@ public:
virtual void endVisit(UiProgram *) = 0;
virtual void endVisit(UiImport *) = 0;
virtual void endVisit(UiHeaderItemList *) = 0;
+ virtual void endVisit(UiPragmaValueList *) = 0;
virtual void endVisit(UiPragma *) = 0;
virtual void endVisit(UiPublicMember *) = 0;
virtual void endVisit(UiSourceElement *) = 0;
@@ -404,6 +406,7 @@ public:
// Ui
bool visit(UiProgram *) override { return true; }
bool visit(UiHeaderItemList *) override { return true; }
+ bool visit(UiPragmaValueList *) override { return true; }
bool visit(UiPragma *) override { return true; }
bool visit(UiImport *) override { return true; }
bool visit(UiPublicMember *) override { return true; }
@@ -428,6 +431,7 @@ public:
void endVisit(UiProgram *) override {}
void endVisit(UiImport *) override {}
void endVisit(UiHeaderItemList *) override {}
+ void endVisit(UiPragmaValueList *) override {}
void endVisit(UiPragma *) override {}
void endVisit(UiPublicMember *) override {}
void endVisit(UiSourceElement *) override {}