diff options
author | Fawzi Mohamed <fawzi.mohamed@qt.io> | 2020-02-11 16:13:36 +0100 |
---|---|---|
committer | Fawzi Mohamed <fawzi.mohamed@qt.io> | 2020-02-12 18:28:46 +0100 |
commit | 41e8f8a7c6aa4a530abdbc52f8014c4563e85417 (patch) | |
tree | 35eca52953b51fedaeb3c16af695287c48eedc17 | |
parent | c2e756dc1962eeb3575f618b38272359d4fccc89 (diff) |
Add UiAnnotation for annotation objects
This is a partial patch that is fuilly fixed with the following
one (big restructure) because it needs extra visit methods,
and that leads to conflicts, but I think it gets lost if merged with
the next one.
Change-Id: I54331a47a5c7faaf78a97e580825d1feec5adf92
Reviewed-by: Ulf Hermann <ulf.hermann@qt.io>
-rw-r--r-- | src/qml/parser/qqmljs.g | 9 | ||||
-rw-r--r-- | src/qml/parser/qqmljsast.cpp | 13 | ||||
-rw-r--r-- | src/qml/parser/qqmljsast_p.h | 30 | ||||
-rw-r--r-- | src/qml/parser/qqmljsastfwd_p.h | 1 | ||||
-rw-r--r-- | src/qml/parser/qqmljsastvisitor_p.h | 4 | ||||
-rw-r--r-- | tests/auto/shared/qqmljsastdumper.cpp | 7 | ||||
-rw-r--r-- | tests/auto/shared/qqmljsastdumper.h | 4 |
7 files changed, 60 insertions, 8 deletions
diff --git a/src/qml/parser/qqmljs.g b/src/qml/parser/qqmljs.g index a5062aafc7..f6d8bcf9c3 100644 --- a/src/qml/parser/qqmljs.g +++ b/src/qml/parser/qqmljs.g @@ -326,6 +326,7 @@ public: AST::UiQualifiedId *UiQualifiedId; AST::UiEnumMemberList *UiEnumMemberList; AST::UiVersionSpecifier *UiVersionSpecifier; + AST::UiAnnotation *UiAnnotation; AST::UiAnnotationList *UiAnnotationList; }; @@ -953,7 +954,7 @@ UiAnnotationObjectDefinition: UiSimpleQualifiedId UiObjectInitializer; return false; } - AST::UiObjectDefinition *node = new (pool) AST::UiObjectDefinition(sym(1).UiQualifiedId, sym(2).UiObjectInitializer); + AST::UiAnnotation *node = new (pool) AST::UiAnnotation(sym(1).UiQualifiedId, sym(2).UiObjectInitializer); sym(1).Node = node; } break; ./ @@ -969,14 +970,14 @@ case $rule_number: { UiAnnotationList: UiAnnotation; /. case $rule_number: { - sym(1).Node = new (pool) AST::UiAnnotationList(sym(1).UiObjectDefinition); + sym(1).Node = new (pool) AST::UiAnnotationList(sym(1).UiAnnotation); } break; ./ UiAnnotationList: UiAnnotationList UiAnnotation; /. case $rule_number: { - AST::UiAnnotationList *node = new (pool) AST::UiAnnotationList(sym(1).UiAnnotationList, sym(2).UiObjectDefinition); + AST::UiAnnotationList *node = new (pool) AST::UiAnnotationList(sym(1).UiAnnotationList, sym(2).UiAnnotation); sym(1).Node = node; } break; ./ @@ -984,7 +985,7 @@ UiAnnotationList: UiAnnotationList UiAnnotation; UiAnnotatedObject: UiAnnotationList UiObjectDefinition; /. case $rule_number: { - AST::UiObjectMember *node = sym(2).UiObjectMember; + AST::UiObjectDefinition *node = sym(2).UiObjectDefinition; node->annotations = sym(1).UiAnnotationList->finish(); sym(1).Node = node; } break; diff --git a/src/qml/parser/qqmljsast.cpp b/src/qml/parser/qqmljsast.cpp index ef25427076..2a34c5a66c 100644 --- a/src/qml/parser/qqmljsast.cpp +++ b/src/qml/parser/qqmljsast.cpp @@ -1578,7 +1578,18 @@ void UiRequired::accept0(BaseVisitor *visitor) void UiAnnotationList::accept0(BaseVisitor *visitor) { if (visitor->visit(this)) { - accept(annotation, visitor); + for (UiAnnotationList *it = this; it; it = it->next) + accept(it->annotation, visitor); + } + + visitor->endVisit(this); +} + +void UiAnnotation::accept0(BaseVisitor *visitor) +{ + if (visitor->visit(this)) { + accept(qualifiedTypeNameId, visitor); + accept(initializer, visitor); } visitor->endVisit(this); diff --git a/src/qml/parser/qqmljsast_p.h b/src/qml/parser/qqmljsast_p.h index feabb5b22d..053e9fd2d3 100644 --- a/src/qml/parser/qqmljsast_p.h +++ b/src/qml/parser/qqmljsast_p.h @@ -260,6 +260,7 @@ public: Kind_UiEnumMemberList, Kind_UiVersionSpecifier, Kind_UiRequired, + Kind_UiAnnotation, Kind_UiAnnotationList }; @@ -3629,16 +3630,39 @@ public: UiEnumMemberList *members; }; +class QML_PARSER_EXPORT UiAnnotation: public Node +{ +public: + QQMLJS_DECLARE_AST_NODE(UiAnnotation) + + UiAnnotation(UiQualifiedId *qualifiedTypeNameId, + UiObjectInitializer *initializer) + : qualifiedTypeNameId(qualifiedTypeNameId), initializer(initializer) + { kind = K; } + + void accept0(BaseVisitor *visitor) override; + + SourceLocation firstSourceLocation() const override + { return qualifiedTypeNameId->identifierToken; } + + SourceLocation lastSourceLocation() const override + { return initializer->rbraceToken; } + +// attributes + UiQualifiedId *qualifiedTypeNameId; + UiObjectInitializer *initializer; +}; + class QML_PARSER_EXPORT UiAnnotationList: public Node { public: QQMLJS_DECLARE_AST_NODE(UiAnnotationList) - UiAnnotationList(UiObjectDefinition *annotation) + UiAnnotationList(UiAnnotation *annotation) : next(this), annotation(annotation) { kind = K; } - UiAnnotationList(UiAnnotationList *previous, UiObjectDefinition *annotation) + UiAnnotationList(UiAnnotationList *previous, UiAnnotation *annotation) : annotation(annotation) { kind = K; @@ -3663,7 +3687,7 @@ public: // attributes UiAnnotationList *next; - UiObjectDefinition *annotation; + UiAnnotation *annotation; }; } } // namespace AST diff --git a/src/qml/parser/qqmljsastfwd_p.h b/src/qml/parser/qqmljsastfwd_p.h index 49949cce61..8df0be7590 100644 --- a/src/qml/parser/qqmljsastfwd_p.h +++ b/src/qml/parser/qqmljsastfwd_p.h @@ -184,6 +184,7 @@ class UiEnumDeclaration; class UiEnumMemberList; class UiVersionSpecifier; class UiRequired; +class UiAnnotation; class UiAnnotationList; } // namespace AST diff --git a/src/qml/parser/qqmljsastvisitor_p.h b/src/qml/parser/qqmljsastvisitor_p.h index 2c17e9ba36..8fbdb97ee2 100644 --- a/src/qml/parser/qqmljsastvisitor_p.h +++ b/src/qml/parser/qqmljsastvisitor_p.h @@ -113,6 +113,7 @@ public: virtual bool visit(UiEnumMemberList *) = 0; virtual bool visit(UiVersionSpecifier *) = 0; virtual bool visit(UiInlineComponent *) = 0; + virtual bool visit(UiAnnotation *) = 0; virtual bool visit(UiAnnotationList *) = 0; virtual bool visit(UiRequired *) = 0; @@ -135,6 +136,7 @@ public: virtual void endVisit(UiEnumMemberList *) = 0; virtual void endVisit(UiVersionSpecifier *) = 0; virtual void endVisit(UiInlineComponent *) = 0; + virtual void endVisit(UiAnnotation *) = 0; virtual void endVisit(UiAnnotationList *) = 0; virtual void endVisit(UiRequired *) = 0; @@ -452,6 +454,7 @@ public: bool visit(UiEnumMemberList *) override { return true; } bool visit(UiVersionSpecifier *) override { return true; } bool visit(UiInlineComponent *) override { return true; } + bool visit(UiAnnotation *) override { return true; } bool visit(UiAnnotationList *) override { return true; } bool visit(UiRequired *) override { return true; } @@ -474,6 +477,7 @@ public: void endVisit(UiEnumMemberList *) override {} void endVisit(UiVersionSpecifier *) override {} void endVisit(UiInlineComponent *) override {} + void endVisit(UiAnnotation *) override {} void endVisit(UiAnnotationList *) override {} void endVisit(UiRequired *) override {} diff --git a/tests/auto/shared/qqmljsastdumper.cpp b/tests/auto/shared/qqmljsastdumper.cpp index 92d95be80a..8a50e021f6 100644 --- a/tests/auto/shared/qqmljsastdumper.cpp +++ b/tests/auto/shared/qqmljsastdumper.cpp @@ -366,6 +366,12 @@ bool AstDumper::visit(UiRequired *el) return true; } +bool AstDumper::visit(UiAnnotation *) +{ + start(QLatin1String("UiAnnotation")); + return true; +} + bool AstDumper::visit(UiAnnotationList *) { start(QLatin1String("UiAnnotationList")); @@ -409,6 +415,7 @@ void AstDumper::endVisit(AST::UiEnumMemberList *el) { void AstDumper::endVisit(AST::UiVersionSpecifier *) { stop("UiVersionSpecifier"); } void AstDumper::endVisit(AST::UiInlineComponent *) { stop("UiInlineComponent"); } void AstDumper::endVisit(UiRequired *) { stop("UiRequired"); } +void AstDumper::endVisit(UiAnnotation *) { stop("UiAnnotation"); } void AstDumper::endVisit(UiAnnotationList *) { stop("UiAnnotationList"); } // QQmlJS diff --git a/tests/auto/shared/qqmljsastdumper.h b/tests/auto/shared/qqmljsastdumper.h index cd52e96220..d8d19e351d 100644 --- a/tests/auto/shared/qqmljsastdumper.h +++ b/tests/auto/shared/qqmljsastdumper.h @@ -119,6 +119,8 @@ public: bool visit(AST::UiVersionSpecifier *) override; bool visit(AST::UiInlineComponent *) override; bool visit(AST::UiRequired *) override; + bool visit(AST::UiAnnotation *) override; + bool visit(AST::UiAnnotationList *) override; void endVisit(AST::UiProgram *) override; void endVisit(AST::UiImport *) override; @@ -140,6 +142,8 @@ public: void endVisit(AST::UiVersionSpecifier *) override; void endVisit(AST::UiInlineComponent *) override; void endVisit(AST::UiRequired *) override; + void endVisit(AST::UiAnnotation *) override; + void endVisit(AST::UiAnnotationList *) override; // QQmlJS bool visit(AST::ThisExpression *) override; |