aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFawzi Mohamed <fawzi.mohamed@qt.io>2020-02-11 16:13:36 +0100
committerFawzi Mohamed <fawzi.mohamed@qt.io>2020-02-12 18:28:46 +0100
commit41e8f8a7c6aa4a530abdbc52f8014c4563e85417 (patch)
tree35eca52953b51fedaeb3c16af695287c48eedc17
parentc2e756dc1962eeb3575f618b38272359d4fccc89 (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.g9
-rw-r--r--src/qml/parser/qqmljsast.cpp13
-rw-r--r--src/qml/parser/qqmljsast_p.h30
-rw-r--r--src/qml/parser/qqmljsastfwd_p.h1
-rw-r--r--src/qml/parser/qqmljsastvisitor_p.h4
-rw-r--r--tests/auto/shared/qqmljsastdumper.cpp7
-rw-r--r--tests/auto/shared/qqmljsastdumper.h4
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;