aboutsummaryrefslogtreecommitdiffstats
path: root/src/qml/parser
diff options
context:
space:
mode:
authorLars Knoll <lars.knoll@qt.io>2018-02-09 20:22:09 +0100
committerLars Knoll <lars.knoll@qt.io>2018-04-25 17:49:03 +0000
commit2683a22364f742e3809b6c48570b0b4aaf37b31f (patch)
treeaff06f7313424ee8481da880168b7129455e6bc9 /src/qml/parser
parentdad5d1cc82a57a4f657aa3f37ad2f55b69d5b015 (diff)
Implement support for tagged templates
Get Foo`...` to work as intended by the spec. Change-Id: If6ccdd7486d3c983c177a3e126e3a661e210a8ae Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
Diffstat (limited to 'src/qml/parser')
-rw-r--r--src/qml/parser/qqmljs.g24
-rw-r--r--src/qml/parser/qqmljsast.cpp11
-rw-r--r--src/qml/parser/qqmljsast_p.h23
-rw-r--r--src/qml/parser/qqmljsastfwd_p.h1
-rw-r--r--src/qml/parser/qqmljsastvisitor_p.h3
5 files changed, 49 insertions, 13 deletions
diff --git a/src/qml/parser/qqmljs.g b/src/qml/parser/qqmljs.g
index 5313d4d066..ed69e01ba8 100644
--- a/src/qml/parser/qqmljs.g
+++ b/src/qml/parser/qqmljs.g
@@ -1748,6 +1748,17 @@ case $rule_number: {
} break;
./
+CallExpression: CallExpression TemplateLiteral;
+/. case $rule_number: ./
+
+MemberExpression: MemberExpression TemplateLiteral ;
+/.
+case $rule_number: {
+ AST::TaggedTemplate *node = new (pool) AST::TaggedTemplate(sym(1).Expression, sym(2).Template);
+ sym(1).Node = node;
+} break;
+./
+
MemberExpression: T_NEW MemberExpression T_LPAREN ArgumentListOpt T_RPAREN ;
/.
case $rule_number: {
@@ -1759,13 +1770,6 @@ case $rule_number: {
} break;
./
-MemberExpression: MemberExpression TemplateLiteral ;
-/.
-case $rule_number: {
- qWarning() << "Template member expression implemented";
-} break;
-./
-
NewExpression: MemberExpression ;
NewExpression: T_NEW NewExpression ;
@@ -1817,12 +1821,6 @@ case $rule_number: {
} break;
./
-CallExpression: CallExpression TemplateLiteral;
-/. case $rule_number: {
- qWarning() << "Template calling not implemented";
-} break;
-./
-
ArgumentListOpt: ;
/.
case $rule_number: {
diff --git a/src/qml/parser/qqmljsast.cpp b/src/qml/parser/qqmljsast.cpp
index 6fdfd8279c..b29450c1df 100644
--- a/src/qml/parser/qqmljsast.cpp
+++ b/src/qml/parser/qqmljsast.cpp
@@ -158,6 +158,8 @@ void StringLiteral::accept0(Visitor *visitor)
void TemplateLiteral::accept0(Visitor *visitor)
{
if (visitor->visit(this)) {
+ if (next)
+ accept(next, visitor);
}
visitor->endVisit(this);
@@ -992,6 +994,15 @@ void UiEnumMemberList::accept0(Visitor *visitor)
visitor->endVisit(this);
}
+void TaggedTemplate::accept0(Visitor *visitor)
+{
+ if (visitor->visit(this)) {
+ accept(templateLiteral, visitor);
+ }
+
+ visitor->endVisit(this);
+}
+
} } // namespace QQmlJS::AST
QT_QML_END_NAMESPACE
diff --git a/src/qml/parser/qqmljsast_p.h b/src/qml/parser/qqmljsast_p.h
index 5f094ad4f5..b03e15700a 100644
--- a/src/qml/parser/qqmljsast_p.h
+++ b/src/qml/parser/qqmljsast_p.h
@@ -189,6 +189,7 @@ public:
Kind_StringLiteralPropertyName,
Kind_SwitchStatement,
Kind_TemplateLiteral,
+ Kind_TaggedTemplate,
Kind_ThisExpression,
Kind_ThrowStatement,
Kind_TildeExpression,
@@ -838,6 +839,28 @@ public:
SourceLocation identifierToken;
};
+class QML_PARSER_EXPORT TaggedTemplate : public ExpressionNode
+{
+public:
+ QQMLJS_DECLARE_AST_NODE(TaggedTemplate)
+
+ TaggedTemplate(ExpressionNode *b, TemplateLiteral *t)
+ : base (b), templateLiteral(t)
+ { kind = K; }
+
+ void accept0(Visitor *visitor) override;
+
+ SourceLocation firstSourceLocation() const override
+ { return base->firstSourceLocation(); }
+
+ SourceLocation lastSourceLocation() const override
+ { return templateLiteral->lastSourceLocation(); }
+
+ // attributes
+ ExpressionNode *base;
+ TemplateLiteral *templateLiteral;
+};
+
class QML_PARSER_EXPORT NewMemberExpression: public ExpressionNode
{
public:
diff --git a/src/qml/parser/qqmljsastfwd_p.h b/src/qml/parser/qqmljsastfwd_p.h
index 3ebef5b128..1aa285697f 100644
--- a/src/qml/parser/qqmljsastfwd_p.h
+++ b/src/qml/parser/qqmljsastfwd_p.h
@@ -106,6 +106,7 @@ class StringLiteralPropertyName;
class NumericLiteralPropertyName;
class ArrayMemberExpression;
class FieldMemberExpression;
+class TaggedTemplate;
class NewMemberExpression;
class NewExpression;
class CallExpression;
diff --git a/src/qml/parser/qqmljsastvisitor_p.h b/src/qml/parser/qqmljsastvisitor_p.h
index 5a0767a697..534cc9bd6d 100644
--- a/src/qml/parser/qqmljsastvisitor_p.h
+++ b/src/qml/parser/qqmljsastvisitor_p.h
@@ -173,6 +173,9 @@ public:
virtual bool visit(FieldMemberExpression *) { return true; }
virtual void endVisit(FieldMemberExpression *) {}
+ virtual bool visit(TaggedTemplate *) { return true; }
+ virtual void endVisit(TaggedTemplate *) {}
+
virtual bool visit(NewMemberExpression *) { return true; }
virtual void endVisit(NewMemberExpression *) {}