diff options
author | Simon Hausmann <simon.hausmann@qt.io> | 2020-02-03 21:52:20 +0100 |
---|---|---|
committer | Simon Hausmann <simon.hausmann@qt.io> | 2020-02-03 21:52:20 +0100 |
commit | 2c6b04420c9aec4dc65c2492ae49e3ebca10027c (patch) | |
tree | 893f0736d3ce378426f072abfc7f4737dd0743e1 /src/qml/parser | |
parent | 789929f939a60462373beae37ab4373809095cff (diff) | |
parent | bda38eae465fdf7dc719966e1199eafc7eb7c27c (diff) |
Merge remote-tracking branch 'origin/5.15' into dev
Conflicts:
src/qml/common/qv4compileddata_p.h
tests/auto/qml/qmlmin/tst_qmlmin.cpp
Change-Id: Ieabc9e0729630de6a8644024d11b765f35199f29
Diffstat (limited to 'src/qml/parser')
-rw-r--r-- | src/qml/parser/qqmljs.g | 95 | ||||
-rw-r--r-- | src/qml/parser/qqmljsast.cpp | 8 | ||||
-rw-r--r-- | src/qml/parser/qqmljsast_p.h | 25 | ||||
-rw-r--r-- | src/qml/parser/qqmljsastfwd_p.h | 1 | ||||
-rw-r--r-- | src/qml/parser/qqmljsastvisitor_p.h | 3 | ||||
-rw-r--r-- | src/qml/parser/qqmljslexer.cpp | 2 |
6 files changed, 127 insertions, 7 deletions
diff --git a/src/qml/parser/qqmljs.g b/src/qml/parser/qqmljs.g index 2b00caf378..879de92e5f 100644 --- a/src/qml/parser/qqmljs.g +++ b/src/qml/parser/qqmljs.g @@ -73,7 +73,7 @@ %token T_VAR "var" T_VOID "void" T_WHILE "while" %token T_WITH "with" T_XOR "^" T_XOR_EQ "^=" %token T_NULL "null" T_TRUE "true" T_FALSE "false" -%token T_CONST "const" T_LET "let" +%token T_CONST "const" T_LET "let" T_AT "@" %token T_DEBUGGER "debugger" %token T_RESERVED_WORD "reserved word" %token T_MULTILINE_STRING_LITERAL "multiline string literal" @@ -739,7 +739,7 @@ TopLevel: T_FEED_JS_EXPRESSION Expression; } break; ./ -TopLevel: T_FEED_UI_OBJECT_MEMBER UiObjectMember; +TopLevel: T_FEED_UI_OBJECT_MEMBER UiAnnotatedObjectMember; /. case $rule_number: { sym(1).Node = sym(2).Node; @@ -913,21 +913,84 @@ Empty: ; } break; ./ -UiRootMember: UiObjectDefinition; +UiRootMember: UiAnnotatedObject; /. case $rule_number: { sym(1).Node = new (pool) AST::UiObjectMemberList(sym(1).UiObjectMember); } break; ./ -UiObjectMemberList: UiObjectMember; +UiSimpleQualifiedId: T_IDENTIFIER; +/. + case $rule_number: { + AST::IdentifierExpression *node = new (pool) AST::IdentifierExpression(stringRef(1)); + node->identifierToken = loc(1); + sym(1).Node = node; + } break; +./ + +UiSimpleQualifiedId: UiSimpleQualifiedId T_DOT T_IDENTIFIER; +/. + case $rule_number: { + AST::FieldMemberExpression *node = new (pool) AST::FieldMemberExpression(sym(1).Expression, stringRef(3)); + node->dotToken = loc(2); + node->identifierToken = loc(3); + sym(1).Node = node; + } break; +./ + +UiAnnotationObjectDefinition: UiSimpleQualifiedId UiObjectInitializer; +/. + case $rule_number: { + if (AST::UiQualifiedId *qualifiedId = reparseAsQualifiedId(sym(1).Expression)) { + sym(1).UiQualifiedId = qualifiedId; + } else { + sym(1).UiQualifiedId = 0; + + diagnostic_messages.append(compileError(loc(1), + QLatin1String("Expected a qualified name id"))); + + return false; + } + AST::UiObjectDefinition *node = new (pool) AST::UiObjectDefinition(sym(1).UiQualifiedId, sym(2).UiObjectInitializer); + sym(1).Node = node; + } break; +./ + +UiAnnotation: T_AT UiAnnotationObjectDefinition; + +UiAnnotationList: UiAnnotation; +/. + case $rule_number: { + sym(1).Node = new (pool) AST::UiArrayMemberList(sym(1).UiObjectMember); + } break; +./ + +UiAnnotationList: UiAnnotationList UiAnnotation; +/. + case $rule_number: { + AST::UiArrayMemberList *node = new (pool) AST::UiArrayMemberList(sym(1).UiArrayMemberList, sym(3).UiObjectMember); + sym(1).Node = node; + } break; +./ + +UiAnnotatedObject: UiAnnotationList UiObjectDefinition; +/. + case $rule_number: { + sym(1).Node = sym(2).Node; + } break; +./ + +UiAnnotatedObject: UiObjectDefinition; + +UiObjectMemberList: UiAnnotatedObjectMember; /. case $rule_number: { sym(1).Node = new (pool) AST::UiObjectMemberList(sym(1).UiObjectMember); } break; ./ -UiObjectMemberList: UiObjectMemberList UiObjectMember; +UiObjectMemberList: UiObjectMemberList UiAnnotatedObjectMember; /. case $rule_number: { AST::UiObjectMemberList *node = new (pool) AST:: UiObjectMemberList(sym(1).UiObjectMemberList, sym(2).UiObjectMember); @@ -979,6 +1042,15 @@ UiObjectDefinition: UiQualifiedId UiObjectInitializer; } break; ./ +UiAnnotatedObjectMember: UiAnnotationList UiObjectMember; +/. + case $rule_number: { + sym(1).Node = sym(2).Node; + } break; +./ + +UiAnnotatedObjectMember: UiObjectMember; + UiObjectMember: UiObjectDefinition; UiObjectMember: UiQualifiedId T_COLON ExpressionStatementLookahead T_LBRACKET UiArrayMemberList T_RBRACKET; @@ -1278,6 +1350,18 @@ OptionalSemicolon: | Semicolon; and then we would miss a semicolon (see tests/auto/quick/qquickvisualdatamodel/data/objectlist.qml)*/ ./ +UiRequired: T_REQUIRED QmlIdentifier Semicolon; +/. + case $rule_number: { + AST::UiRequired *node = new (pool) AST::UiRequired(stringRef(2)); + node->requiredToken = loc(1); + node->semicolonToken = loc(3); + sym(1).Node = node; + } break; +./ + +UiObjectMember: UiRequired; + UiObjectMember: T_REQUIRED UiObjectMemberPropertyNoInitialiser; /. case $rule_number: { @@ -1288,7 +1372,6 @@ UiObjectMember: T_REQUIRED UiObjectMemberPropertyNoInitialiser; } break; ./ - UiObjectMemberWithScriptStatement: T_PROPERTY UiPropertyType QmlIdentifier T_COLON UiScriptStatement OptionalSemicolon; /. case $rule_number: { diff --git a/src/qml/parser/qqmljsast.cpp b/src/qml/parser/qqmljsast.cpp index aa3e8ab5e3..416916c547 100644 --- a/src/qml/parser/qqmljsast.cpp +++ b/src/qml/parser/qqmljsast.cpp @@ -1554,6 +1554,14 @@ void UiInlineComponent::accept0(Visitor *visitor) visitor->endVisit(this); } +void UiRequired::accept0(Visitor *visitor) +{ + if (visitor->visit(this)) { + } + + visitor->endVisit(this); +} + } } // namespace QQmlJS::AST QT_END_NAMESPACE diff --git a/src/qml/parser/qqmljsast_p.h b/src/qml/parser/qqmljsast_p.h index a7c95eee2d..446704be91 100644 --- a/src/qml/parser/qqmljsast_p.h +++ b/src/qml/parser/qqmljsast_p.h @@ -259,7 +259,8 @@ public: Kind_UiHeaderItemList, Kind_UiEnumDeclaration, Kind_UiEnumMemberList, - Kind_UiVersionSpecifier + Kind_UiVersionSpecifier, + Kind_UiRequired }; inline Node() {} @@ -3106,6 +3107,28 @@ public: SourceLocation semicolonToken; }; +class QML_PARSER_EXPORT UiRequired: public Node +{ +public: + QQMLJS_DECLARE_AST_NODE(UiRequired) + + UiRequired(QStringRef name) + :name(name) + { kind = K; } + + void accept0(Visitor *visitor) override; + + SourceLocation firstSourceLocation() const override + { return requiredToken; } + + SourceLocation lastSourceLocation() const override + { return semicolonToken; } + + QStringRef name; + SourceLocation requiredToken; + SourceLocation semicolonToken; +}; + class QML_PARSER_EXPORT UiHeaderItemList: public Node { public: diff --git a/src/qml/parser/qqmljsastfwd_p.h b/src/qml/parser/qqmljsastfwd_p.h index 8a8ee2dfae..fe260e2bb5 100644 --- a/src/qml/parser/qqmljsastfwd_p.h +++ b/src/qml/parser/qqmljsastfwd_p.h @@ -183,6 +183,7 @@ class UiHeaderItemList; class UiEnumDeclaration; class UiEnumMemberList; class UiVersionSpecifier; +class UiRequired; } // namespace AST } // namespace QQmlJS diff --git a/src/qml/parser/qqmljsastvisitor_p.h b/src/qml/parser/qqmljsastvisitor_p.h index d6b92990ad..fcc48da1d3 100644 --- a/src/qml/parser/qqmljsastvisitor_p.h +++ b/src/qml/parser/qqmljsastvisitor_p.h @@ -414,6 +414,9 @@ public: virtual bool visit(TypeAnnotation *) { return true; } virtual void endVisit(TypeAnnotation *) {} + virtual bool visit(UiRequired *) { return true; } + virtual void endVisit(UiRequired *) {} + virtual void throwRecursionDepthError() = 0; quint16 recursionDepth() const { return m_recursionDepth; } diff --git a/src/qml/parser/qqmljslexer.cpp b/src/qml/parser/qqmljslexer.cpp index 80d883e52f..0c61679f0b 100644 --- a/src/qml/parser/qqmljslexer.cpp +++ b/src/qml/parser/qqmljslexer.cpp @@ -719,6 +719,8 @@ again: case ')': return T_RPAREN; case '(': return T_LPAREN; + case '@': return T_AT; + case '&': if (_char == QLatin1Char('=')) { scanChar(); |