diff options
author | Lars Knoll <lars.knoll@qt.io> | 2018-02-09 20:22:09 +0100 |
---|---|---|
committer | Lars Knoll <lars.knoll@qt.io> | 2018-04-25 17:49:03 +0000 |
commit | 2683a22364f742e3809b6c48570b0b4aaf37b31f (patch) | |
tree | aff06f7313424ee8481da880168b7129455e6bc9 /src/qml/parser | |
parent | dad5d1cc82a57a4f657aa3f37ad2f55b69d5b015 (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.g | 24 | ||||
-rw-r--r-- | src/qml/parser/qqmljsast.cpp | 11 | ||||
-rw-r--r-- | src/qml/parser/qqmljsast_p.h | 23 | ||||
-rw-r--r-- | src/qml/parser/qqmljsastfwd_p.h | 1 | ||||
-rw-r--r-- | src/qml/parser/qqmljsastvisitor_p.h | 3 |
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 *) {} |