diff options
author | Ulf Hermann <ulf.hermann@qt.io> | 2023-02-16 11:28:33 +0100 |
---|---|---|
committer | Ulf Hermann <ulf.hermann@qt.io> | 2023-02-22 11:00:19 +0100 |
commit | bdb2bb561054ad7e95ced2f4b79533d13000172b (patch) | |
tree | 8cf445d89c335bd13ca21720c87aa5bc69271ece /src/qml/parser | |
parent | 763dad999dc5bf6109158283c9dc6b396a4e75f6 (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.g | 27 | ||||
-rw-r--r-- | src/qml/parser/qqmljsast.cpp | 9 | ||||
-rw-r--r-- | src/qml/parser/qqmljsast_p.h | 47 | ||||
-rw-r--r-- | src/qml/parser/qqmljsastfwd_p.h | 1 | ||||
-rw-r--r-- | src/qml/parser/qqmljsastvisitor_p.h | 4 |
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 {} |