diff options
Diffstat (limited to 'src/qml/parser')
-rw-r--r-- | src/qml/parser/parser.pri | 4 | ||||
-rw-r--r-- | src/qml/parser/qqmljs.g | 505 | ||||
-rw-r--r-- | src/qml/parser/qqmljsast.cpp | 276 | ||||
-rw-r--r-- | src/qml/parser/qqmljsast_p.h | 426 | ||||
-rw-r--r-- | src/qml/parser/qqmljsastfwd_p.h | 8 | ||||
-rw-r--r-- | src/qml/parser/qqmljsastvisitor.cpp | 6 | ||||
-rw-r--r-- | src/qml/parser/qqmljsastvisitor_p.h | 800 | ||||
-rw-r--r-- | src/qml/parser/qqmljsengine_p.cpp | 4 | ||||
-rw-r--r-- | src/qml/parser/qqmljsengine_p.h | 6 | ||||
-rw-r--r-- | src/qml/parser/qqmljskeywords_p.h | 31 | ||||
-rw-r--r-- | src/qml/parser/qqmljslexer.cpp | 101 | ||||
-rw-r--r-- | src/qml/parser/qqmljssourcelocation_p.h | 87 |
12 files changed, 1472 insertions, 782 deletions
diff --git a/src/qml/parser/parser.pri b/src/qml/parser/parser.pri index e15730f5d1..57855a82f9 100644 --- a/src/qml/parser/parser.pri +++ b/src/qml/parser/parser.pri @@ -5,9 +5,7 @@ HEADERS += \ $$PWD/qqmljsengine_p.h \ $$PWD/qqmljslexer_p.h \ $$PWD/qqmljsglobal_p.h \ - $$PWD/qqmljskeywords_p.h \ - $$PWD/qqmljsengine_p.h \ - $$PWD/qqmljssourcelocation_p.h + $$PWD/qqmljskeywords_p.h SOURCES += \ $$PWD/qqmljsast.cpp \ diff --git a/src/qml/parser/qqmljs.g b/src/qml/parser/qqmljs.g index 0d9507fe2f..e4b7198b30 100644 --- a/src/qml/parser/qqmljs.g +++ b/src/qml/parser/qqmljs.g @@ -49,6 +49,7 @@ %token T_DIVIDE_EQ "/=" T_DO "do" T_DOT "." %token T_ELSE "else" T_EQ "=" T_EQ_EQ "==" %token T_EQ_EQ_EQ "===" T_FINALLY "finally" T_FOR "for" +%token T_FUNCTION_STAR "function *" %token T_FUNCTION "function" T_GE ">=" T_GT ">" %token T_GT_GT ">>" T_GT_GT_EQ ">>=" T_GT_GT_GT ">>>" %token T_GT_GT_GT_EQ ">>>=" T_IDENTIFIER "identifier" T_IF "if" @@ -72,13 +73,14 @@ %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" %token T_COMMENT "comment" %token T_COMPATIBILITY_SEMICOLON %token T_ARROW "=>" +%token T_QUESTION_QUESTION "??" %token T_ENUM "enum" %token T_ELLIPSIS "..." %token T_YIELD "yield" @@ -88,6 +90,8 @@ %token T_STATIC "static" %token T_EXPORT "export" %token T_FROM "from" +%token T_REQUIRED "required" +%token T_COMPONENT "component" --- template strings %token T_NO_SUBSTITUTION_TEMPLATE"(no subst template)" @@ -120,8 +124,9 @@ %token T_FOR_LOOKAHEAD_OK "(for lookahead ok)" --%left T_PLUS T_MINUS -%nonassoc T_IDENTIFIER T_COLON T_SIGNAL T_PROPERTY T_READONLY T_ON T_SET T_GET T_OF T_STATIC T_FROM T_AS +%nonassoc T_IDENTIFIER T_COLON T_SIGNAL T_PROPERTY T_READONLY T_ON T_SET T_GET T_OF T_STATIC T_FROM T_AS T_REQUIRED T_COMPONENT %nonassoc REDUCE_HERE +%right T_THEN T_ELSE %right T_WITHOUTAS T_AS %start TopLevel @@ -321,6 +326,8 @@ public: AST::UiQualifiedId *UiQualifiedId; AST::UiEnumMemberList *UiEnumMemberList; AST::UiVersionSpecifier *UiVersionSpecifier; + AST::UiAnnotation *UiAnnotation; + AST::UiAnnotationList *UiAnnotationList; }; public: @@ -383,10 +390,10 @@ public: { return diagnosticMessage().message; } inline int errorLineNumber() const - { return diagnosticMessage().line; } + { return diagnosticMessage().loc.startLine; } inline int errorColumnNumber() const - { return diagnosticMessage().column; } + { return diagnosticMessage().loc.startColumn; } protected: bool parse(int startToken); @@ -402,7 +409,7 @@ protected: inline QStringRef &rawStringRef(int index) { return rawString_stack [tos + index - 1]; } - inline AST::SourceLocation &loc(int index) + inline SourceLocation &loc(int index) { return location_stack [tos + index - 1]; } AST::UiQualifiedId *reparseAsQualifiedId(AST::ExpressionNode *expr); @@ -410,21 +417,20 @@ protected: void pushToken(int token); int lookaheadToken(Lexer *lexer); - static DiagnosticMessage compileError(const AST::SourceLocation &location, + static DiagnosticMessage compileError(const SourceLocation &location, const QString &message, QtMsgType kind = QtCriticalMsg) { DiagnosticMessage error; - error.line = location.startLine; - error.column = location.startColumn; + error.loc = location; error.message = message; error.type = kind; return error; } - void syntaxError(const AST::SourceLocation &location, const char *message) { + void syntaxError(const SourceLocation &location, const char *message) { diagnostic_messages.append(compileError(location, QLatin1String(message))); } - void syntaxError(const AST::SourceLocation &location, const QString &message) { + void syntaxError(const SourceLocation &location, const QString &message) { diagnostic_messages.append(compileError(location, message)); } @@ -437,7 +443,7 @@ protected: int stack_size = 0; Value *sym_stack = nullptr; int *state_stack = nullptr; - AST::SourceLocation *location_stack = nullptr; + SourceLocation *location_stack = nullptr; QVector<QStringRef> string_stack; QVector<QStringRef> rawString_stack; @@ -449,7 +455,7 @@ protected: struct SavedToken { int token; double dval; - AST::SourceLocation loc; + SourceLocation loc; QStringRef spell; QStringRef raw; }; @@ -458,8 +464,8 @@ protected: double yylval = 0.; QStringRef yytokenspell; QStringRef yytokenraw; - AST::SourceLocation yylloc; - AST::SourceLocation yyprevlloc; + SourceLocation yylloc; + SourceLocation yyprevlloc; SavedToken token_buffer[TOKEN_BUFFER_SIZE]; SavedToken *first_token = nullptr; @@ -472,7 +478,7 @@ protected: CE_ParenthesizedExpression, CE_FormalParameterList }; - AST::SourceLocation coverExpressionErrorLocation; + SourceLocation coverExpressionErrorLocation; CoverExpressionType coverExpressionType = CE_Invalid; QList<DiagnosticMessage> diagnostic_messages; @@ -517,7 +523,7 @@ void Parser::reallocateStack() sym_stack = reinterpret_cast<Value*> (realloc(sym_stack, stack_size * sizeof(Value))); state_stack = reinterpret_cast<int*> (realloc(state_stack, stack_size * sizeof(int))); - location_stack = reinterpret_cast<AST::SourceLocation*> (realloc(location_stack, stack_size * sizeof(AST::SourceLocation))); + location_stack = reinterpret_cast<SourceLocation*> (realloc(location_stack, stack_size * sizeof(SourceLocation))); string_stack.resize(stack_size); rawString_stack.resize(stack_size); } @@ -537,9 +543,9 @@ Parser::~Parser() } } -static inline AST::SourceLocation location(Lexer *lexer) +static inline SourceLocation location(Lexer *lexer) { - AST::SourceLocation loc; + SourceLocation loc; loc.offset = lexer->tokenOffset(); loc.length = lexer->tokenLength(); loc.startLine = lexer->tokenStartLine(); @@ -550,7 +556,7 @@ static inline AST::SourceLocation location(Lexer *lexer) AST::UiQualifiedId *Parser::reparseAsQualifiedId(AST::ExpressionNode *expr) { QVarLengthArray<QStringRef, 4> nameIds; - QVarLengthArray<AST::SourceLocation, 4> locations; + QVarLengthArray<SourceLocation, 4> locations; AST::ExpressionNode *it = expr; while (AST::FieldMemberExpression *m = AST::cast<AST::FieldMemberExpression *>(it)) { @@ -734,7 +740,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; @@ -849,13 +855,7 @@ UiVersionSpecifier: T_VERSION_NUMBER; UiImport: UiImportHead UiVersionSpecifier Semicolon; /. case $rule_number: { - auto versionToken = loc(2); - auto version = sym(2).UiVersionSpecifier; - sym(1).UiImport->version = version; - if (version->minorToken.isValid()) { - versionToken.length += version->minorToken.length + (version->minorToken.offset - versionToken.offset - versionToken.length); - } - sym(1).UiImport->versionToken = versionToken; + sym(1).UiImport->version = sym(2).UiVersionSpecifier; sym(1).UiImport->semicolonToken = loc(3); } break; ./ @@ -863,7 +863,6 @@ UiImport: UiImportHead UiVersionSpecifier Semicolon; UiImport: UiImportHead UiVersionSpecifier T_AS QmlIdentifier Semicolon; /. case $rule_number: { - sym(1).UiImport->versionToken = loc(2); sym(1).UiImport->version = sym(2).UiVersionSpecifier; sym(1).UiImport->asToken = loc(3); sym(1).UiImport->importIdToken = loc(4); @@ -915,21 +914,92 @@ 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::UiAnnotation *node = new (pool) AST::UiAnnotation(sym(1).UiQualifiedId, sym(2).UiObjectInitializer); + sym(1).Node = node; + } break; +./ + +UiAnnotation: T_AT UiAnnotationObjectDefinition; +/. +case $rule_number: { + sym(1).Node = sym(2).Node; +} break; +./ + + +UiAnnotationList: UiAnnotation; +/. + case $rule_number: { + 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).UiAnnotation); + sym(1).Node = node; + } break; +./ + +UiAnnotatedObject: UiAnnotationList UiObjectDefinition; +/. + case $rule_number: { + AST::UiObjectDefinition *node = sym(2).UiObjectDefinition; + node->annotations = sym(1).UiAnnotationList->finish(); + sym(1).Node = 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); @@ -981,6 +1051,17 @@ UiObjectDefinition: UiQualifiedId UiObjectInitializer; } break; ./ +UiAnnotatedObjectMember: UiAnnotationList UiObjectMember; +/. + case $rule_number: { + AST::UiObjectMember *node = sym(2).UiObjectMember; + node->annotations = sym(1).UiAnnotationList->finish(); + sym(1).Node = sym(2).Node; + } break; +./ + +UiAnnotatedObjectMember: UiObjectMember; + UiObjectMember: UiObjectDefinition; UiObjectMember: UiQualifiedId T_COLON ExpressionStatementLookahead T_LBRACKET UiArrayMemberList T_RBRACKET; @@ -1016,15 +1097,27 @@ UiObjectMember: UiQualifiedId T_ON UiQualifiedId UiObjectInitializer; ./ -UiObjectLiteral: T_LBRACE ExpressionStatementLookahead UiPropertyDefinitionList T_RBRACE; -/. case $rule_number: Q_FALLTHROUGH(); ./ -UiObjectLiteral: T_LBRACE ExpressionStatementLookahead UiPropertyDefinitionList T_COMMA T_RBRACE; +UiObjectLiteral: T_LBRACE ExpressionStatementLookahead UiPropertyDefinitionList T_RBRACE Semicolon; /. case $rule_number: { AST::ObjectPattern *l = new (pool) AST::ObjectPattern(sym(3).PatternPropertyList->finish()); l->lbraceToken = loc(1); l->rbraceToken = loc(4); AST::ExpressionStatement *node = new (pool) AST::ExpressionStatement(l); + node->semicolonToken = loc(5); + sym(1).Node = node; + } break; +./ + + +UiObjectLiteral: T_LBRACE ExpressionStatementLookahead UiPropertyDefinitionList T_COMMA T_RBRACE Semicolon; +/. + case $rule_number: { + AST::ObjectPattern *l = new (pool) AST::ObjectPattern(sym(3).PatternPropertyList->finish()); + l->lbraceToken = loc(1); + l->rbraceToken = loc(5); + AST::ExpressionStatement *node = new (pool) AST::ExpressionStatement(l); + node->semicolonToken = loc(6); sym(1).Node = node; } break; ./ @@ -1176,7 +1269,7 @@ UiObjectMember: T_SIGNAL T_IDENTIFIER Semicolon; } break; ./ -UiObjectMember: T_PROPERTY T_IDENTIFIER T_LT UiPropertyType T_GT QmlIdentifier Semicolon; +UiObjectMemberListPropertyNoInitialiser: T_PROPERTY T_IDENTIFIER T_LT UiPropertyType T_GT QmlIdentifier Semicolon; /. case $rule_number: { AST::UiPublicMember *node = new (pool) AST::UiPublicMember(sym(4).UiQualifiedId->finish(), stringRef(6)); @@ -1190,23 +1283,19 @@ UiObjectMember: T_PROPERTY T_IDENTIFIER T_LT UiPropertyType T_GT QmlIdentifier S } break; ./ -UiObjectMember: T_READONLY T_PROPERTY T_IDENTIFIER T_LT UiPropertyType T_GT QmlIdentifier Semicolon; +UiObjectMember: UiObjectMemberListPropertyNoInitialiser; + +UiObjectMember: T_READONLY UiObjectMemberListPropertyNoInitialiser; /. case $rule_number: { - AST::UiPublicMember *node = new (pool) AST::UiPublicMember(sym(5).UiQualifiedId->finish(), stringRef(7)); + AST::UiPublicMember *node = sym(2).UiPublicMember; node->isReadonlyMember = true; node->readonlyToken = loc(1); - node->typeModifier = stringRef(3); - node->propertyToken = loc(2); - node->typeModifierToken = loc(3); - node->typeToken = loc(5); - node->identifierToken = loc(7); - node->semicolonToken = loc(8); sym(1).Node = node; } break; ./ -UiObjectMember: T_PROPERTY UiPropertyType QmlIdentifier Semicolon; +UiObjectMemberPropertyNoInitialiser: T_PROPERTY UiPropertyType QmlIdentifier Semicolon; /. case $rule_number: { AST::UiPublicMember *node = new (pool) AST::UiPublicMember(sym(2).UiQualifiedId->finish(), stringRef(3)); @@ -1218,42 +1307,83 @@ UiObjectMember: T_PROPERTY UiPropertyType QmlIdentifier Semicolon; } break; ./ -UiObjectMember: T_DEFAULT T_PROPERTY UiPropertyType QmlIdentifier Semicolon; + +UiObjectMember: UiObjectMemberPropertyNoInitialiser; + +UiObjectMember: T_DEFAULT UiObjectMemberPropertyNoInitialiser; /. case $rule_number: { - AST::UiPublicMember *node = new (pool) AST::UiPublicMember(sym(3).UiQualifiedId->finish(), stringRef(4)); + AST::UiPublicMember *node = sym(2).UiPublicMember; node->isDefaultMember = true; node->defaultToken = loc(1); - node->propertyToken = loc(2); - node->typeToken = loc(3); - node->identifierToken = loc(4); - node->semicolonToken = loc(5); sym(1).Node = node; } break; ./ -UiObjectMember: T_DEFAULT T_PROPERTY T_IDENTIFIER T_LT UiPropertyType T_GT QmlIdentifier Semicolon; +UiObjectMember: T_DEFAULT UiObjectMemberListPropertyNoInitialiser; /. case $rule_number: { - AST::UiPublicMember *node = new (pool) AST::UiPublicMember(sym(5).UiQualifiedId->finish(), stringRef(7)); + AST::UiPublicMember *node = sym(2).UiPublicMember; node->isDefaultMember = true; node->defaultToken = loc(1); - node->typeModifier = stringRef(3); - node->propertyToken = loc(2); - node->typeModifierToken = loc(2); - node->typeToken = loc(4); - node->identifierToken = loc(7); - node->semicolonToken = loc(8); sym(1).Node = node; } break; ./ + +UiObjectMember: T_DEFAULT T_REQUIRED UiObjectMemberPropertyNoInitialiser; +/. + case $rule_number: { + AST::UiPublicMember *node = sym(3).UiPublicMember; + node->isDefaultMember = true; + node->defaultToken = loc(1); + node->isRequired = true; + node->requiredToken = loc(2); + sym(1).Node = node; + } break; +./ + + +UiObjectMember: T_REQUIRED T_DEFAULT UiObjectMemberPropertyNoInitialiser; +/. + case $rule_number: { + AST::UiPublicMember *node = sym(3).UiPublicMember; + node->isDefaultMember = true; + node->defaultToken = loc(2); + node->isRequired = true; + node->requiredToken = loc(1); + sym(1).Node = node; + } break; +./ + OptionalSemicolon: | Semicolon; /. /* we need OptionalSemicolon because UiScriptStatement might already parse the last semicolon and then we would miss a semicolon (see tests/auto/quick/qquickvisualdatamodel/data/objectlist.qml)*/ ./ -UiObjectMember: T_PROPERTY UiPropertyType QmlIdentifier T_COLON UiScriptStatement OptionalSemicolon; +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: { + AST::UiPublicMember *node = sym(2).UiPublicMember; + node->requiredToken = loc(1); + node->isRequired = true; + sym(1).Node = node; + } break; +./ + +UiObjectMemberWithScriptStatement: T_PROPERTY UiPropertyType QmlIdentifier T_COLON UiScriptStatement OptionalSemicolon; /. case $rule_number: { AST::UiPublicMember *node = new (pool) AST::UiPublicMember(sym(2).UiQualifiedId->finish(), stringRef(3), sym(5).Statement); @@ -1265,35 +1395,29 @@ UiObjectMember: T_PROPERTY UiPropertyType QmlIdentifier T_COLON UiScriptStatemen } break; ./ -UiObjectMember: T_READONLY T_PROPERTY UiPropertyType QmlIdentifier T_COLON UiScriptStatement OptionalSemicolon; +UiObjectMember: UiObjectMemberWithScriptStatement; + +UiObjectMember: T_READONLY UiObjectMemberWithScriptStatement; /. case $rule_number: { - AST::UiPublicMember *node = new (pool) AST::UiPublicMember(sym(3).UiQualifiedId->finish(), stringRef(4), sym(6).Statement); + AST::UiPublicMember *node = sym(2).UiPublicMember; node->isReadonlyMember = true; node->readonlyToken = loc(1); - node->propertyToken = loc(2); - node->typeToken = loc(3); - node->identifierToken = loc(4); - node->colonToken = loc(5); sym(1).Node = node; } break; ./ -UiObjectMember: T_DEFAULT T_PROPERTY UiPropertyType QmlIdentifier T_COLON UiScriptStatement OptionalSemicolon; +UiObjectMember: T_DEFAULT UiObjectMemberWithScriptStatement; /. case $rule_number: { - AST::UiPublicMember *node = new (pool) AST::UiPublicMember(sym(3).UiQualifiedId->finish(), stringRef(4), sym(6).Statement); + AST::UiPublicMember *node = sym(2).UiPublicMember; node->isDefaultMember = true; node->defaultToken = loc(1); - node->propertyToken = loc(2); - node->typeToken = loc(3); - node->identifierToken = loc(4); - node->colonToken = loc(5); sym(1).Node = node; } break; ./ -UiObjectMember: T_PROPERTY T_IDENTIFIER T_LT UiPropertyType T_GT QmlIdentifier T_COLON T_LBRACKET UiArrayMemberList T_RBRACKET Semicolon; +UiObjectMemberWithArray: T_PROPERTY T_IDENTIFIER T_LT UiPropertyType T_GT QmlIdentifier T_COLON T_LBRACKET UiArrayMemberList T_RBRACKET Semicolon; /. case $rule_number: { AST::UiPublicMember *node = new (pool) AST::UiPublicMember(sym(4).UiQualifiedId->finish(), stringRef(6)); @@ -1319,35 +1443,19 @@ UiObjectMember: T_PROPERTY T_IDENTIFIER T_LT UiPropertyType T_GT QmlIdentifier T } break; ./ -UiObjectMember: T_READONLY T_PROPERTY T_IDENTIFIER T_LT UiPropertyType T_GT QmlIdentifier T_COLON T_LBRACKET UiArrayMemberList T_RBRACKET Semicolon; +UiObjectMember: UiObjectMemberWithArray; + +UiObjectMember: T_READONLY UiObjectMemberWithArray; /. case $rule_number: { - AST::UiPublicMember *node = new (pool) AST::UiPublicMember(sym(5).UiQualifiedId->finish(), stringRef(7)); + AST::UiPublicMember *node = sym(2).UiPublicMember; node->isReadonlyMember = true; node->readonlyToken = loc(1); - node->typeModifier = stringRef(3); - node->propertyToken = loc(2); - node->typeModifierToken = loc(3); - node->typeToken = loc(5); - node->identifierToken = loc(7); - node->semicolonToken = loc(8); // insert a fake ';' before ':' - - AST::UiQualifiedId *propertyName = new (pool) AST::UiQualifiedId(stringRef(7)); - propertyName->identifierToken = loc(7); - propertyName->next = 0; - - AST::UiArrayBinding *binding = new (pool) AST::UiArrayBinding(propertyName, sym(10).UiArrayMemberList->finish()); - binding->colonToken = loc(8); - binding->lbracketToken = loc(9); - binding->rbracketToken = loc(11); - - node->binding = binding; - sym(1).Node = node; } break; ./ -UiObjectMember: T_PROPERTY UiPropertyType QmlIdentifier T_COLON ExpressionStatementLookahead UiQualifiedId UiObjectInitializer Semicolon; +UiObjectMemberExpressionStatementLookahead: T_PROPERTY UiPropertyType QmlIdentifier T_COLON ExpressionStatementLookahead UiQualifiedId UiObjectInitializer Semicolon; /. case $rule_number: { AST::UiPublicMember *node = new (pool) AST::UiPublicMember(sym(2).UiQualifiedId->finish(), stringRef(3)); @@ -1370,43 +1478,30 @@ UiObjectMember: T_PROPERTY UiPropertyType QmlIdentifier T_COLON ExpressionStatem } break; ./ -UiObjectMember: T_READONLY T_PROPERTY UiPropertyType QmlIdentifier T_COLON ExpressionStatementLookahead UiQualifiedId UiObjectInitializer Semicolon; +UiObjectMember: UiObjectMemberExpressionStatementLookahead; + +UiObjectMember: T_READONLY UiObjectMemberExpressionStatementLookahead; /. case $rule_number: { - AST::UiPublicMember *node = new (pool) AST::UiPublicMember(sym(3).UiQualifiedId->finish(), stringRef(4)); + AST::UiPublicMember *node = sym(2).UiPublicMember; node->isReadonlyMember = true; node->readonlyToken = loc(1); - node->propertyToken = loc(2); - node->typeToken = loc(3); - node->identifierToken = loc(4); - node->semicolonToken = loc(5); // insert a fake ';' before ':' - - AST::UiQualifiedId *propertyName = new (pool) AST::UiQualifiedId(stringRef(4)); - propertyName->identifierToken = loc(4); - propertyName->next = 0; - - AST::UiObjectBinding *binding = new (pool) AST::UiObjectBinding( - propertyName, sym(7).UiQualifiedId, sym(8).UiObjectInitializer); - binding->colonToken = loc(5); - - node->binding = binding; - sym(1).Node = node; } break; ./ -UiObjectMember: FunctionDeclarationWithTypes; +UiObjectMember: GeneratorDeclaration; /. case $rule_number: { - sym(1).Node = new (pool) AST::UiSourceElement(sym(1).Node); + auto node = new (pool) AST::UiSourceElement(sym(1).Node); + sym(1).Node = node; } break; ./ -UiObjectMember: GeneratorExpression; +UiObjectMember: FunctionDeclarationWithTypes; /. case $rule_number: { - auto node = new (pool) AST::UiSourceElement(sym(1).Node); - sym(1).Node = node; + sym(1).Node = new (pool) AST::UiSourceElement(sym(1).Node); } break; ./ @@ -1451,6 +1546,19 @@ UiObjectMember: T_ENUM T_IDENTIFIER T_LBRACE EnumMemberList T_RBRACE; } ./ +UiObjectMember: T_COMPONENT T_IDENTIFIER T_COLON UiObjectDefinition; +/. + case $rule_number: { + if (!stringRef(2).front().isUpper()) { + diagnostic_messages.append(compileError(loc(2), + QLatin1String("Type name must be upper case"), QtWarningMsg)); + } + auto inlineComponent = new (pool) AST::UiInlineComponent(stringRef(2), sym(4).UiObjectDefinition); + inlineComponent->componentToken = loc(1); + sym(1).Node = inlineComponent; + } break; +./ + EnumMemberList: T_IDENTIFIER; /. case $rule_number: { @@ -1493,27 +1601,31 @@ EnumMemberList: EnumMemberList T_COMMA T_IDENTIFIER T_EQ T_NUMERIC_LITERAL; } ./ -QmlIdentifier: T_IDENTIFIER; -QmlIdentifier: T_PROPERTY; -QmlIdentifier: T_SIGNAL; -QmlIdentifier: T_READONLY; -QmlIdentifier: T_ON; -QmlIdentifier: T_GET; -QmlIdentifier: T_SET; -QmlIdentifier: T_FROM; -QmlIdentifier: T_OF; - -JsIdentifier: T_IDENTIFIER; -JsIdentifier: T_PROPERTY; -JsIdentifier: T_SIGNAL; -JsIdentifier: T_READONLY; -JsIdentifier: T_ON; -JsIdentifier: T_GET; -JsIdentifier: T_SET; -JsIdentifier: T_FROM; -JsIdentifier: T_STATIC; -JsIdentifier: T_OF; -JsIdentifier: T_AS; +QmlIdentifier: T_IDENTIFIER + | T_PROPERTY + | T_SIGNAL + | T_READONLY + | T_ON + | T_GET + | T_SET + | T_FROM + | T_OF + | T_REQUIRED + | T_COMPONENT; + +JsIdentifier: T_IDENTIFIER + | T_PROPERTY + | T_SIGNAL + | T_READONLY + | T_ON + | T_GET + | T_SET + | T_FROM + | T_STATIC + | T_OF + | T_AS + | T_REQUIRED + | T_COMPONENT; IdentifierReference: JsIdentifier; BindingIdentifier: IdentifierReference; @@ -2537,6 +2649,20 @@ RelationalExpression_In: RelationalExpression_In T_IN ShiftExpression; } break; ./ +TypeAssertExpression_In: RelationalExpression_In T_AS Type; +/. case $rule_number: Q_FALLTHROUGH(); ./ +TypeAssertExpression: RelationalExpression T_AS Type; +/. + case $rule_number: { + AST::BinaryExpression *node = new (pool) AST::BinaryExpression(sym(1).Expression, QSOperator::As, sym(3).Expression); + node->operatorToken = loc(2); + sym(1).Node = node; + } break; +./ + +RelationalExpression_In: TypeAssertExpression_In; +RelationalExpression: TypeAssertExpression; + EqualityExpression_In: RelationalExpression_In; EqualityExpression: RelationalExpression; @@ -2648,13 +2774,48 @@ LogicalORExpression_In: LogicalORExpression_In T_OR_OR LogicalANDExpression_In; } break; ./ +CoalesceExpression: LogicalORExpression; +CoalesceExpression_In: LogicalORExpression_In; -ConditionalExpression: LogicalORExpression; -ConditionalExpression_In: LogicalORExpression_In; +CoalesceExpression: CoalesceExpression T_QUESTION_QUESTION LogicalORExpression; +/. case $rule_number: Q_FALLTHROUGH(); ./ +CoalesceExpression_In: CoalesceExpression_In T_QUESTION_QUESTION LogicalORExpression_In; +/. + case $rule_number: { + + auto *lhs = sym(1).Expression; + auto *rhs = sym(3).Expression; + + // Check if lhs or rhs contain || or && + + if (lhs->binaryExpressionCast() != nullptr) { + auto *binaryExpr = lhs->binaryExpressionCast(); + if (binaryExpr->op == QSOperator::And || binaryExpr->op == QSOperator::Or) { + syntaxError(binaryExpr->operatorToken, "Left-hand side may not contain || or &&"); + return false; + } + } -ConditionalExpression: LogicalORExpression T_QUESTION AssignmentExpression_In T_COLON AssignmentExpression; + if (rhs->binaryExpressionCast() != nullptr) { + auto *binaryExpr = rhs->binaryExpressionCast(); + if (binaryExpr->op == QSOperator::And || binaryExpr->op == QSOperator::Or) { + syntaxError(binaryExpr->operatorToken, "Right-hand side may not contain || or &&"); + return false; + } + } + + AST::BinaryExpression *node = new (pool) AST::BinaryExpression(lhs, QSOperator::Coalesce, rhs); + node->operatorToken = loc(2); + sym(1).Node = node; + } break; +./ + +ConditionalExpression: CoalesceExpression; +ConditionalExpression_In: CoalesceExpression_In; + +ConditionalExpression: CoalesceExpression T_QUESTION AssignmentExpression_In T_COLON AssignmentExpression; /. case $rule_number: Q_FALLTHROUGH(); ./ -ConditionalExpression_In: LogicalORExpression_In T_QUESTION AssignmentExpression_In T_COLON AssignmentExpression_In; +ConditionalExpression_In: CoalesceExpression_In T_QUESTION AssignmentExpression_In T_COLON AssignmentExpression_In; /. case $rule_number: { AST::ConditionalExpression *node = new (pool) AST::ConditionalExpression(sym(1).Expression, sym(3).Expression, sym(5).Expression); @@ -2680,7 +2841,7 @@ AssignmentExpression_In: LeftHandSideExpression T_EQ AssignmentExpression_In; case $rule_number: { // need to convert the LHS to an AssignmentPattern if it was an Array/ObjectLiteral if (AST::Pattern *p = sym(1).Expression->patternCast()) { - AST::SourceLocation errorLoc; + SourceLocation errorLoc; QString errorMsg; if (!p->convertLiteralToAssignmentPattern(pool, &errorLoc, &errorMsg)) { syntaxError(errorLoc, errorMsg); @@ -3233,7 +3394,7 @@ ExpressionStatementLookahead: ; int token = lookaheadToken(lexer); if (token == T_LBRACE) pushToken(T_FORCE_BLOCK); - else if (token == T_FUNCTION || token == T_CLASS || token == T_LET || token == T_CONST) + else if (token == T_FUNCTION || token == T_FUNCTION_STAR || token == T_CLASS || token == T_LET || token == T_CONST) pushToken(T_FORCE_DECLARATION); } break; ./ @@ -3346,7 +3507,7 @@ IterationStatement: T_FOR T_LPAREN LeftHandSideExpression InOrOf Expression_In T case $rule_number: { // need to convert the LHS to an AssignmentPattern if it was an Array/ObjectLiteral if (AST::Pattern *p = sym(3).Expression->patternCast()) { - AST::SourceLocation errorLoc; + SourceLocation errorLoc; QString errorMsg; if (!p->convertLiteralToAssignmentPattern(pool, &errorLoc, &errorMsg)) { syntaxError(errorLoc, errorMsg); @@ -3981,27 +4142,14 @@ GeneratorRBrace: T_RBRACE; } break; ./ -GeneratorDeclaration: Function T_STAR BindingIdentifier GeneratorLParen FormalParameters T_RPAREN FunctionLBrace GeneratorBody GeneratorRBrace; -/. - case $rule_number: { - AST::FunctionDeclaration *node = new (pool) AST::FunctionDeclaration(stringRef(3), sym(5).FormalParameterList, sym(8).StatementList); - node->functionToken = loc(1); - node->identifierToken = loc(3); - node->lparenToken = loc(4); - node->rparenToken = loc(6); - node->lbraceToken = loc(7); - node->rbraceToken = loc(9); - node->isGenerator = true; - sym(1).Node = node; - } break; -./ +FunctionStar: T_FUNCTION_STAR %prec REDUCE_HERE; -GeneratorDeclaration_Default: GeneratorDeclaration; -GeneratorDeclaration_Default: Function T_STAR GeneratorLParen FormalParameters T_RPAREN FunctionLBrace GeneratorBody GeneratorRBrace; +GeneratorDeclaration: FunctionStar BindingIdentifier GeneratorLParen FormalParameters T_RPAREN FunctionLBrace GeneratorBody GeneratorRBrace; /. case $rule_number: { - AST::FunctionDeclaration *node = new (pool) AST::FunctionDeclaration(QStringRef(), sym(4).FormalParameterList, sym(7).StatementList); + AST::FunctionDeclaration *node = new (pool) AST::FunctionDeclaration(stringRef(2), sym(4).FormalParameterList, sym(7).StatementList); node->functionToken = loc(1); + node->identifierToken = loc(2); node->lparenToken = loc(3); node->rparenToken = loc(5); node->lbraceToken = loc(6); @@ -4011,27 +4159,28 @@ GeneratorDeclaration_Default: Function T_STAR GeneratorLParen FormalParameters T } break; ./ -GeneratorExpression: T_FUNCTION T_STAR BindingIdentifier GeneratorLParen FormalParameters T_RPAREN FunctionLBrace GeneratorBody GeneratorRBrace; +GeneratorDeclaration_Default: GeneratorDeclaration; +GeneratorDeclaration_Default: FunctionStar GeneratorLParen FormalParameters T_RPAREN FunctionLBrace GeneratorBody GeneratorRBrace; /. case $rule_number: { - AST::FunctionExpression *node = new (pool) AST::FunctionExpression(stringRef(3), sym(5).FormalParameterList, sym(8).StatementList); + AST::FunctionDeclaration *node = new (pool) AST::FunctionDeclaration(QStringRef(), sym(3).FormalParameterList, sym(6).StatementList); node->functionToken = loc(1); - if (!stringRef(3).isNull()) - node->identifierToken = loc(3); - node->lparenToken = loc(4); - node->rparenToken = loc(6); - node->lbraceToken = loc(7); - node->rbraceToken = loc(9); + node->lparenToken = loc(2); + node->rparenToken = loc(4); + node->lbraceToken = loc(5); + node->rbraceToken = loc(7); node->isGenerator = true; sym(1).Node = node; } break; ./ -GeneratorExpression: T_FUNCTION T_STAR GeneratorLParen FormalParameters T_RPAREN FunctionLBrace GeneratorBody GeneratorRBrace; +GeneratorExpression: T_FUNCTION_STAR BindingIdentifier GeneratorLParen FormalParameters T_RPAREN FunctionLBrace GeneratorBody GeneratorRBrace; /. case $rule_number: { - AST::FunctionExpression *node = new (pool) AST::FunctionExpression(QStringRef(), sym(4).FormalParameterList, sym(7).StatementList); + AST::FunctionExpression *node = new (pool) AST::FunctionExpression(stringRef(2), sym(4).FormalParameterList, sym(7).StatementList); node->functionToken = loc(1); + if (!stringRef(2).isNull()) + node->identifierToken = loc(2); node->lparenToken = loc(3); node->rparenToken = loc(5); node->lbraceToken = loc(6); @@ -4041,6 +4190,20 @@ GeneratorExpression: T_FUNCTION T_STAR GeneratorLParen FormalParameters T_RPAREN } break; ./ +GeneratorExpression: T_FUNCTION_STAR GeneratorLParen FormalParameters T_RPAREN FunctionLBrace GeneratorBody GeneratorRBrace; +/. + case $rule_number: { + AST::FunctionExpression *node = new (pool) AST::FunctionExpression(QStringRef(), sym(3).FormalParameterList, sym(6).StatementList); + node->functionToken = loc(1); + node->lparenToken = loc(2); + node->rparenToken = loc(4); + node->lbraceToken = loc(5); + node->rbraceToken = loc(7); + node->isGenerator = true; + sym(1).Node = node; + } break; +./ + GeneratorBody: FunctionBody; YieldExpression: T_YIELD; @@ -4423,7 +4586,7 @@ ExportDeclarationLookahead: ; /. case $rule_number: { int token = lookaheadToken(lexer); - if (token == T_FUNCTION || token == T_CLASS) + if (token == T_FUNCTION || token == T_FUNCTION_STAR || token == T_CLASS) pushToken(T_FORCE_DECLARATION); } break; ./ diff --git a/src/qml/parser/qqmljsast.cpp b/src/qml/parser/qqmljsast.cpp index b63b2191b9..2a34c5a66c 100644 --- a/src/qml/parser/qqmljsast.cpp +++ b/src/qml/parser/qqmljsast.cpp @@ -105,6 +105,12 @@ ClassExpression *Node::asClassDefinition() return nullptr; } +bool Node::ignoreRecursionDepth() const +{ + static const bool doIgnore = qEnvironmentVariableIsSet("QV4_CRASH_ON_STACKOVERFLOW"); + return doIgnore; +} + ExpressionNode *ExpressionNode::expressionCast() { return this; @@ -161,7 +167,7 @@ UiObjectMember *UiObjectMember::uiObjectMemberCast() return this; } -void NestedExpression::accept0(Visitor *visitor) +void NestedExpression::accept0(BaseVisitor *visitor) { if (visitor->visit(this)) { accept(expression, visitor); @@ -179,7 +185,7 @@ ClassExpression *NestedExpression::asClassDefinition() return expression->asClassDefinition(); } -void ThisExpression::accept0(Visitor *visitor) +void ThisExpression::accept0(BaseVisitor *visitor) { if (visitor->visit(this)) { } @@ -187,7 +193,7 @@ void ThisExpression::accept0(Visitor *visitor) visitor->endVisit(this); } -void IdentifierExpression::accept0(Visitor *visitor) +void IdentifierExpression::accept0(BaseVisitor *visitor) { if (visitor->visit(this)) { } @@ -195,7 +201,7 @@ void IdentifierExpression::accept0(Visitor *visitor) visitor->endVisit(this); } -void NullExpression::accept0(Visitor *visitor) +void NullExpression::accept0(BaseVisitor *visitor) { if (visitor->visit(this)) { } @@ -203,7 +209,7 @@ void NullExpression::accept0(Visitor *visitor) visitor->endVisit(this); } -void TrueLiteral::accept0(Visitor *visitor) +void TrueLiteral::accept0(BaseVisitor *visitor) { if (visitor->visit(this)) { } @@ -211,7 +217,7 @@ void TrueLiteral::accept0(Visitor *visitor) visitor->endVisit(this); } -void FalseLiteral::accept0(Visitor *visitor) +void FalseLiteral::accept0(BaseVisitor *visitor) { if (visitor->visit(this)) { } @@ -219,7 +225,7 @@ void FalseLiteral::accept0(Visitor *visitor) visitor->endVisit(this); } -void SuperLiteral::accept0(Visitor *visitor) +void SuperLiteral::accept0(BaseVisitor *visitor) { if (visitor->visit(this)) { } @@ -228,7 +234,7 @@ void SuperLiteral::accept0(Visitor *visitor) } -void StringLiteral::accept0(Visitor *visitor) +void StringLiteral::accept0(BaseVisitor *visitor) { if (visitor->visit(this)) { } @@ -236,7 +242,7 @@ void StringLiteral::accept0(Visitor *visitor) visitor->endVisit(this); } -void TemplateLiteral::accept0(Visitor *visitor) +void TemplateLiteral::accept0(BaseVisitor *visitor) { bool accepted = true; for (TemplateLiteral *it = this; it && accepted; it = it->next) { @@ -245,7 +251,7 @@ void TemplateLiteral::accept0(Visitor *visitor) } } -void NumericLiteral::accept0(Visitor *visitor) +void NumericLiteral::accept0(BaseVisitor *visitor) { if (visitor->visit(this)) { } @@ -253,7 +259,7 @@ void NumericLiteral::accept0(Visitor *visitor) visitor->endVisit(this); } -void RegExpLiteral::accept0(Visitor *visitor) +void RegExpLiteral::accept0(BaseVisitor *visitor) { if (visitor->visit(this)) { } @@ -261,7 +267,7 @@ void RegExpLiteral::accept0(Visitor *visitor) visitor->endVisit(this); } -void ArrayPattern::accept0(Visitor *visitor) +void ArrayPattern::accept0(BaseVisitor *visitor) { if (visitor->visit(this)) accept(elements, visitor); @@ -281,7 +287,7 @@ bool ArrayPattern::isValidArrayLiteral(SourceLocation *errorLocation) const { return true; } -void ObjectPattern::accept0(Visitor *visitor) +void ObjectPattern::accept0(BaseVisitor *visitor) { if (visitor->visit(this)) { accept(properties, visitor); @@ -456,7 +462,7 @@ bool PatternProperty::convertLiteralToAssignmentPattern(MemoryPool *pool, Source } -void Elision::accept0(Visitor *visitor) +void Elision::accept0(BaseVisitor *visitor) { if (visitor->visit(this)) { // ### @@ -465,7 +471,7 @@ void Elision::accept0(Visitor *visitor) visitor->endVisit(this); } -void IdentifierPropertyName::accept0(Visitor *visitor) +void IdentifierPropertyName::accept0(BaseVisitor *visitor) { if (visitor->visit(this)) { } @@ -473,7 +479,7 @@ void IdentifierPropertyName::accept0(Visitor *visitor) visitor->endVisit(this); } -void StringLiteralPropertyName::accept0(Visitor *visitor) +void StringLiteralPropertyName::accept0(BaseVisitor *visitor) { if (visitor->visit(this)) { } @@ -481,7 +487,7 @@ void StringLiteralPropertyName::accept0(Visitor *visitor) visitor->endVisit(this); } -void NumericLiteralPropertyName::accept0(Visitor *visitor) +void NumericLiteralPropertyName::accept0(BaseVisitor *visitor) { if (visitor->visit(this)) { } @@ -511,7 +517,7 @@ QString NumericLiteralPropertyName::asString()const return locale.toString(id, 'g', 16); } -void ArrayMemberExpression::accept0(Visitor *visitor) +void ArrayMemberExpression::accept0(BaseVisitor *visitor) { if (visitor->visit(this)) { accept(base, visitor); @@ -521,7 +527,7 @@ void ArrayMemberExpression::accept0(Visitor *visitor) visitor->endVisit(this); } -void FieldMemberExpression::accept0(Visitor *visitor) +void FieldMemberExpression::accept0(BaseVisitor *visitor) { if (visitor->visit(this)) { accept(base, visitor); @@ -530,7 +536,7 @@ void FieldMemberExpression::accept0(Visitor *visitor) visitor->endVisit(this); } -void NewMemberExpression::accept0(Visitor *visitor) +void NewMemberExpression::accept0(BaseVisitor *visitor) { if (visitor->visit(this)) { accept(base, visitor); @@ -540,7 +546,7 @@ void NewMemberExpression::accept0(Visitor *visitor) visitor->endVisit(this); } -void NewExpression::accept0(Visitor *visitor) +void NewExpression::accept0(BaseVisitor *visitor) { if (visitor->visit(this)) { accept(expression, visitor); @@ -549,7 +555,7 @@ void NewExpression::accept0(Visitor *visitor) visitor->endVisit(this); } -void CallExpression::accept0(Visitor *visitor) +void CallExpression::accept0(BaseVisitor *visitor) { if (visitor->visit(this)) { accept(base, visitor); @@ -559,7 +565,7 @@ void CallExpression::accept0(Visitor *visitor) visitor->endVisit(this); } -void ArgumentList::accept0(Visitor *visitor) +void ArgumentList::accept0(BaseVisitor *visitor) { if (visitor->visit(this)) { for (ArgumentList *it = this; it; it = it->next) { @@ -570,7 +576,7 @@ void ArgumentList::accept0(Visitor *visitor) visitor->endVisit(this); } -void PostIncrementExpression::accept0(Visitor *visitor) +void PostIncrementExpression::accept0(BaseVisitor *visitor) { if (visitor->visit(this)) { accept(base, visitor); @@ -579,7 +585,7 @@ void PostIncrementExpression::accept0(Visitor *visitor) visitor->endVisit(this); } -void PostDecrementExpression::accept0(Visitor *visitor) +void PostDecrementExpression::accept0(BaseVisitor *visitor) { if (visitor->visit(this)) { accept(base, visitor); @@ -588,7 +594,7 @@ void PostDecrementExpression::accept0(Visitor *visitor) visitor->endVisit(this); } -void DeleteExpression::accept0(Visitor *visitor) +void DeleteExpression::accept0(BaseVisitor *visitor) { if (visitor->visit(this)) { accept(expression, visitor); @@ -597,7 +603,7 @@ void DeleteExpression::accept0(Visitor *visitor) visitor->endVisit(this); } -void VoidExpression::accept0(Visitor *visitor) +void VoidExpression::accept0(BaseVisitor *visitor) { if (visitor->visit(this)) { accept(expression, visitor); @@ -606,7 +612,7 @@ void VoidExpression::accept0(Visitor *visitor) visitor->endVisit(this); } -void TypeOfExpression::accept0(Visitor *visitor) +void TypeOfExpression::accept0(BaseVisitor *visitor) { if (visitor->visit(this)) { accept(expression, visitor); @@ -615,7 +621,7 @@ void TypeOfExpression::accept0(Visitor *visitor) visitor->endVisit(this); } -void PreIncrementExpression::accept0(Visitor *visitor) +void PreIncrementExpression::accept0(BaseVisitor *visitor) { if (visitor->visit(this)) { accept(expression, visitor); @@ -624,7 +630,7 @@ void PreIncrementExpression::accept0(Visitor *visitor) visitor->endVisit(this); } -void PreDecrementExpression::accept0(Visitor *visitor) +void PreDecrementExpression::accept0(BaseVisitor *visitor) { if (visitor->visit(this)) { accept(expression, visitor); @@ -633,7 +639,7 @@ void PreDecrementExpression::accept0(Visitor *visitor) visitor->endVisit(this); } -void UnaryPlusExpression::accept0(Visitor *visitor) +void UnaryPlusExpression::accept0(BaseVisitor *visitor) { if (visitor->visit(this)) { accept(expression, visitor); @@ -642,7 +648,7 @@ void UnaryPlusExpression::accept0(Visitor *visitor) visitor->endVisit(this); } -void UnaryMinusExpression::accept0(Visitor *visitor) +void UnaryMinusExpression::accept0(BaseVisitor *visitor) { if (visitor->visit(this)) { accept(expression, visitor); @@ -651,7 +657,7 @@ void UnaryMinusExpression::accept0(Visitor *visitor) visitor->endVisit(this); } -void TildeExpression::accept0(Visitor *visitor) +void TildeExpression::accept0(BaseVisitor *visitor) { if (visitor->visit(this)) { accept(expression, visitor); @@ -660,7 +666,7 @@ void TildeExpression::accept0(Visitor *visitor) visitor->endVisit(this); } -void NotExpression::accept0(Visitor *visitor) +void NotExpression::accept0(BaseVisitor *visitor) { if (visitor->visit(this)) { accept(expression, visitor); @@ -669,7 +675,7 @@ void NotExpression::accept0(Visitor *visitor) visitor->endVisit(this); } -void BinaryExpression::accept0(Visitor *visitor) +void BinaryExpression::accept0(BaseVisitor *visitor) { if (visitor->visit(this)) { accept(left, visitor); @@ -679,7 +685,7 @@ void BinaryExpression::accept0(Visitor *visitor) visitor->endVisit(this); } -void ConditionalExpression::accept0(Visitor *visitor) +void ConditionalExpression::accept0(BaseVisitor *visitor) { if (visitor->visit(this)) { accept(expression, visitor); @@ -690,7 +696,7 @@ void ConditionalExpression::accept0(Visitor *visitor) visitor->endVisit(this); } -void Expression::accept0(Visitor *visitor) +void Expression::accept0(BaseVisitor *visitor) { if (visitor->visit(this)) { accept(left, visitor); @@ -700,7 +706,7 @@ void Expression::accept0(Visitor *visitor) visitor->endVisit(this); } -void Block::accept0(Visitor *visitor) +void Block::accept0(BaseVisitor *visitor) { if (visitor->visit(this)) { accept(statements, visitor); @@ -709,7 +715,7 @@ void Block::accept0(Visitor *visitor) visitor->endVisit(this); } -void StatementList::accept0(Visitor *visitor) +void StatementList::accept0(BaseVisitor *visitor) { if (visitor->visit(this)) { for (StatementList *it = this; it; it = it->next) { @@ -720,7 +726,7 @@ void StatementList::accept0(Visitor *visitor) visitor->endVisit(this); } -void VariableStatement::accept0(Visitor *visitor) +void VariableStatement::accept0(BaseVisitor *visitor) { if (visitor->visit(this)) { accept(declarations, visitor); @@ -729,7 +735,7 @@ void VariableStatement::accept0(Visitor *visitor) visitor->endVisit(this); } -void VariableDeclarationList::accept0(Visitor *visitor) +void VariableDeclarationList::accept0(BaseVisitor *visitor) { if (visitor->visit(this)) { for (VariableDeclarationList *it = this; it; it = it->next) { @@ -740,7 +746,7 @@ void VariableDeclarationList::accept0(Visitor *visitor) visitor->endVisit(this); } -void EmptyStatement::accept0(Visitor *visitor) +void EmptyStatement::accept0(BaseVisitor *visitor) { if (visitor->visit(this)) { } @@ -748,7 +754,7 @@ void EmptyStatement::accept0(Visitor *visitor) visitor->endVisit(this); } -void ExpressionStatement::accept0(Visitor *visitor) +void ExpressionStatement::accept0(BaseVisitor *visitor) { if (visitor->visit(this)) { accept(expression, visitor); @@ -757,7 +763,7 @@ void ExpressionStatement::accept0(Visitor *visitor) visitor->endVisit(this); } -void IfStatement::accept0(Visitor *visitor) +void IfStatement::accept0(BaseVisitor *visitor) { if (visitor->visit(this)) { accept(expression, visitor); @@ -768,7 +774,7 @@ void IfStatement::accept0(Visitor *visitor) visitor->endVisit(this); } -void DoWhileStatement::accept0(Visitor *visitor) +void DoWhileStatement::accept0(BaseVisitor *visitor) { if (visitor->visit(this)) { accept(statement, visitor); @@ -778,7 +784,7 @@ void DoWhileStatement::accept0(Visitor *visitor) visitor->endVisit(this); } -void WhileStatement::accept0(Visitor *visitor) +void WhileStatement::accept0(BaseVisitor *visitor) { if (visitor->visit(this)) { accept(expression, visitor); @@ -788,7 +794,7 @@ void WhileStatement::accept0(Visitor *visitor) visitor->endVisit(this); } -void ForStatement::accept0(Visitor *visitor) +void ForStatement::accept0(BaseVisitor *visitor) { if (visitor->visit(this)) { accept(initialiser, visitor); @@ -801,7 +807,7 @@ void ForStatement::accept0(Visitor *visitor) visitor->endVisit(this); } -void ForEachStatement::accept0(Visitor *visitor) +void ForEachStatement::accept0(BaseVisitor *visitor) { if (visitor->visit(this)) { accept(lhs, visitor); @@ -812,7 +818,7 @@ void ForEachStatement::accept0(Visitor *visitor) visitor->endVisit(this); } -void ContinueStatement::accept0(Visitor *visitor) +void ContinueStatement::accept0(BaseVisitor *visitor) { if (visitor->visit(this)) { } @@ -820,7 +826,7 @@ void ContinueStatement::accept0(Visitor *visitor) visitor->endVisit(this); } -void BreakStatement::accept0(Visitor *visitor) +void BreakStatement::accept0(BaseVisitor *visitor) { if (visitor->visit(this)) { } @@ -828,7 +834,7 @@ void BreakStatement::accept0(Visitor *visitor) visitor->endVisit(this); } -void ReturnStatement::accept0(Visitor *visitor) +void ReturnStatement::accept0(BaseVisitor *visitor) { if (visitor->visit(this)) { accept(expression, visitor); @@ -837,7 +843,7 @@ void ReturnStatement::accept0(Visitor *visitor) visitor->endVisit(this); } -void YieldExpression::accept0(Visitor *visitor) +void YieldExpression::accept0(BaseVisitor *visitor) { if (visitor->visit(this)) { accept(expression, visitor); @@ -847,7 +853,7 @@ void YieldExpression::accept0(Visitor *visitor) } -void WithStatement::accept0(Visitor *visitor) +void WithStatement::accept0(BaseVisitor *visitor) { if (visitor->visit(this)) { accept(expression, visitor); @@ -857,7 +863,7 @@ void WithStatement::accept0(Visitor *visitor) visitor->endVisit(this); } -void SwitchStatement::accept0(Visitor *visitor) +void SwitchStatement::accept0(BaseVisitor *visitor) { if (visitor->visit(this)) { accept(expression, visitor); @@ -867,7 +873,7 @@ void SwitchStatement::accept0(Visitor *visitor) visitor->endVisit(this); } -void CaseBlock::accept0(Visitor *visitor) +void CaseBlock::accept0(BaseVisitor *visitor) { if (visitor->visit(this)) { accept(clauses, visitor); @@ -878,7 +884,7 @@ void CaseBlock::accept0(Visitor *visitor) visitor->endVisit(this); } -void CaseClauses::accept0(Visitor *visitor) +void CaseClauses::accept0(BaseVisitor *visitor) { if (visitor->visit(this)) { for (CaseClauses *it = this; it; it = it->next) { @@ -889,7 +895,7 @@ void CaseClauses::accept0(Visitor *visitor) visitor->endVisit(this); } -void CaseClause::accept0(Visitor *visitor) +void CaseClause::accept0(BaseVisitor *visitor) { if (visitor->visit(this)) { accept(expression, visitor); @@ -899,7 +905,7 @@ void CaseClause::accept0(Visitor *visitor) visitor->endVisit(this); } -void DefaultClause::accept0(Visitor *visitor) +void DefaultClause::accept0(BaseVisitor *visitor) { if (visitor->visit(this)) { accept(statements, visitor); @@ -908,7 +914,7 @@ void DefaultClause::accept0(Visitor *visitor) visitor->endVisit(this); } -void LabelledStatement::accept0(Visitor *visitor) +void LabelledStatement::accept0(BaseVisitor *visitor) { if (visitor->visit(this)) { accept(statement, visitor); @@ -917,7 +923,7 @@ void LabelledStatement::accept0(Visitor *visitor) visitor->endVisit(this); } -void ThrowStatement::accept0(Visitor *visitor) +void ThrowStatement::accept0(BaseVisitor *visitor) { if (visitor->visit(this)) { accept(expression, visitor); @@ -926,7 +932,7 @@ void ThrowStatement::accept0(Visitor *visitor) visitor->endVisit(this); } -void TryStatement::accept0(Visitor *visitor) +void TryStatement::accept0(BaseVisitor *visitor) { if (visitor->visit(this)) { accept(statement, visitor); @@ -937,7 +943,7 @@ void TryStatement::accept0(Visitor *visitor) visitor->endVisit(this); } -void Catch::accept0(Visitor *visitor) +void Catch::accept0(BaseVisitor *visitor) { if (visitor->visit(this)) { accept(patternElement, visitor); @@ -947,7 +953,7 @@ void Catch::accept0(Visitor *visitor) visitor->endVisit(this); } -void Finally::accept0(Visitor *visitor) +void Finally::accept0(BaseVisitor *visitor) { if (visitor->visit(this)) { accept(statement, visitor); @@ -956,7 +962,7 @@ void Finally::accept0(Visitor *visitor) visitor->endVisit(this); } -void FunctionDeclaration::accept0(Visitor *visitor) +void FunctionDeclaration::accept0(BaseVisitor *visitor) { if (visitor->visit(this)) { accept(formals, visitor); @@ -967,7 +973,7 @@ void FunctionDeclaration::accept0(Visitor *visitor) visitor->endVisit(this); } -void FunctionExpression::accept0(Visitor *visitor) +void FunctionExpression::accept0(BaseVisitor *visitor) { if (visitor->visit(this)) { accept(formals, visitor); @@ -1012,7 +1018,7 @@ BoundNames FormalParameterList::boundNames() const return names; } -void FormalParameterList::accept0(Visitor *visitor) +void FormalParameterList::accept0(BaseVisitor *visitor) { bool accepted = true; for (FormalParameterList *it = this; it && accepted; it = it->next) { @@ -1037,7 +1043,7 @@ FormalParameterList *FormalParameterList::finish(QQmlJS::MemoryPool *pool) return front; } -void Program::accept0(Visitor *visitor) +void Program::accept0(BaseVisitor *visitor) { if (visitor->visit(this)) { accept(statements, visitor); @@ -1046,7 +1052,7 @@ void Program::accept0(Visitor *visitor) visitor->endVisit(this); } -void ImportSpecifier::accept0(Visitor *visitor) +void ImportSpecifier::accept0(BaseVisitor *visitor) { if (visitor->visit(this)) { @@ -1054,7 +1060,7 @@ void ImportSpecifier::accept0(Visitor *visitor) visitor->endVisit(this); } -void ImportsList::accept0(Visitor *visitor) +void ImportsList::accept0(BaseVisitor *visitor) { if (visitor->visit(this)) { for (ImportsList *it = this; it; it = it->next) { @@ -1065,7 +1071,7 @@ void ImportsList::accept0(Visitor *visitor) visitor->endVisit(this); } -void NamedImports::accept0(Visitor *visitor) +void NamedImports::accept0(BaseVisitor *visitor) { if (visitor->visit(this)) { accept(importsList, visitor); @@ -1074,7 +1080,7 @@ void NamedImports::accept0(Visitor *visitor) visitor->endVisit(this); } -void FromClause::accept0(Visitor *visitor) +void FromClause::accept0(BaseVisitor *visitor) { if (visitor->visit(this)) { } @@ -1082,7 +1088,7 @@ void FromClause::accept0(Visitor *visitor) visitor->endVisit(this); } -void NameSpaceImport::accept0(Visitor *visitor) +void NameSpaceImport::accept0(BaseVisitor *visitor) { if (visitor->visit(this)) { } @@ -1090,7 +1096,7 @@ void NameSpaceImport::accept0(Visitor *visitor) visitor->endVisit(this); } -void ImportClause::accept0(Visitor *visitor) +void ImportClause::accept0(BaseVisitor *visitor) { if (visitor->visit(this)) { accept(nameSpaceImport, visitor); @@ -1100,7 +1106,7 @@ void ImportClause::accept0(Visitor *visitor) visitor->endVisit(this); } -void ImportDeclaration::accept0(Visitor *visitor) +void ImportDeclaration::accept0(BaseVisitor *visitor) { if (visitor->visit(this)) { accept(importClause, visitor); @@ -1110,7 +1116,7 @@ void ImportDeclaration::accept0(Visitor *visitor) visitor->endVisit(this); } -void ExportSpecifier::accept0(Visitor *visitor) +void ExportSpecifier::accept0(BaseVisitor *visitor) { if (visitor->visit(this)) { @@ -1119,7 +1125,7 @@ void ExportSpecifier::accept0(Visitor *visitor) visitor->endVisit(this); } -void ExportsList::accept0(Visitor *visitor) +void ExportsList::accept0(BaseVisitor *visitor) { if (visitor->visit(this)) { for (ExportsList *it = this; it; it = it->next) { @@ -1130,7 +1136,7 @@ void ExportsList::accept0(Visitor *visitor) visitor->endVisit(this); } -void ExportClause::accept0(Visitor *visitor) +void ExportClause::accept0(BaseVisitor *visitor) { if (visitor->visit(this)) { accept(exportsList, visitor); @@ -1139,7 +1145,7 @@ void ExportClause::accept0(Visitor *visitor) visitor->endVisit(this); } -void ExportDeclaration::accept0(Visitor *visitor) +void ExportDeclaration::accept0(BaseVisitor *visitor) { if (visitor->visit(this)) { accept(fromClause, visitor); @@ -1150,7 +1156,7 @@ void ExportDeclaration::accept0(Visitor *visitor) visitor->endVisit(this); } -void ESModule::accept0(Visitor *visitor) +void ESModule::accept0(BaseVisitor *visitor) { if (visitor->visit(this)) { accept(body, visitor); @@ -1159,7 +1165,7 @@ void ESModule::accept0(Visitor *visitor) visitor->endVisit(this); } -void DebuggerStatement::accept0(Visitor *visitor) +void DebuggerStatement::accept0(BaseVisitor *visitor) { if (visitor->visit(this)) { } @@ -1167,7 +1173,7 @@ void DebuggerStatement::accept0(Visitor *visitor) visitor->endVisit(this); } -void UiProgram::accept0(Visitor *visitor) +void UiProgram::accept0(BaseVisitor *visitor) { if (visitor->visit(this)) { accept(headers, visitor); @@ -1177,19 +1183,23 @@ void UiProgram::accept0(Visitor *visitor) visitor->endVisit(this); } -void UiPublicMember::accept0(Visitor *visitor) +void UiPublicMember::accept0(BaseVisitor *visitor) { if (visitor->visit(this)) { + // accept(annotations, visitor); // accept manually in visit if interested + // accept(memberType, visitor); // accept manually in visit if interested accept(statement, visitor); accept(binding, visitor); + // accept(parameters, visitor); // accept manually in visit if interested } visitor->endVisit(this); } -void UiObjectDefinition::accept0(Visitor *visitor) +void UiObjectDefinition::accept0(BaseVisitor *visitor) { if (visitor->visit(this)) { + // accept(annotations, visitor); // accept manually in visit if interested accept(qualifiedTypeNameId, visitor); accept(initializer, visitor); } @@ -1197,7 +1207,7 @@ void UiObjectDefinition::accept0(Visitor *visitor) visitor->endVisit(this); } -void UiObjectInitializer::accept0(Visitor *visitor) +void UiObjectInitializer::accept0(BaseVisitor *visitor) { if (visitor->visit(this)) { accept(members, visitor); @@ -1206,16 +1216,18 @@ void UiObjectInitializer::accept0(Visitor *visitor) visitor->endVisit(this); } -void UiParameterList::accept0(Visitor *visitor) +void UiParameterList::accept0(BaseVisitor *visitor) { if (visitor->visit(this)) { + // accept(type, visitor); // accept manually in visit if interested } visitor->endVisit(this); } -void UiObjectBinding::accept0(Visitor *visitor) +void UiObjectBinding::accept0(BaseVisitor *visitor) { if (visitor->visit(this)) { + // accept(annotations, visitor); // accept manually in visit if interested accept(qualifiedId, visitor); accept(qualifiedTypeNameId, visitor); accept(initializer, visitor); @@ -1224,9 +1236,10 @@ void UiObjectBinding::accept0(Visitor *visitor) visitor->endVisit(this); } -void UiScriptBinding::accept0(Visitor *visitor) +void UiScriptBinding::accept0(BaseVisitor *visitor) { if (visitor->visit(this)) { + // accept(annotations, visitor); // accept manually in visit if interested accept(qualifiedId, visitor); accept(statement, visitor); } @@ -1234,9 +1247,10 @@ void UiScriptBinding::accept0(Visitor *visitor) visitor->endVisit(this); } -void UiArrayBinding::accept0(Visitor *visitor) +void UiArrayBinding::accept0(BaseVisitor *visitor) { if (visitor->visit(this)) { + // accept(annotations, visitor); // accept manually in visit if interested accept(qualifiedId, visitor); accept(members, visitor); } @@ -1244,7 +1258,7 @@ void UiArrayBinding::accept0(Visitor *visitor) visitor->endVisit(this); } -void UiObjectMemberList::accept0(Visitor *visitor) +void UiObjectMemberList::accept0(BaseVisitor *visitor) { if (visitor->visit(this)) { for (UiObjectMemberList *it = this; it; it = it->next) @@ -1254,7 +1268,7 @@ void UiObjectMemberList::accept0(Visitor *visitor) visitor->endVisit(this); } -void UiArrayMemberList::accept0(Visitor *visitor) +void UiArrayMemberList::accept0(BaseVisitor *visitor) { if (visitor->visit(this)) { for (UiArrayMemberList *it = this; it; it = it->next) @@ -1264,15 +1278,16 @@ void UiArrayMemberList::accept0(Visitor *visitor) visitor->endVisit(this); } -void UiQualifiedId::accept0(Visitor *visitor) +void UiQualifiedId::accept0(BaseVisitor *visitor) { if (visitor->visit(this)) { + // accept(next, visitor) // accept manually in visit if interested } visitor->endVisit(this); } -void Type::accept0(Visitor *visitor) +void Type::accept0(BaseVisitor *visitor) { if (visitor->visit(this)) { accept(typeId, visitor); @@ -1282,7 +1297,7 @@ void Type::accept0(Visitor *visitor) visitor->endVisit(this); } -void TypeArgumentList::accept0(Visitor *visitor) +void TypeArgumentList::accept0(BaseVisitor *visitor) { if (visitor->visit(this)) { for (TypeArgumentList *it = this; it; it = it->next) @@ -1292,7 +1307,7 @@ void TypeArgumentList::accept0(Visitor *visitor) visitor->endVisit(this); } -void TypeAnnotation::accept0(Visitor *visitor) +void TypeAnnotation::accept0(BaseVisitor *visitor) { if (visitor->visit(this)) { accept(type, visitor); @@ -1301,16 +1316,17 @@ void TypeAnnotation::accept0(Visitor *visitor) visitor->endVisit(this); } -void UiImport::accept0(Visitor *visitor) +void UiImport::accept0(BaseVisitor *visitor) { if (visitor->visit(this)) { accept(importUri, visitor); + // accept(version, visitor); // accept manually in visit if interested } visitor->endVisit(this); } -void UiPragma::accept0(Visitor *visitor) +void UiPragma::accept0(BaseVisitor *visitor) { if (visitor->visit(this)) { } @@ -1318,7 +1334,7 @@ void UiPragma::accept0(Visitor *visitor) visitor->endVisit(this); } -void UiHeaderItemList::accept0(Visitor *visitor) +void UiHeaderItemList::accept0(BaseVisitor *visitor) { bool accepted = true; for (UiHeaderItemList *it = this; it && accepted; it = it->next) { @@ -1331,25 +1347,27 @@ void UiHeaderItemList::accept0(Visitor *visitor) } -void UiSourceElement::accept0(Visitor *visitor) +void UiSourceElement::accept0(BaseVisitor *visitor) { if (visitor->visit(this)) { + // accept(annotations, visitor); // accept manually in visit if interested accept(sourceElement, visitor); } visitor->endVisit(this); } -void UiEnumDeclaration::accept0(Visitor *visitor) +void UiEnumDeclaration::accept0(BaseVisitor *visitor) { if (visitor->visit(this)) { + // accept(annotations, visitor); // accept manually in visit if interested accept(members, visitor); } visitor->endVisit(this); } -void UiEnumMemberList::accept0(Visitor *visitor) +void UiEnumMemberList::accept0(BaseVisitor *visitor) { if (visitor->visit(this)) { } @@ -1357,7 +1375,7 @@ void UiEnumMemberList::accept0(Visitor *visitor) visitor->endVisit(this); } -void TaggedTemplate::accept0(Visitor *visitor) +void TaggedTemplate::accept0(BaseVisitor *visitor) { if (visitor->visit(this)) { accept(base, visitor); @@ -1367,7 +1385,7 @@ void TaggedTemplate::accept0(Visitor *visitor) visitor->endVisit(this); } -void PatternElement::accept0(Visitor *visitor) +void PatternElement::accept0(BaseVisitor *visitor) { if (visitor->visit(this)) { accept(bindingTarget, visitor); @@ -1390,7 +1408,7 @@ void PatternElement::boundNames(BoundNames *names) } } -void PatternElementList::accept0(Visitor *visitor) +void PatternElementList::accept0(BaseVisitor *visitor) { bool accepted = true; for (PatternElementList *it = this; it && accepted; it = it->next) { @@ -1411,7 +1429,7 @@ void PatternElementList::boundNames(BoundNames *names) } } -void PatternProperty::accept0(Visitor *visitor) +void PatternProperty::accept0(BaseVisitor *visitor) { if (visitor->visit(this)) { accept(name, visitor); @@ -1428,7 +1446,7 @@ void PatternProperty::boundNames(BoundNames *names) PatternElement::boundNames(names); } -void PatternPropertyList::accept0(Visitor *visitor) +void PatternPropertyList::accept0(BaseVisitor *visitor) { bool accepted = true; for (PatternPropertyList *it = this; it && accepted; it = it->next) { @@ -1445,7 +1463,7 @@ void PatternPropertyList::boundNames(BoundNames *names) it->property->boundNames(names); } -void ComputedPropertyName::accept0(Visitor *visitor) +void ComputedPropertyName::accept0(BaseVisitor *visitor) { if (visitor->visit(this)) { accept(expression, visitor); @@ -1454,7 +1472,7 @@ void ComputedPropertyName::accept0(Visitor *visitor) visitor->endVisit(this); } -void ClassExpression::accept0(Visitor *visitor) +void ClassExpression::accept0(BaseVisitor *visitor) { if (visitor->visit(this)) { accept(heritage, visitor); @@ -1469,7 +1487,7 @@ ClassExpression *ClassExpression::asClassDefinition() return this; } -void ClassDeclaration::accept0(Visitor *visitor) +void ClassDeclaration::accept0(BaseVisitor *visitor) { if (visitor->visit(this)) { accept(heritage, visitor); @@ -1479,7 +1497,7 @@ void ClassDeclaration::accept0(Visitor *visitor) visitor->endVisit(this); } -void ClassElementList::accept0(Visitor *visitor) +void ClassElementList::accept0(BaseVisitor *visitor) { bool accepted = true; for (ClassElementList *it = this; it && accepted; it = it->next) { @@ -1508,7 +1526,7 @@ LeftHandSideExpression *LeftHandSideExpression::leftHandSideExpressionCast() return this; } -void UiVersionSpecifier::accept0(Visitor *visitor) +void UiVersionSpecifier::accept0(BaseVisitor *visitor) { if (visitor->visit(this)) { } @@ -1539,6 +1557,44 @@ void Type::toString(QString *out) const }; } +void UiInlineComponent::accept0(BaseVisitor *visitor) +{ + if (visitor->visit(this)) { + // accept(annotations, visitor); // accept manually in visit if interested + accept(component, visitor); + } + + visitor->endVisit(this); +} + +void UiRequired::accept0(BaseVisitor *visitor) +{ + if (visitor->visit(this)) { + } + + visitor->endVisit(this); +} + +void UiAnnotationList::accept0(BaseVisitor *visitor) +{ + if (visitor->visit(this)) { + 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); +} + } } // namespace QQmlJS::AST QT_END_NAMESPACE diff --git a/src/qml/parser/qqmljsast_p.h b/src/qml/parser/qqmljsast_p.h index 39194068bf..9eba432e69 100644 --- a/src/qml/parser/qqmljsast_p.h +++ b/src/qml/parser/qqmljsast_p.h @@ -104,6 +104,8 @@ enum Op { URShift, InplaceURightShift, InplaceXor, + As, + Coalesce, Invalid }; @@ -242,6 +244,7 @@ public: Kind_UiImport, Kind_UiObjectBinding, Kind_UiObjectDefinition, + Kind_UiInlineComponent, Kind_UiObjectInitializer, Kind_UiObjectMemberList, Kind_UiArrayMemberList, @@ -255,7 +258,10 @@ public: Kind_UiHeaderItemList, Kind_UiEnumDeclaration, Kind_UiEnumMemberList, - Kind_UiVersionSpecifier + Kind_UiVersionSpecifier, + Kind_UiRequired, + Kind_UiAnnotation, + Kind_UiAnnotationList }; inline Node() {} @@ -275,10 +281,16 @@ public: virtual FunctionExpression *asFunctionDefinition(); virtual ClassExpression *asClassDefinition(); - inline void accept(Visitor *visitor) + bool ignoreRecursionDepth() const; + + inline void accept(BaseVisitor *visitor) { - Visitor::RecursionDepthCheck recursionCheck(visitor); - if (recursionCheck()) { + BaseVisitor::RecursionDepthCheck recursionCheck(visitor); + + // Stack overflow is uncommon, ignoreRecursionDepth() only returns true if + // QV4_CRASH_ON_STACKOVERFLOW is set, and ignoreRecursionDepth() needs to be out of line. + // Therefore, check for ignoreRecursionDepth() _after_ calling the inline recursionCheck(). + if (recursionCheck() || ignoreRecursionDepth()) { if (visitor->preVisit(this)) accept0(visitor); visitor->postVisit(this); @@ -287,19 +299,19 @@ public: } } - inline static void accept(Node *node, Visitor *visitor) + inline static void accept(Node *node, BaseVisitor *visitor) { if (node) node->accept(visitor); } // ### Remove when we can. This is part of the qmldevtools library, though. - inline static void acceptChild(Node *node, Visitor *visitor) + inline static void acceptChild(Node *node, BaseVisitor *visitor) { return accept(node, visitor); } - virtual void accept0(Visitor *visitor) = 0; + virtual void accept0(BaseVisitor *visitor) = 0; virtual SourceLocation firstSourceLocation() const = 0; virtual SourceLocation lastSourceLocation() const = 0; @@ -307,6 +319,14 @@ public: int kind = Kind_Undefined; }; +template<typename T> +T lastListElement(T head) +{ + auto current = head; + while (current->next) + current = current->next; + return current; +} class QML_PARSER_EXPORT UiQualifiedId: public Node { @@ -332,13 +352,13 @@ public: return head; } - void accept0(Visitor *visitor) override; + void accept0(BaseVisitor *visitor) override; SourceLocation firstSourceLocation() const override { return identifierToken; } SourceLocation lastSourceLocation() const override - { return next ? next->lastSourceLocation() : identifierToken; } + { return lastListElement(this)->identifierToken; } // attributes UiQualifiedId *next; @@ -356,7 +376,7 @@ public: , typeArguments(typeArguments) { kind = K; } - void accept0(Visitor *visitor) override; + void accept0(BaseVisitor *visitor) override; SourceLocation firstSourceLocation() const override { return typeId->firstSourceLocation(); } @@ -391,13 +411,13 @@ public: previous->next = this; } - void accept0(Visitor *visitor) override; + void accept0(BaseVisitor *visitor) override; SourceLocation firstSourceLocation() const override { return typeId->firstSourceLocation(); } SourceLocation lastSourceLocation() const override - { return next ? next->lastSourceLocation() : typeId->lastSourceLocation(); } + { return lastListElement(this)->typeId->lastSourceLocation(); } inline TypeArgumentList *finish() { @@ -420,7 +440,7 @@ public: : type(type) { kind = K; } - void accept0(Visitor *visitor) override; + void accept0(BaseVisitor *visitor) override; SourceLocation firstSourceLocation() const override { return colonToken; } @@ -465,7 +485,7 @@ public: : expression(expression) { kind = K; } - void accept0(Visitor *visitor) override; + void accept0(BaseVisitor *visitor) override; SourceLocation firstSourceLocation() const override { return lparenToken; } @@ -490,7 +510,7 @@ public: ThisExpression() { kind = K; } - void accept0(Visitor *visitor) override; + void accept0(BaseVisitor *visitor) override; SourceLocation firstSourceLocation() const override { return thisToken; } @@ -510,7 +530,7 @@ public: IdentifierExpression(const QStringRef &n): name (n) { kind = K; } - void accept0(Visitor *visitor) override; + void accept0(BaseVisitor *visitor) override; SourceLocation firstSourceLocation() const override { return identifierToken; } @@ -530,7 +550,7 @@ public: NullExpression() { kind = K; } - void accept0(Visitor *visitor) override; + void accept0(BaseVisitor *visitor) override; SourceLocation firstSourceLocation() const override { return nullToken; } @@ -549,7 +569,7 @@ public: TrueLiteral() { kind = K; } - void accept0(Visitor *visitor) override; + void accept0(BaseVisitor *visitor) override; SourceLocation firstSourceLocation() const override { return trueToken; } @@ -568,7 +588,7 @@ public: FalseLiteral() { kind = K; } - void accept0(Visitor *visitor) override; + void accept0(BaseVisitor *visitor) override; SourceLocation firstSourceLocation() const override { return falseToken; } @@ -587,7 +607,7 @@ public: SuperLiteral() { kind = K; } - void accept0(Visitor *visitor) override; + void accept0(BaseVisitor *visitor) override; SourceLocation firstSourceLocation() const override { return superToken; } @@ -608,7 +628,7 @@ public: NumericLiteral(double v): value(v) { kind = K; } - void accept0(Visitor *visitor) override; + void accept0(BaseVisitor *visitor) override; SourceLocation firstSourceLocation() const override { return literalToken; } @@ -628,7 +648,7 @@ public: UiVersionSpecifier(int majorum, int minorum) : majorVersion(majorum), minorVersion(minorum) { kind = K; } - void accept0(Visitor *visitor) override; + void accept0(BaseVisitor *visitor) override; SourceLocation firstSourceLocation() const override { return majorToken; } @@ -652,7 +672,7 @@ public: StringLiteral(const QStringRef &v): value (v) { kind = K; } - void accept0(Visitor *visitor) override; + void accept0(BaseVisitor *visitor) override; SourceLocation firstSourceLocation() const override { return literalToken; } @@ -678,9 +698,12 @@ public: { return literalToken; } SourceLocation lastSourceLocation() const override - { return next ? next->lastSourceLocation() : (expression ? expression->lastSourceLocation() : literalToken); } + { + auto last = lastListElement(this); + return (last->expression ? last->expression->lastSourceLocation() : last->literalToken); + } - void accept0(Visitor *visitor) override; + void accept0(BaseVisitor *visitor) override; QStringRef value; QStringRef rawValue; @@ -697,7 +720,7 @@ public: RegExpLiteral(const QStringRef &p, int f): pattern (p), flags (f) { kind = K; } - void accept0(Visitor *visitor) override; + void accept0(BaseVisitor *visitor) override; SourceLocation firstSourceLocation() const override { return literalToken; } @@ -732,7 +755,7 @@ public: : elements(elts) { kind = K; } - void accept0(Visitor *visitor) override; + void accept0(BaseVisitor *visitor) override; SourceLocation firstSourceLocation() const override { return lbracketToken; } @@ -763,7 +786,7 @@ public: : properties(plist) { kind = K; } - void accept0(Visitor *visitor) override; + void accept0(BaseVisitor *visitor) override; SourceLocation firstSourceLocation() const override { return lbraceToken; } @@ -794,13 +817,13 @@ public: previous->next = this; } - void accept0(Visitor *visitor) override; + void accept0(BaseVisitor *visitor) override; SourceLocation firstSourceLocation() const override { return commaToken; } SourceLocation lastSourceLocation() const override - { return next ? next->lastSourceLocation() : commaToken; } + { return lastListElement(this)->commaToken; } inline Elision *finish () { @@ -900,7 +923,7 @@ public: kind = K; } - void accept0(Visitor *visitor) override; + void accept0(BaseVisitor *visitor) override; virtual bool convertLiteralToAssignmentPattern(MemoryPool *pool, SourceLocation *errorLocation, QString *errorMessage); SourceLocation firstSourceLocation() const override @@ -953,7 +976,7 @@ public: return front; } - void accept0(Visitor *visitor) override; + void accept0(BaseVisitor *visitor) override; void boundNames(BoundNames *names); @@ -961,7 +984,10 @@ public: { return elision ? elision->firstSourceLocation() : element->firstSourceLocation(); } SourceLocation lastSourceLocation() const override - { return next ? next->lastSourceLocation() : (element ? element->lastSourceLocation() : elision->lastSourceLocation()); } + { + auto last = lastListElement(this); + return last->element ? last->element->lastSourceLocation() : last->elision->lastSourceLocation(); + } Elision *elision = nullptr; PatternElement *element = nullptr; @@ -985,7 +1011,7 @@ public: : PatternElement(pattern, i), name(name) { kind = K; } - void accept0(Visitor *visitor) override; + void accept0(BaseVisitor *visitor) override; SourceLocation firstSourceLocation() const override { return name->firstSourceLocation(); } @@ -1021,7 +1047,7 @@ public: previous->next = this; } - void accept0(Visitor *visitor) override; + void accept0(BaseVisitor *visitor) override; void boundNames(BoundNames *names); @@ -1036,13 +1062,13 @@ public: { return property->firstSourceLocation(); } SourceLocation lastSourceLocation() const override - { return next ? next->lastSourceLocation() : property->lastSourceLocation(); } + { return lastListElement(this)->property->lastSourceLocation(); } PatternProperty *property; PatternPropertyList *next; }; -class QML_PARSER_EXPORT IdentifierPropertyName : public PropertyName +class QML_PARSER_EXPORT IdentifierPropertyName: public PropertyName { public: QQMLJS_DECLARE_AST_NODE(IdentifierPropertyName) @@ -1050,7 +1076,7 @@ public: IdentifierPropertyName(const QStringRef &n): id (n) { kind = K; } - void accept0(Visitor *visitor) override; + void accept0(BaseVisitor *visitor) override; QString asString() const override { return id.toString(); } @@ -1066,7 +1092,7 @@ public: StringLiteralPropertyName(const QStringRef &n): id (n) { kind = K; } - void accept0(Visitor *visitor) override; + void accept0(BaseVisitor *visitor) override; QString asString() const override { return id.toString(); } @@ -1082,7 +1108,7 @@ public: NumericLiteralPropertyName(double n): id (n) { kind = K; } - void accept0(Visitor *visitor) override; + void accept0(BaseVisitor *visitor) override; QString asString() const override; @@ -1099,7 +1125,7 @@ public: : expression(expression) { kind = K; } - void accept0(Visitor *visitor) override; + void accept0(BaseVisitor *visitor) override; QString asString() const override { return QString(); } @@ -1123,7 +1149,7 @@ public: base (b), expression (e) { kind = K; } - void accept0(Visitor *visitor) override; + void accept0(BaseVisitor *visitor) override; SourceLocation firstSourceLocation() const override { return base->firstSourceLocation(); } @@ -1147,7 +1173,7 @@ public: base (b), name (n) { kind = K; } - void accept0(Visitor *visitor) override; + void accept0(BaseVisitor *visitor) override; SourceLocation firstSourceLocation() const override { return base->firstSourceLocation(); } @@ -1171,7 +1197,7 @@ public: : base (b), templateLiteral(t) { kind = K; } - void accept0(Visitor *visitor) override; + void accept0(BaseVisitor *visitor) override; SourceLocation firstSourceLocation() const override { return base->firstSourceLocation(); } @@ -1193,7 +1219,7 @@ public: base (b), arguments (a) { kind = K; } - void accept0(Visitor *visitor) override; + void accept0(BaseVisitor *visitor) override; SourceLocation firstSourceLocation() const override { return newToken; } @@ -1217,7 +1243,7 @@ public: NewExpression(ExpressionNode *e): expression (e) { kind = K; } - void accept0(Visitor *visitor) override; + void accept0(BaseVisitor *visitor) override; SourceLocation firstSourceLocation() const override { return newToken; } @@ -1239,7 +1265,7 @@ public: base (b), arguments (a) { kind = K; } - void accept0(Visitor *visitor) override; + void accept0(BaseVisitor *visitor) override; SourceLocation firstSourceLocation() const override { return base->firstSourceLocation(); } @@ -1271,7 +1297,7 @@ public: previous->next = this; } - void accept0(Visitor *visitor) override; + void accept0(BaseVisitor *visitor) override; SourceLocation firstSourceLocation() const override { return expression->firstSourceLocation(); } @@ -1305,7 +1331,7 @@ public: PostIncrementExpression(ExpressionNode *b): base (b) { kind = K; } - void accept0(Visitor *visitor) override; + void accept0(BaseVisitor *visitor) override; SourceLocation firstSourceLocation() const override { return base->firstSourceLocation(); } @@ -1326,7 +1352,7 @@ public: PostDecrementExpression(ExpressionNode *b): base (b) { kind = K; } - void accept0(Visitor *visitor) override; + void accept0(BaseVisitor *visitor) override; SourceLocation firstSourceLocation() const override { return base->firstSourceLocation(); } @@ -1347,7 +1373,7 @@ public: DeleteExpression(ExpressionNode *e): expression (e) { kind = K; } - void accept0(Visitor *visitor) override; + void accept0(BaseVisitor *visitor) override; SourceLocation firstSourceLocation() const override { return deleteToken; } @@ -1368,7 +1394,7 @@ public: VoidExpression(ExpressionNode *e): expression (e) { kind = K; } - void accept0(Visitor *visitor) override; + void accept0(BaseVisitor *visitor) override; SourceLocation firstSourceLocation() const override { return voidToken; } @@ -1389,7 +1415,7 @@ public: TypeOfExpression(ExpressionNode *e): expression (e) { kind = K; } - void accept0(Visitor *visitor) override; + void accept0(BaseVisitor *visitor) override; SourceLocation firstSourceLocation() const override { return typeofToken; } @@ -1410,7 +1436,7 @@ public: PreIncrementExpression(ExpressionNode *e): expression (e) { kind = K; } - void accept0(Visitor *visitor) override; + void accept0(BaseVisitor *visitor) override; SourceLocation firstSourceLocation() const override { return incrementToken; } @@ -1431,7 +1457,7 @@ public: PreDecrementExpression(ExpressionNode *e): expression (e) { kind = K; } - void accept0(Visitor *visitor) override; + void accept0(BaseVisitor *visitor) override; SourceLocation firstSourceLocation() const override { return decrementToken; } @@ -1452,7 +1478,7 @@ public: UnaryPlusExpression(ExpressionNode *e): expression (e) { kind = K; } - void accept0(Visitor *visitor) override; + void accept0(BaseVisitor *visitor) override; SourceLocation firstSourceLocation() const override { return plusToken; } @@ -1473,7 +1499,7 @@ public: UnaryMinusExpression(ExpressionNode *e): expression (e) { kind = K; } - void accept0(Visitor *visitor) override; + void accept0(BaseVisitor *visitor) override; SourceLocation firstSourceLocation() const override { return minusToken; } @@ -1494,7 +1520,7 @@ public: TildeExpression(ExpressionNode *e): expression (e) { kind = K; } - void accept0(Visitor *visitor) override; + void accept0(BaseVisitor *visitor) override; SourceLocation firstSourceLocation() const override { return tildeToken; } @@ -1515,7 +1541,7 @@ public: NotExpression(ExpressionNode *e): expression (e) { kind = K; } - void accept0(Visitor *visitor) override; + void accept0(BaseVisitor *visitor) override; SourceLocation firstSourceLocation() const override { return notToken; } @@ -1539,7 +1565,7 @@ public: BinaryExpression *binaryExpressionCast() override; - void accept0(Visitor *visitor) override; + void accept0(BaseVisitor *visitor) override; SourceLocation firstSourceLocation() const override { return left->firstSourceLocation(); } @@ -1563,7 +1589,7 @@ public: expression (e), ok (t), ko (f) { kind = K; } - void accept0(Visitor *visitor) override; + void accept0(BaseVisitor *visitor) override; SourceLocation firstSourceLocation() const override { return expression->firstSourceLocation(); } @@ -1587,7 +1613,7 @@ public: Expression(ExpressionNode *l, ExpressionNode *r): left (l), right (r) { kind = K; } - void accept0(Visitor *visitor) override; + void accept0(BaseVisitor *visitor) override; SourceLocation firstSourceLocation() const override { return left->firstSourceLocation(); } @@ -1609,7 +1635,7 @@ public: Block(StatementList *slist): statements (slist) { kind = K; } - void accept0(Visitor *visitor) override; + void accept0(BaseVisitor *visitor) override; SourceLocation firstSourceLocation() const override { return lbraceToken; } @@ -1639,13 +1665,15 @@ public: return n; } - void accept0(Visitor *visitor) override; + void accept0(BaseVisitor *visitor) override; SourceLocation firstSourceLocation() const override { return statement->firstSourceLocation(); } SourceLocation lastSourceLocation() const override - { return next ? next->lastSourceLocation() : statement->lastSourceLocation(); } + { + return lastListElement(this)->statement->lastSourceLocation(); + } inline StatementList *finish () { @@ -1676,7 +1704,7 @@ public: previous->next = this; } - void accept0(Visitor *visitor) override; + void accept0(BaseVisitor *visitor) override; SourceLocation firstSourceLocation() const override { return declaration->firstSourceLocation(); } @@ -1714,7 +1742,7 @@ public: declarations (vlist) { kind = K; } - void accept0(Visitor *visitor) override; + void accept0(BaseVisitor *visitor) override; SourceLocation firstSourceLocation() const override { return declarationKindToken; } @@ -1734,7 +1762,7 @@ public: EmptyStatement() { kind = K; } - void accept0(Visitor *visitor) override; + void accept0(BaseVisitor *visitor) override; SourceLocation firstSourceLocation() const override { return semicolonToken; } @@ -1754,13 +1782,13 @@ public: ExpressionStatement(ExpressionNode *e): expression (e) { kind = K; } - void accept0(Visitor *visitor) override; + void accept0(BaseVisitor *visitor) override; SourceLocation firstSourceLocation() const override { return expression->firstSourceLocation(); } SourceLocation lastSourceLocation() const override - { return expression->lastSourceLocation(); } + { return semicolonToken; } // attributes ExpressionNode *expression; @@ -1776,7 +1804,7 @@ public: expression (e), ok (t), ko (f) { kind = K; } - void accept0(Visitor *visitor) override; + void accept0(BaseVisitor *visitor) override; SourceLocation firstSourceLocation() const override { return ifToken; } @@ -1808,7 +1836,7 @@ public: statement (stmt), expression (e) { kind = K; } - void accept0(Visitor *visitor) override; + void accept0(BaseVisitor *visitor) override; SourceLocation firstSourceLocation() const override { return doToken; } @@ -1835,7 +1863,7 @@ public: expression (e), statement (stmt) { kind = K; } - void accept0(Visitor *visitor) override; + void accept0(BaseVisitor *visitor) override; SourceLocation firstSourceLocation() const override { return whileToken; } @@ -1865,7 +1893,7 @@ public: { kind = K; } - void accept0(Visitor *visitor) override; + void accept0(BaseVisitor *visitor) override; SourceLocation firstSourceLocation() const override { return forToken; } @@ -1903,7 +1931,7 @@ public: : lhs(v), expression(e), statement(stmt) { kind = K; } - void accept0(Visitor *visitor) override; + void accept0(BaseVisitor *visitor) override; SourceLocation firstSourceLocation() const override { return forToken; } @@ -1934,7 +1962,7 @@ public: ContinueStatement(const QStringRef &l = QStringRef()): label (l) { kind = K; } - void accept0(Visitor *visitor) override; + void accept0(BaseVisitor *visitor) override; SourceLocation firstSourceLocation() const override { return continueToken; } @@ -1957,7 +1985,7 @@ public: BreakStatement(const QStringRef &l): label (l) { kind = K; } - void accept0(Visitor *visitor) override; + void accept0(BaseVisitor *visitor) override; SourceLocation firstSourceLocation() const override { return breakToken; } @@ -1980,7 +2008,7 @@ public: ReturnStatement(ExpressionNode *e): expression (e) { kind = K; } - void accept0(Visitor *visitor) override; + void accept0(BaseVisitor *visitor) override; SourceLocation firstSourceLocation() const override { return returnToken; } @@ -2002,7 +2030,7 @@ public: YieldExpression(ExpressionNode *e = nullptr): expression (e) { kind = K; } - void accept0(Visitor *visitor) override; + void accept0(BaseVisitor *visitor) override; SourceLocation firstSourceLocation() const override { return yieldToken; } @@ -2025,7 +2053,7 @@ public: expression (e), statement (stmt) { kind = K; } - void accept0(Visitor *visitor) override; + void accept0(BaseVisitor *visitor) override; SourceLocation firstSourceLocation() const override { return withToken; } @@ -2050,7 +2078,7 @@ public: clauses (c), defaultClause (d), moreClauses (r) { kind = K; } - void accept0(Visitor *visitor) override; + void accept0(BaseVisitor *visitor) override; SourceLocation firstSourceLocation() const override { return lbraceToken; } @@ -2075,7 +2103,7 @@ public: expression (e), block (b) { kind = K; } - void accept0(Visitor *visitor) override; + void accept0(BaseVisitor *visitor) override; SourceLocation firstSourceLocation() const override { return switchToken; } @@ -2100,7 +2128,7 @@ public: expression (e), statements (slist) { kind = K; } - void accept0(Visitor *visitor) override; + void accept0(BaseVisitor *visitor) override; SourceLocation firstSourceLocation() const override { return caseToken; } @@ -2132,13 +2160,15 @@ public: previous->next = this; } - void accept0(Visitor *visitor) override; + void accept0(BaseVisitor *visitor) override; SourceLocation firstSourceLocation() const override { return clause->firstSourceLocation(); } SourceLocation lastSourceLocation() const override - { return next ? next->lastSourceLocation() : clause->lastSourceLocation(); } + { + return lastListElement(this)->clause->lastSourceLocation(); + } inline CaseClauses *finish () { @@ -2161,7 +2191,7 @@ public: statements (slist) { kind = K; } - void accept0(Visitor *visitor) override; + void accept0(BaseVisitor *visitor) override; SourceLocation firstSourceLocation() const override { return defaultToken; } @@ -2184,7 +2214,7 @@ public: label (l), statement (stmt) { kind = K; } - void accept0(Visitor *visitor) override; + void accept0(BaseVisitor *visitor) override; SourceLocation firstSourceLocation() const override { return identifierToken; } @@ -2207,7 +2237,7 @@ public: ThrowStatement(ExpressionNode *e): expression (e) { kind = K; } - void accept0(Visitor *visitor) override; + void accept0(BaseVisitor *visitor) override; SourceLocation firstSourceLocation() const override { return throwToken; } @@ -2230,7 +2260,7 @@ public: : patternElement(p), statement(stmt) { kind = K; } - void accept0(Visitor *visitor) override; + void accept0(BaseVisitor *visitor) override; SourceLocation firstSourceLocation() const override { return catchToken; } @@ -2256,7 +2286,7 @@ public: statement (stmt) { kind = K; } - void accept0(Visitor *visitor) override; + void accept0(BaseVisitor *visitor) override; SourceLocation firstSourceLocation() const override { return finallyToken; } @@ -2286,7 +2316,7 @@ public: statement (stmt), catchExpression (c), finallyExpression (nullptr) { kind = K; } - void accept0(Visitor *visitor) override; + void accept0(BaseVisitor *visitor) override; SourceLocation firstSourceLocation() const override { return tryToken; } @@ -2318,7 +2348,7 @@ public: typeAnnotation(typeAnnotation) { kind = K; } - void accept0(Visitor *visitor) override; + void accept0(BaseVisitor *visitor) override; SourceLocation firstSourceLocation() const override { return functionToken; } @@ -2352,7 +2382,7 @@ public: FunctionExpression(n, f, b, typeAnnotation) { kind = K; } - void accept0(Visitor *visitor) override; + void accept0(BaseVisitor *visitor) override; }; class QML_PARSER_EXPORT FormalParameterList: public Node @@ -2423,13 +2453,15 @@ public: BoundNames boundNames() const; - void accept0(Visitor *visitor) override; + void accept0(BaseVisitor *visitor) override; SourceLocation firstSourceLocation() const override { return element->firstSourceLocation(); } SourceLocation lastSourceLocation() const override - { return next ? next->lastSourceLocation() : element->lastSourceLocation(); } + { + return lastListElement(this)->element->lastSourceLocation(); + } FormalParameterList *finish(MemoryPool *pool); @@ -2447,7 +2479,7 @@ public: : name(n), heritage(heritage), elements(elements) { kind = K; } - void accept0(Visitor *visitor) override; + void accept0(BaseVisitor *visitor) override; SourceLocation firstSourceLocation() const override { return classToken; } @@ -2476,7 +2508,7 @@ public: : ClassExpression(n, heritage, elements) { kind = K; } - void accept0(Visitor *visitor) override; + void accept0(BaseVisitor *visitor) override; }; @@ -2498,7 +2530,7 @@ public: return n; } - void accept0(Visitor *visitor) override; + void accept0(BaseVisitor *visitor) override; SourceLocation firstSourceLocation() const override { return property->firstSourceLocation(); } @@ -2526,7 +2558,7 @@ public: : statements(statements) { kind = K; } - void accept0(Visitor *visitor) override; + void accept0(BaseVisitor *visitor) override; SourceLocation firstSourceLocation() const override { return statements ? statements->firstSourceLocation() : SourceLocation(); } @@ -2555,7 +2587,7 @@ public: kind = K; } - void accept0(Visitor *visitor) override; + void accept0(BaseVisitor *visitor) override; SourceLocation firstSourceLocation() const override { return identifier.isNull() ? importedBindingToken : identifierToken; } @@ -2600,13 +2632,15 @@ public: return head; } - void accept0(Visitor *visitor) override; + void accept0(BaseVisitor *visitor) override; SourceLocation firstSourceLocation() const override { return importSpecifierToken; } SourceLocation lastSourceLocation() const override - { return next ? next->lastSourceLocation() : importSpecifierToken; } + { + return lastListElement(this)->importSpecifierToken; + } // attributes SourceLocation importSpecifierToken; @@ -2630,7 +2664,7 @@ public: kind = K; } - void accept0(Visitor *visitor) override; + void accept0(BaseVisitor *visitor) override; SourceLocation firstSourceLocation() const override { return leftBraceToken; } @@ -2654,7 +2688,7 @@ public: kind = K; } - void accept0(Visitor *visitor) override; + void accept0(BaseVisitor *visitor) override; virtual SourceLocation firstSourceLocation() const override { return starToken; } @@ -2704,7 +2738,7 @@ public: kind = K; } - void accept0(Visitor *visitor) override; + void accept0(BaseVisitor *visitor) override; virtual SourceLocation firstSourceLocation() const override { return importedDefaultBinding.isNull() ? (nameSpaceImport ? nameSpaceImport->firstSourceLocation() : namedImports->firstSourceLocation()) : importedDefaultBindingToken; } @@ -2729,7 +2763,7 @@ public: kind = K; } - void accept0(Visitor *visitor) override; + void accept0(BaseVisitor *visitor) override; SourceLocation firstSourceLocation() const override { return fromToken; } @@ -2760,7 +2794,7 @@ public: kind = K; } - void accept0(Visitor *visitor) override; + void accept0(BaseVisitor *visitor) override; SourceLocation firstSourceLocation() const override { return importToken; } @@ -2793,7 +2827,7 @@ public: kind = K; } - void accept0(Visitor *visitor) override; + void accept0(BaseVisitor *visitor) override; SourceLocation firstSourceLocation() const override { return identifierToken; } @@ -2838,12 +2872,12 @@ public: return head; } - void accept0(Visitor *visitor) override; + void accept0(BaseVisitor *visitor) override; SourceLocation firstSourceLocation() const override { return exportSpecifier->firstSourceLocation(); } SourceLocation lastSourceLocation() const override - { return next ? next->lastSourceLocation() : exportSpecifier->lastSourceLocation(); } + { return lastListElement(this)->exportSpecifier->lastSourceLocation(); } // attributes ExportSpecifier *exportSpecifier; @@ -2866,7 +2900,7 @@ public: kind = K; } - void accept0(Visitor *visitor) override; + void accept0(BaseVisitor *visitor) override; SourceLocation firstSourceLocation() const override { return leftBraceToken; } @@ -2910,7 +2944,7 @@ public: kind = K; } - void accept0(Visitor *visitor) override; + void accept0(BaseVisitor *visitor) override; SourceLocation firstSourceLocation() const override { return exportToken; } @@ -2937,7 +2971,7 @@ public: kind = K; } - void accept0(Visitor *visitor) override; + void accept0(BaseVisitor *visitor) override; SourceLocation firstSourceLocation() const override { return body ? body->firstSourceLocation() : SourceLocation(); } @@ -2957,7 +2991,7 @@ public: DebuggerStatement() { kind = K; } - void accept0(Visitor *visitor) override; + void accept0(BaseVisitor *visitor) override; SourceLocation firstSourceLocation() const override { return debuggerToken; } @@ -2983,7 +3017,7 @@ public: : importUri(uri) { kind = K; } - void accept0(Visitor *visitor) override; + void accept0(BaseVisitor *visitor) override; SourceLocation firstSourceLocation() const override { return importToken; } @@ -2997,7 +3031,6 @@ public: QStringRef importId; SourceLocation importToken; SourceLocation fileNameToken; - SourceLocation versionToken; SourceLocation asToken; SourceLocation importIdToken; SourceLocation semicolonToken; @@ -3011,6 +3044,9 @@ public: SourceLocation lastSourceLocation() const override = 0; UiObjectMember *uiObjectMemberCast() override; + +// attributes + UiAnnotationList *annotations = nullptr; }; class QML_PARSER_EXPORT UiObjectMemberList: public Node @@ -3030,13 +3066,13 @@ public: previous->next = this; } - void accept0(Visitor *visitor) override; + void accept0(BaseVisitor *visitor) override; SourceLocation firstSourceLocation() const override { return member->firstSourceLocation(); } SourceLocation lastSourceLocation() const override - { return next ? next->lastSourceLocation() : member->lastSourceLocation(); } + { return lastListElement(this)->member->lastSourceLocation(); } UiObjectMemberList *finish() { @@ -3059,7 +3095,7 @@ public: : name(name) { kind = K; } - void accept0(Visitor *visitor) override; + void accept0(BaseVisitor *visitor) override; SourceLocation firstSourceLocation() const override { return pragmaToken; } @@ -3073,6 +3109,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(BaseVisitor *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: @@ -3109,13 +3167,13 @@ public: return head; } - void accept0(Visitor *visitor) override; + void accept0(BaseVisitor *visitor) override; SourceLocation firstSourceLocation() const override { return headerItem->firstSourceLocation(); } SourceLocation lastSourceLocation() const override - { return next ? next->lastSourceLocation() : headerItem->lastSourceLocation(); } + { return lastListElement(this)->headerItem->lastSourceLocation(); } // attributes Node *headerItem; @@ -3131,7 +3189,7 @@ public: : headers(headers), members(members) { kind = K; } - void accept0(Visitor *visitor) override; + void accept0(BaseVisitor *visitor) override; SourceLocation firstSourceLocation() const override { @@ -3173,13 +3231,13 @@ public: previous->next = this; } - void accept0(Visitor *visitor) override; + void accept0(BaseVisitor *visitor) override; SourceLocation firstSourceLocation() const override { return member->firstSourceLocation(); } SourceLocation lastSourceLocation() const override - { return next ? next->lastSourceLocation() : member->lastSourceLocation(); } + { return lastListElement(this)->member->lastSourceLocation(); } UiArrayMemberList *finish() { @@ -3203,7 +3261,7 @@ public: : members(members) { kind = K; } - void accept0(Visitor *visitor) override; + void accept0(BaseVisitor *visitor) override; SourceLocation firstSourceLocation() const override { return lbraceToken; } @@ -3234,13 +3292,16 @@ public: previous->next = this; } - void accept0(Visitor *) override; + void accept0(BaseVisitor *) override; SourceLocation firstSourceLocation() const override { return colonToken.isValid() ? identifierToken : propertyTypeToken; } SourceLocation lastSourceLocation() const override - { return next ? next->lastSourceLocation() : (colonToken.isValid() ? propertyTypeToken : identifierToken); } + { + auto last = lastListElement(this); + return (last->colonToken.isValid() ? last->propertyTypeToken : last->identifierToken); + } inline UiParameterList *finish () { @@ -3275,7 +3336,7 @@ public: : type(Property), memberType(memberType), name(name), statement(statement), binding(nullptr), isDefaultMember(false), isReadonlyMember(false), parameters(nullptr) { kind = K; } - void accept0(Visitor *visitor) override; + void accept0(BaseVisitor *visitor) override; SourceLocation firstSourceLocation() const override { @@ -3283,6 +3344,8 @@ public: return defaultToken; else if (readonlyToken.isValid()) return readonlyToken; + else if (requiredToken.isValid()) + return requiredToken; return propertyToken; } @@ -3306,10 +3369,13 @@ public: UiObjectMember *binding; // initialized with a QML object or array. bool isDefaultMember; bool isReadonlyMember; + bool isRequired = false; UiParameterList *parameters; + // TODO: merge source locations SourceLocation defaultToken; SourceLocation readonlyToken; SourceLocation propertyToken; + SourceLocation requiredToken; SourceLocation typeModifierToken; SourceLocation typeToken; SourceLocation identifierToken; @@ -3327,7 +3393,7 @@ public: : qualifiedTypeNameId(qualifiedTypeNameId), initializer(initializer) { kind = K; } - void accept0(Visitor *visitor) override; + void accept0(BaseVisitor *visitor) override; SourceLocation firstSourceLocation() const override { return qualifiedTypeNameId->identifierToken; } @@ -3340,6 +3406,29 @@ public: UiObjectInitializer *initializer; }; +class QML_PARSER_EXPORT UiInlineComponent: public UiObjectMember +{ +public: + QQMLJS_DECLARE_AST_NODE(UiInlineComponent) + + UiInlineComponent(const QStringRef& inlineComponentName, UiObjectDefinition* inlineComponent) + : name(inlineComponentName), component(inlineComponent) + { kind = K; } + + SourceLocation lastSourceLocation() const override + {return component->lastSourceLocation();} + + SourceLocation firstSourceLocation() const override + {return componentToken;} + + void accept0(BaseVisitor *visitor) override; + + // attributes + QStringRef name; + UiObjectDefinition* component; + SourceLocation componentToken; +}; + class QML_PARSER_EXPORT UiSourceElement: public UiObjectMember { public: @@ -3369,7 +3458,7 @@ public: return SourceLocation(); } - void accept0(Visitor *visitor) override; + void accept0(BaseVisitor *visitor) override; // attributes @@ -3401,7 +3490,7 @@ public: SourceLocation lastSourceLocation() const override { return initializer->rbraceToken; } - void accept0(Visitor *visitor) override; + void accept0(BaseVisitor *visitor) override; // attributes @@ -3429,7 +3518,7 @@ public: SourceLocation lastSourceLocation() const override { return statement->lastSourceLocation(); } - void accept0(Visitor *visitor) override; + void accept0(BaseVisitor *visitor) override; // attributes UiQualifiedId *qualifiedId; @@ -3454,7 +3543,7 @@ public: SourceLocation lastSourceLocation() const override { return rbracketToken; } - void accept0(Visitor *visitor) override; + void accept0(BaseVisitor *visitor) override; // attributes UiQualifiedId *qualifiedId; @@ -3493,10 +3582,12 @@ public: { return memberToken; } SourceLocation lastSourceLocation() const override - { return next ? next->lastSourceLocation() : - valueToken.isValid() ? valueToken : memberToken; } + { + auto last = lastListElement(this); + return last->valueToken.isValid() ? last->valueToken : last->memberToken; + } - void accept0(Visitor *visitor) override; + void accept0(BaseVisitor *visitor) override; UiEnumMemberList *finish() { @@ -3530,7 +3621,7 @@ public: SourceLocation lastSourceLocation() const override { return rbraceToken; } - void accept0(Visitor *visitor) override; + void accept0(BaseVisitor *visitor) override; // attributes SourceLocation enumToken; @@ -3539,8 +3630,67 @@ public: UiEnumMemberList *members; }; -} } // namespace AST +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(UiAnnotation *annotation) + : next(this), annotation(annotation) + { kind = K; } + + UiAnnotationList(UiAnnotationList *previous, UiAnnotation *annotation) + : annotation(annotation) + { + kind = K; + next = previous->next; + previous->next = this; + } + + void accept0(BaseVisitor *visitor) override; + + SourceLocation firstSourceLocation() const override + { return annotation->firstSourceLocation(); } + + SourceLocation lastSourceLocation() const override + { return lastListElement(this)->annotation->lastSourceLocation(); } + + UiAnnotationList *finish() + { + UiAnnotationList *head = next; + next = nullptr; + return head; + } + +// attributes + UiAnnotationList *next; + UiAnnotation *annotation; +}; +} } // namespace AST QT_END_NAMESPACE diff --git a/src/qml/parser/qqmljsastfwd_p.h b/src/qml/parser/qqmljsastfwd_p.h index 05226fd043..ef37e8072f 100644 --- a/src/qml/parser/qqmljsastfwd_p.h +++ b/src/qml/parser/qqmljsastfwd_p.h @@ -41,7 +41,7 @@ #define QQMLJSAST_FWD_P_H #include "qqmljsglobal_p.h" -#include "qqmljssourcelocation_p.h" +#include <private/qqmljssourcelocation_p.h> #include <QtCore/qglobal.h> @@ -60,6 +60,7 @@ QT_BEGIN_NAMESPACE namespace QQmlJS { namespace AST { +class BaseVisitor; class Visitor; class Node; class ExpressionNode; @@ -151,7 +152,6 @@ class NamedImport; class ImportClause; class FromClause; class ImportDeclaration; -class ModuleItem; class ESModule; class DebuggerStatement; class NestedExpression; @@ -169,6 +169,7 @@ class UiImport; class UiPublicMember; class UiParameterList; class UiObjectDefinition; +class UiInlineComponent; class UiObjectInitializer; class UiObjectBinding; class UiScriptBinding; @@ -182,6 +183,9 @@ class UiHeaderItemList; class UiEnumDeclaration; class UiEnumMemberList; class UiVersionSpecifier; +class UiRequired; +class UiAnnotation; +class UiAnnotationList; } // namespace AST } // namespace QQmlJS diff --git a/src/qml/parser/qqmljsastvisitor.cpp b/src/qml/parser/qqmljsastvisitor.cpp index 5ecac36423..7388eccebb 100644 --- a/src/qml/parser/qqmljsastvisitor.cpp +++ b/src/qml/parser/qqmljsastvisitor.cpp @@ -43,11 +43,13 @@ QT_BEGIN_NAMESPACE namespace QQmlJS { namespace AST { -Visitor::Visitor(quint16 parentRecursionDepth) : m_recursionDepth(parentRecursionDepth) +Visitor::Visitor(quint16 parentRecursionDepth) : BaseVisitor(parentRecursionDepth) { } -Visitor::~Visitor() +BaseVisitor::BaseVisitor(quint16 parentRecursionDepth) : m_recursionDepth(parentRecursionDepth) {} + +BaseVisitor::~BaseVisitor() { } diff --git a/src/qml/parser/qqmljsastvisitor_p.h b/src/qml/parser/qqmljsastvisitor_p.h index 7146cd00ac..8fbdb97ee2 100644 --- a/src/qml/parser/qqmljsastvisitor_p.h +++ b/src/qml/parser/qqmljsastvisitor_p.h @@ -58,7 +58,7 @@ QT_BEGIN_NAMESPACE namespace QQmlJS { namespace AST { -class QML_PARSER_EXPORT Visitor +class QML_PARSER_EXPORT BaseVisitor { public: class RecursionDepthCheck @@ -68,7 +68,7 @@ public: RecursionDepthCheck(RecursionDepthCheck &&) = delete; RecursionDepthCheck &operator=(RecursionDepthCheck &&) = delete; - RecursionDepthCheck(Visitor *visitor) : m_visitor(visitor) + RecursionDepthCheck(BaseVisitor *visitor) : m_visitor(visitor) { ++(m_visitor->m_recursionDepth); } @@ -84,333 +84,338 @@ public: private: static const quint16 s_recursionLimit = 4096; - Visitor *m_visitor; + BaseVisitor *m_visitor; }; - Visitor(quint16 parentRecursionDepth = 0); - virtual ~Visitor(); + BaseVisitor(quint16 parentRecursionDepth = 0); + virtual ~BaseVisitor(); - virtual bool preVisit(Node *) { return true; } - virtual void postVisit(Node *) {} + virtual bool preVisit(Node *) = 0; + virtual void postVisit(Node *) = 0; // Ui - virtual bool visit(UiProgram *) { return true; } - virtual bool visit(UiHeaderItemList *) { return true; } - virtual bool visit(UiPragma *) { return true; } - virtual bool visit(UiImport *) { return true; } - virtual bool visit(UiPublicMember *) { return true; } - virtual bool visit(UiSourceElement *) { return true; } - virtual bool visit(UiObjectDefinition *) { return true; } - virtual bool visit(UiObjectInitializer *) { return true; } - virtual bool visit(UiObjectBinding *) { return true; } - virtual bool visit(UiScriptBinding *) { return true; } - virtual bool visit(UiArrayBinding *) { return true; } - virtual bool visit(UiParameterList *) { return true; } - virtual bool visit(UiObjectMemberList *) { return true; } - virtual bool visit(UiArrayMemberList *) { return true; } - virtual bool visit(UiQualifiedId *) { return true; } - virtual bool visit(UiEnumDeclaration *) { return true; } - virtual bool visit(UiEnumMemberList *) { return true; } - virtual bool visit(UiVersionSpecifier *) { return true; } - - virtual void endVisit(UiProgram *) {} - virtual void endVisit(UiImport *) {} - virtual void endVisit(UiHeaderItemList *) {} - virtual void endVisit(UiPragma *) {} - virtual void endVisit(UiPublicMember *) {} - virtual void endVisit(UiSourceElement *) {} - virtual void endVisit(UiObjectDefinition *) {} - virtual void endVisit(UiObjectInitializer *) {} - virtual void endVisit(UiObjectBinding *) {} - virtual void endVisit(UiScriptBinding *) {} - virtual void endVisit(UiArrayBinding *) {} - virtual void endVisit(UiParameterList *) {} - virtual void endVisit(UiObjectMemberList *) {} - virtual void endVisit(UiArrayMemberList *) {} - virtual void endVisit(UiQualifiedId *) {} - virtual void endVisit(UiEnumDeclaration *) {} - virtual void endVisit(UiEnumMemberList *) { } - virtual void endVisit(UiVersionSpecifier *) {} + virtual bool visit(UiProgram *) = 0; + virtual bool visit(UiHeaderItemList *) = 0; + virtual bool visit(UiPragma *) = 0; + virtual bool visit(UiImport *) = 0; + virtual bool visit(UiPublicMember *) = 0; + virtual bool visit(UiSourceElement *) = 0; + virtual bool visit(UiObjectDefinition *) = 0; + virtual bool visit(UiObjectInitializer *) = 0; + virtual bool visit(UiObjectBinding *) = 0; + virtual bool visit(UiScriptBinding *) = 0; + virtual bool visit(UiArrayBinding *) = 0; + virtual bool visit(UiParameterList *) = 0; + virtual bool visit(UiObjectMemberList *) = 0; + virtual bool visit(UiArrayMemberList *) = 0; + virtual bool visit(UiQualifiedId *) = 0; + virtual bool visit(UiEnumDeclaration *) = 0; + 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; + + virtual void endVisit(UiProgram *) = 0; + virtual void endVisit(UiImport *) = 0; + virtual void endVisit(UiHeaderItemList *) = 0; + virtual void endVisit(UiPragma *) = 0; + virtual void endVisit(UiPublicMember *) = 0; + virtual void endVisit(UiSourceElement *) = 0; + virtual void endVisit(UiObjectDefinition *) = 0; + virtual void endVisit(UiObjectInitializer *) = 0; + virtual void endVisit(UiObjectBinding *) = 0; + virtual void endVisit(UiScriptBinding *) = 0; + virtual void endVisit(UiArrayBinding *) = 0; + virtual void endVisit(UiParameterList *) = 0; + virtual void endVisit(UiObjectMemberList *) = 0; + virtual void endVisit(UiArrayMemberList *) = 0; + virtual void endVisit(UiQualifiedId *) = 0; + virtual void endVisit(UiEnumDeclaration *) = 0; + 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; // QQmlJS - virtual bool visit(ThisExpression *) { return true; } - virtual void endVisit(ThisExpression *) {} - - virtual bool visit(IdentifierExpression *) { return true; } - virtual void endVisit(IdentifierExpression *) {} + virtual bool visit(ThisExpression *) = 0; + virtual void endVisit(ThisExpression *) = 0; - virtual bool visit(NullExpression *) { return true; } - virtual void endVisit(NullExpression *) {} + virtual bool visit(IdentifierExpression *) = 0; + virtual void endVisit(IdentifierExpression *) = 0; - virtual bool visit(TrueLiteral *) { return true; } - virtual void endVisit(TrueLiteral *) {} + virtual bool visit(NullExpression *) = 0; + virtual void endVisit(NullExpression *) = 0; - virtual bool visit(FalseLiteral *) { return true; } - virtual void endVisit(FalseLiteral *) {} + virtual bool visit(TrueLiteral *) = 0; + virtual void endVisit(TrueLiteral *) = 0; - virtual bool visit(SuperLiteral *) { return true; } - virtual void endVisit(SuperLiteral *) {} + virtual bool visit(FalseLiteral *) = 0; + virtual void endVisit(FalseLiteral *) = 0; - virtual bool visit(StringLiteral *) { return true; } - virtual void endVisit(StringLiteral *) {} + virtual bool visit(SuperLiteral *) = 0; + virtual void endVisit(SuperLiteral *) = 0; - virtual bool visit(TemplateLiteral *) { return true; } - virtual void endVisit(TemplateLiteral *) {} + virtual bool visit(StringLiteral *) = 0; + virtual void endVisit(StringLiteral *) = 0; - virtual bool visit(NumericLiteral *) { return true; } - virtual void endVisit(NumericLiteral *) {} + virtual bool visit(TemplateLiteral *) = 0; + virtual void endVisit(TemplateLiteral *) = 0; - virtual bool visit(RegExpLiteral *) { return true; } - virtual void endVisit(RegExpLiteral *) {} + virtual bool visit(NumericLiteral *) = 0; + virtual void endVisit(NumericLiteral *) = 0; - virtual bool visit(ArrayPattern *) { return true; } - virtual void endVisit(ArrayPattern *) {} + virtual bool visit(RegExpLiteral *) = 0; + virtual void endVisit(RegExpLiteral *) = 0; - virtual bool visit(ObjectPattern *) { return true; } - virtual void endVisit(ObjectPattern *) {} + virtual bool visit(ArrayPattern *) = 0; + virtual void endVisit(ArrayPattern *) = 0; - virtual bool visit(PatternElementList *) { return true; } - virtual void endVisit(PatternElementList *) {} + virtual bool visit(ObjectPattern *) = 0; + virtual void endVisit(ObjectPattern *) = 0; - virtual bool visit(PatternPropertyList *) { return true; } - virtual void endVisit(PatternPropertyList *) {} + virtual bool visit(PatternElementList *) = 0; + virtual void endVisit(PatternElementList *) = 0; - virtual bool visit(PatternElement *) { return true; } - virtual void endVisit(PatternElement *) {} + virtual bool visit(PatternPropertyList *) = 0; + virtual void endVisit(PatternPropertyList *) = 0; - virtual bool visit(PatternProperty *) { return true; } - virtual void endVisit(PatternProperty *) {} + virtual bool visit(PatternElement *) = 0; + virtual void endVisit(PatternElement *) = 0; - virtual bool visit(Elision *) { return true; } - virtual void endVisit(Elision *) {} + virtual bool visit(PatternProperty *) = 0; + virtual void endVisit(PatternProperty *) = 0; - virtual bool visit(NestedExpression *) { return true; } - virtual void endVisit(NestedExpression *) {} + virtual bool visit(Elision *) = 0; + virtual void endVisit(Elision *) = 0; - virtual bool visit(IdentifierPropertyName *) { return true; } - virtual void endVisit(IdentifierPropertyName *) {} + virtual bool visit(NestedExpression *) = 0; + virtual void endVisit(NestedExpression *) = 0; - virtual bool visit(StringLiteralPropertyName *) { return true; } - virtual void endVisit(StringLiteralPropertyName *) {} + virtual bool visit(IdentifierPropertyName *) = 0; + virtual void endVisit(IdentifierPropertyName *) = 0; - virtual bool visit(NumericLiteralPropertyName *) { return true; } - virtual void endVisit(NumericLiteralPropertyName *) {} + virtual bool visit(StringLiteralPropertyName *) = 0; + virtual void endVisit(StringLiteralPropertyName *) = 0; - virtual bool visit(ComputedPropertyName *) { return true; } - virtual void endVisit(ComputedPropertyName *) {} + virtual bool visit(NumericLiteralPropertyName *) = 0; + virtual void endVisit(NumericLiteralPropertyName *) = 0; - virtual bool visit(ArrayMemberExpression *) { return true; } - virtual void endVisit(ArrayMemberExpression *) {} + virtual bool visit(ComputedPropertyName *) = 0; + virtual void endVisit(ComputedPropertyName *) = 0; - virtual bool visit(FieldMemberExpression *) { return true; } - virtual void endVisit(FieldMemberExpression *) {} + virtual bool visit(ArrayMemberExpression *) = 0; + virtual void endVisit(ArrayMemberExpression *) = 0; - virtual bool visit(TaggedTemplate *) { return true; } - virtual void endVisit(TaggedTemplate *) {} + virtual bool visit(FieldMemberExpression *) = 0; + virtual void endVisit(FieldMemberExpression *) = 0; - virtual bool visit(NewMemberExpression *) { return true; } - virtual void endVisit(NewMemberExpression *) {} + virtual bool visit(TaggedTemplate *) = 0; + virtual void endVisit(TaggedTemplate *) = 0; - virtual bool visit(NewExpression *) { return true; } - virtual void endVisit(NewExpression *) {} + virtual bool visit(NewMemberExpression *) = 0; + virtual void endVisit(NewMemberExpression *) = 0; - virtual bool visit(CallExpression *) { return true; } - virtual void endVisit(CallExpression *) {} + virtual bool visit(NewExpression *) = 0; + virtual void endVisit(NewExpression *) = 0; - virtual bool visit(ArgumentList *) { return true; } - virtual void endVisit(ArgumentList *) {} + virtual bool visit(CallExpression *) = 0; + virtual void endVisit(CallExpression *) = 0; - virtual bool visit(PostIncrementExpression *) { return true; } - virtual void endVisit(PostIncrementExpression *) {} + virtual bool visit(ArgumentList *) = 0; + virtual void endVisit(ArgumentList *) = 0; - virtual bool visit(PostDecrementExpression *) { return true; } - virtual void endVisit(PostDecrementExpression *) {} + virtual bool visit(PostIncrementExpression *) = 0; + virtual void endVisit(PostIncrementExpression *) = 0; - virtual bool visit(DeleteExpression *) { return true; } - virtual void endVisit(DeleteExpression *) {} + virtual bool visit(PostDecrementExpression *) = 0; + virtual void endVisit(PostDecrementExpression *) = 0; - virtual bool visit(VoidExpression *) { return true; } - virtual void endVisit(VoidExpression *) {} + virtual bool visit(DeleteExpression *) = 0; + virtual void endVisit(DeleteExpression *) = 0; - virtual bool visit(TypeOfExpression *) { return true; } - virtual void endVisit(TypeOfExpression *) {} + virtual bool visit(VoidExpression *) = 0; + virtual void endVisit(VoidExpression *) = 0; - virtual bool visit(PreIncrementExpression *) { return true; } - virtual void endVisit(PreIncrementExpression *) {} + virtual bool visit(TypeOfExpression *) = 0; + virtual void endVisit(TypeOfExpression *) = 0; - virtual bool visit(PreDecrementExpression *) { return true; } - virtual void endVisit(PreDecrementExpression *) {} + virtual bool visit(PreIncrementExpression *) = 0; + virtual void endVisit(PreIncrementExpression *) = 0; - virtual bool visit(UnaryPlusExpression *) { return true; } - virtual void endVisit(UnaryPlusExpression *) {} + virtual bool visit(PreDecrementExpression *) = 0; + virtual void endVisit(PreDecrementExpression *) = 0; - virtual bool visit(UnaryMinusExpression *) { return true; } - virtual void endVisit(UnaryMinusExpression *) {} + virtual bool visit(UnaryPlusExpression *) = 0; + virtual void endVisit(UnaryPlusExpression *) = 0; - virtual bool visit(TildeExpression *) { return true; } - virtual void endVisit(TildeExpression *) {} + virtual bool visit(UnaryMinusExpression *) = 0; + virtual void endVisit(UnaryMinusExpression *) = 0; - virtual bool visit(NotExpression *) { return true; } - virtual void endVisit(NotExpression *) {} + virtual bool visit(TildeExpression *) = 0; + virtual void endVisit(TildeExpression *) = 0; - virtual bool visit(BinaryExpression *) { return true; } - virtual void endVisit(BinaryExpression *) {} + virtual bool visit(NotExpression *) = 0; + virtual void endVisit(NotExpression *) = 0; - virtual bool visit(ConditionalExpression *) { return true; } - virtual void endVisit(ConditionalExpression *) {} + virtual bool visit(BinaryExpression *) = 0; + virtual void endVisit(BinaryExpression *) = 0; - virtual bool visit(Expression *) { return true; } - virtual void endVisit(Expression *) {} + virtual bool visit(ConditionalExpression *) = 0; + virtual void endVisit(ConditionalExpression *) = 0; - virtual bool visit(Block *) { return true; } - virtual void endVisit(Block *) {} + virtual bool visit(Expression *) = 0; + virtual void endVisit(Expression *) = 0; - virtual bool visit(StatementList *) { return true; } - virtual void endVisit(StatementList *) {} + virtual bool visit(Block *) = 0; + virtual void endVisit(Block *) = 0; - virtual bool visit(VariableStatement *) { return true; } - virtual void endVisit(VariableStatement *) {} + virtual bool visit(StatementList *) = 0; + virtual void endVisit(StatementList *) = 0; - virtual bool visit(VariableDeclarationList *) { return true; } - virtual void endVisit(VariableDeclarationList *) {} + virtual bool visit(VariableStatement *) = 0; + virtual void endVisit(VariableStatement *) = 0; - virtual bool visit(EmptyStatement *) { return true; } - virtual void endVisit(EmptyStatement *) {} + virtual bool visit(VariableDeclarationList *) = 0; + virtual void endVisit(VariableDeclarationList *) = 0; - virtual bool visit(ExpressionStatement *) { return true; } - virtual void endVisit(ExpressionStatement *) {} + virtual bool visit(EmptyStatement *) = 0; + virtual void endVisit(EmptyStatement *) = 0; - virtual bool visit(IfStatement *) { return true; } - virtual void endVisit(IfStatement *) {} + virtual bool visit(ExpressionStatement *) = 0; + virtual void endVisit(ExpressionStatement *) = 0; - virtual bool visit(DoWhileStatement *) { return true; } - virtual void endVisit(DoWhileStatement *) {} + virtual bool visit(IfStatement *) = 0; + virtual void endVisit(IfStatement *) = 0; - virtual bool visit(WhileStatement *) { return true; } - virtual void endVisit(WhileStatement *) {} + virtual bool visit(DoWhileStatement *) = 0; + virtual void endVisit(DoWhileStatement *) = 0; - virtual bool visit(ForStatement *) { return true; } - virtual void endVisit(ForStatement *) {} + virtual bool visit(WhileStatement *) = 0; + virtual void endVisit(WhileStatement *) = 0; - virtual bool visit(ForEachStatement *) { return true; } - virtual void endVisit(ForEachStatement *) {} + virtual bool visit(ForStatement *) = 0; + virtual void endVisit(ForStatement *) = 0; - virtual bool visit(ContinueStatement *) { return true; } - virtual void endVisit(ContinueStatement *) {} + virtual bool visit(ForEachStatement *) = 0; + virtual void endVisit(ForEachStatement *) = 0; - virtual bool visit(BreakStatement *) { return true; } - virtual void endVisit(BreakStatement *) {} + virtual bool visit(ContinueStatement *) = 0; + virtual void endVisit(ContinueStatement *) = 0; - virtual bool visit(ReturnStatement *) { return true; } - virtual void endVisit(ReturnStatement *) {} + virtual bool visit(BreakStatement *) = 0; + virtual void endVisit(BreakStatement *) = 0; - virtual bool visit(YieldExpression *) { return true; } - virtual void endVisit(YieldExpression *) {} + virtual bool visit(ReturnStatement *) = 0; + virtual void endVisit(ReturnStatement *) = 0; - virtual bool visit(WithStatement *) { return true; } - virtual void endVisit(WithStatement *) {} + virtual bool visit(YieldExpression *) = 0; + virtual void endVisit(YieldExpression *) = 0; - virtual bool visit(SwitchStatement *) { return true; } - virtual void endVisit(SwitchStatement *) {} + virtual bool visit(WithStatement *) = 0; + virtual void endVisit(WithStatement *) = 0; - virtual bool visit(CaseBlock *) { return true; } - virtual void endVisit(CaseBlock *) {} + virtual bool visit(SwitchStatement *) = 0; + virtual void endVisit(SwitchStatement *) = 0; - virtual bool visit(CaseClauses *) { return true; } - virtual void endVisit(CaseClauses *) {} + virtual bool visit(CaseBlock *) = 0; + virtual void endVisit(CaseBlock *) = 0; - virtual bool visit(CaseClause *) { return true; } - virtual void endVisit(CaseClause *) {} + virtual bool visit(CaseClauses *) = 0; + virtual void endVisit(CaseClauses *) = 0; - virtual bool visit(DefaultClause *) { return true; } - virtual void endVisit(DefaultClause *) {} + virtual bool visit(CaseClause *) = 0; + virtual void endVisit(CaseClause *) = 0; - virtual bool visit(LabelledStatement *) { return true; } - virtual void endVisit(LabelledStatement *) {} + virtual bool visit(DefaultClause *) = 0; + virtual void endVisit(DefaultClause *) = 0; - virtual bool visit(ThrowStatement *) { return true; } - virtual void endVisit(ThrowStatement *) {} + virtual bool visit(LabelledStatement *) = 0; + virtual void endVisit(LabelledStatement *) = 0; - virtual bool visit(TryStatement *) { return true; } - virtual void endVisit(TryStatement *) {} + virtual bool visit(ThrowStatement *) = 0; + virtual void endVisit(ThrowStatement *) = 0; - virtual bool visit(Catch *) { return true; } - virtual void endVisit(Catch *) {} + virtual bool visit(TryStatement *) = 0; + virtual void endVisit(TryStatement *) = 0; - virtual bool visit(Finally *) { return true; } - virtual void endVisit(Finally *) {} + virtual bool visit(Catch *) = 0; + virtual void endVisit(Catch *) = 0; - virtual bool visit(FunctionDeclaration *) { return true; } - virtual void endVisit(FunctionDeclaration *) {} + virtual bool visit(Finally *) = 0; + virtual void endVisit(Finally *) = 0; - virtual bool visit(FunctionExpression *) { return true; } - virtual void endVisit(FunctionExpression *) {} + virtual bool visit(FunctionDeclaration *) = 0; + virtual void endVisit(FunctionDeclaration *) = 0; - virtual bool visit(FormalParameterList *) { return true; } - virtual void endVisit(FormalParameterList *) {} + virtual bool visit(FunctionExpression *) = 0; + virtual void endVisit(FunctionExpression *) = 0; - virtual bool visit(ClassExpression *) { return true; } - virtual void endVisit(ClassExpression *) {} + virtual bool visit(FormalParameterList *) = 0; + virtual void endVisit(FormalParameterList *) = 0; - virtual bool visit(ClassDeclaration *) { return true; } - virtual void endVisit(ClassDeclaration *) {} + virtual bool visit(ClassExpression *) = 0; + virtual void endVisit(ClassExpression *) = 0; - virtual bool visit(ClassElementList *) { return true; } - virtual void endVisit(ClassElementList *) {} + virtual bool visit(ClassDeclaration *) = 0; + virtual void endVisit(ClassDeclaration *) = 0; - virtual bool visit(Program *) { return true; } - virtual void endVisit(Program *) {} + virtual bool visit(ClassElementList *) = 0; + virtual void endVisit(ClassElementList *) = 0; - virtual bool visit(NameSpaceImport *) { return true; } - virtual void endVisit(NameSpaceImport *) {} + virtual bool visit(Program *) = 0; + virtual void endVisit(Program *) = 0; - virtual bool visit(ImportSpecifier *) { return true; } - virtual void endVisit(ImportSpecifier *) {} + virtual bool visit(NameSpaceImport *) = 0; + virtual void endVisit(NameSpaceImport *) = 0; - virtual bool visit(ImportsList *) { return true; } - virtual void endVisit(ImportsList *) {} + virtual bool visit(ImportSpecifier *) = 0; + virtual void endVisit(ImportSpecifier *) = 0; - virtual bool visit(NamedImports *) { return true; } - virtual void endVisit(NamedImports *) {} + virtual bool visit(ImportsList *) = 0; + virtual void endVisit(ImportsList *) = 0; - virtual bool visit(FromClause *) { return true; } - virtual void endVisit(FromClause *) {} + virtual bool visit(NamedImports *) = 0; + virtual void endVisit(NamedImports *) = 0; - virtual bool visit(ImportClause *) { return true; } - virtual void endVisit(ImportClause *) {} + virtual bool visit(FromClause *) = 0; + virtual void endVisit(FromClause *) = 0; - virtual bool visit(ImportDeclaration *) { return true; } - virtual void endVisit(ImportDeclaration *) {} + virtual bool visit(ImportClause *) = 0; + virtual void endVisit(ImportClause *) = 0; - virtual bool visit(ExportSpecifier *) { return true; } - virtual void endVisit(ExportSpecifier *) {} + virtual bool visit(ImportDeclaration *) = 0; + virtual void endVisit(ImportDeclaration *) = 0; - virtual bool visit(ExportsList *) { return true; } - virtual void endVisit(ExportsList *) {} + virtual bool visit(ExportSpecifier *) = 0; + virtual void endVisit(ExportSpecifier *) = 0; - virtual bool visit(ExportClause *) { return true; } - virtual void endVisit(ExportClause *) {} + virtual bool visit(ExportsList *) = 0; + virtual void endVisit(ExportsList *) = 0; - virtual bool visit(ExportDeclaration *) { return true; } - virtual void endVisit(ExportDeclaration *) {} + virtual bool visit(ExportClause *) = 0; + virtual void endVisit(ExportClause *) = 0; - virtual bool visit(ModuleItem *) { return true; } - virtual void endVisit(ModuleItem *) {} + virtual bool visit(ExportDeclaration *) = 0; + virtual void endVisit(ExportDeclaration *) = 0; - virtual bool visit(ESModule *) { return true; } - virtual void endVisit(ESModule *) {} + virtual bool visit(ESModule *) = 0; + virtual void endVisit(ESModule *) = 0; - virtual bool visit(DebuggerStatement *) { return true; } - virtual void endVisit(DebuggerStatement *) {} + virtual bool visit(DebuggerStatement *) = 0; + virtual void endVisit(DebuggerStatement *) = 0; - virtual bool visit(Type *) { return true; } - virtual void endVisit(Type *) {} + virtual bool visit(Type *) = 0; + virtual void endVisit(Type *) = 0; - virtual bool visit(TypeArgumentList *) { return true; } - virtual void endVisit(TypeArgumentList *) {} + virtual bool visit(TypeArgumentList *) = 0; + virtual void endVisit(TypeArgumentList *) = 0; - virtual bool visit(TypeAnnotation *) { return true; } - virtual void endVisit(TypeAnnotation *) {} + virtual bool visit(TypeAnnotation *) = 0; + virtual void endVisit(TypeAnnotation *) = 0; virtual void throwRecursionDepthError() = 0; @@ -421,6 +426,339 @@ protected: friend class RecursionDepthCheck; }; +class QML_PARSER_EXPORT Visitor: public BaseVisitor +{ +public: + Visitor(quint16 parentRecursionDepth = 0); + + bool preVisit(Node *) override { return true; } + void postVisit(Node *) override {} + + // Ui + bool visit(UiProgram *) override { return true; } + bool visit(UiHeaderItemList *) override { return true; } + bool visit(UiPragma *) override { return true; } + bool visit(UiImport *) override { return true; } + bool visit(UiPublicMember *) override { return true; } + bool visit(UiSourceElement *) override { return true; } + bool visit(UiObjectDefinition *) override { return true; } + bool visit(UiObjectInitializer *) override { return true; } + bool visit(UiObjectBinding *) override { return true; } + bool visit(UiScriptBinding *) override { return true; } + bool visit(UiArrayBinding *) override { return true; } + bool visit(UiParameterList *) override { return true; } + bool visit(UiObjectMemberList *) override { return true; } + bool visit(UiArrayMemberList *) override { return true; } + bool visit(UiQualifiedId *) override { return true; } + bool visit(UiEnumDeclaration *) override { return true; } + 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; } + + void endVisit(UiProgram *) override {} + void endVisit(UiImport *) override {} + void endVisit(UiHeaderItemList *) override {} + void endVisit(UiPragma *) override {} + void endVisit(UiPublicMember *) override {} + void endVisit(UiSourceElement *) override {} + void endVisit(UiObjectDefinition *) override {} + void endVisit(UiObjectInitializer *) override {} + void endVisit(UiObjectBinding *) override {} + void endVisit(UiScriptBinding *) override {} + void endVisit(UiArrayBinding *) override {} + void endVisit(UiParameterList *) override {} + void endVisit(UiObjectMemberList *) override {} + void endVisit(UiArrayMemberList *) override {} + void endVisit(UiQualifiedId *) override {} + void endVisit(UiEnumDeclaration *) override {} + void endVisit(UiEnumMemberList *) override {} + void endVisit(UiVersionSpecifier *) override {} + void endVisit(UiInlineComponent *) override {} + void endVisit(UiAnnotation *) override {} + void endVisit(UiAnnotationList *) override {} + void endVisit(UiRequired *) override {} + + // QQmlJS + bool visit(ThisExpression *) override { return true; } + void endVisit(ThisExpression *) override {} + + bool visit(IdentifierExpression *) override { return true; } + void endVisit(IdentifierExpression *) override {} + + bool visit(NullExpression *) override { return true; } + void endVisit(NullExpression *) override {} + + bool visit(TrueLiteral *) override { return true; } + void endVisit(TrueLiteral *) override {} + + bool visit(FalseLiteral *) override { return true; } + void endVisit(FalseLiteral *) override {} + + bool visit(SuperLiteral *) override { return true; } + void endVisit(SuperLiteral *) override {} + + bool visit(StringLiteral *) override { return true; } + void endVisit(StringLiteral *) override {} + + bool visit(TemplateLiteral *) override { return true; } + void endVisit(TemplateLiteral *) override {} + + bool visit(NumericLiteral *) override { return true; } + void endVisit(NumericLiteral *) override {} + + bool visit(RegExpLiteral *) override { return true; } + void endVisit(RegExpLiteral *) override {} + + bool visit(ArrayPattern *) override { return true; } + void endVisit(ArrayPattern *) override {} + + bool visit(ObjectPattern *) override { return true; } + void endVisit(ObjectPattern *) override {} + + bool visit(PatternElementList *) override { return true; } + void endVisit(PatternElementList *) override {} + + bool visit(PatternPropertyList *) override { return true; } + void endVisit(PatternPropertyList *) override {} + + bool visit(PatternElement *) override { return true; } + void endVisit(PatternElement *) override {} + + bool visit(PatternProperty *) override { return true; } + void endVisit(PatternProperty *) override {} + + bool visit(Elision *) override { return true; } + void endVisit(Elision *) override {} + + bool visit(NestedExpression *) override { return true; } + void endVisit(NestedExpression *) override {} + + bool visit(IdentifierPropertyName *) override { return true; } + void endVisit(IdentifierPropertyName *) override {} + + bool visit(StringLiteralPropertyName *) override { return true; } + void endVisit(StringLiteralPropertyName *) override {} + + bool visit(NumericLiteralPropertyName *) override { return true; } + void endVisit(NumericLiteralPropertyName *) override {} + + bool visit(ComputedPropertyName *) override { return true; } + void endVisit(ComputedPropertyName *) override {} + + bool visit(ArrayMemberExpression *) override { return true; } + void endVisit(ArrayMemberExpression *) override {} + + bool visit(FieldMemberExpression *) override { return true; } + void endVisit(FieldMemberExpression *) override {} + + bool visit(TaggedTemplate *) override { return true; } + void endVisit(TaggedTemplate *) override {} + + bool visit(NewMemberExpression *) override { return true; } + void endVisit(NewMemberExpression *) override {} + + bool visit(NewExpression *) override { return true; } + void endVisit(NewExpression *) override {} + + bool visit(CallExpression *) override { return true; } + void endVisit(CallExpression *) override {} + + bool visit(ArgumentList *) override { return true; } + void endVisit(ArgumentList *) override {} + + bool visit(PostIncrementExpression *) override { return true; } + void endVisit(PostIncrementExpression *) override {} + + bool visit(PostDecrementExpression *) override { return true; } + void endVisit(PostDecrementExpression *) override {} + + bool visit(DeleteExpression *) override { return true; } + void endVisit(DeleteExpression *) override {} + + bool visit(VoidExpression *) override { return true; } + void endVisit(VoidExpression *) override {} + + bool visit(TypeOfExpression *) override { return true; } + void endVisit(TypeOfExpression *) override {} + + bool visit(PreIncrementExpression *) override { return true; } + void endVisit(PreIncrementExpression *) override {} + + bool visit(PreDecrementExpression *) override { return true; } + void endVisit(PreDecrementExpression *) override {} + + bool visit(UnaryPlusExpression *) override { return true; } + void endVisit(UnaryPlusExpression *) override {} + + bool visit(UnaryMinusExpression *) override { return true; } + void endVisit(UnaryMinusExpression *) override {} + + bool visit(TildeExpression *) override { return true; } + void endVisit(TildeExpression *) override {} + + bool visit(NotExpression *) override { return true; } + void endVisit(NotExpression *) override {} + + bool visit(BinaryExpression *) override { return true; } + void endVisit(BinaryExpression *) override {} + + bool visit(ConditionalExpression *) override { return true; } + void endVisit(ConditionalExpression *) override {} + + bool visit(Expression *) override { return true; } + void endVisit(Expression *) override {} + + bool visit(Block *) override { return true; } + void endVisit(Block *) override {} + + bool visit(StatementList *) override { return true; } + void endVisit(StatementList *) override {} + + bool visit(VariableStatement *) override { return true; } + void endVisit(VariableStatement *) override {} + + bool visit(VariableDeclarationList *) override { return true; } + void endVisit(VariableDeclarationList *) override {} + + bool visit(EmptyStatement *) override { return true; } + void endVisit(EmptyStatement *) override {} + + bool visit(ExpressionStatement *) override { return true; } + void endVisit(ExpressionStatement *) override {} + + bool visit(IfStatement *) override { return true; } + void endVisit(IfStatement *) override {} + + bool visit(DoWhileStatement *) override { return true; } + void endVisit(DoWhileStatement *) override {} + + bool visit(WhileStatement *) override { return true; } + void endVisit(WhileStatement *) override {} + + bool visit(ForStatement *) override { return true; } + void endVisit(ForStatement *) override {} + + bool visit(ForEachStatement *) override { return true; } + void endVisit(ForEachStatement *) override {} + + bool visit(ContinueStatement *) override { return true; } + void endVisit(ContinueStatement *) override {} + + bool visit(BreakStatement *) override { return true; } + void endVisit(BreakStatement *) override {} + + bool visit(ReturnStatement *) override { return true; } + void endVisit(ReturnStatement *) override {} + + bool visit(YieldExpression *) override { return true; } + void endVisit(YieldExpression *) override {} + + bool visit(WithStatement *) override { return true; } + void endVisit(WithStatement *) override {} + + bool visit(SwitchStatement *) override { return true; } + void endVisit(SwitchStatement *) override {} + + bool visit(CaseBlock *) override { return true; } + void endVisit(CaseBlock *) override {} + + bool visit(CaseClauses *) override { return true; } + void endVisit(CaseClauses *) override {} + + bool visit(CaseClause *) override { return true; } + void endVisit(CaseClause *) override {} + + bool visit(DefaultClause *) override { return true; } + void endVisit(DefaultClause *) override {} + + bool visit(LabelledStatement *) override { return true; } + void endVisit(LabelledStatement *) override {} + + bool visit(ThrowStatement *) override { return true; } + void endVisit(ThrowStatement *) override {} + + bool visit(TryStatement *) override { return true; } + void endVisit(TryStatement *) override {} + + bool visit(Catch *) override { return true; } + void endVisit(Catch *) override {} + + bool visit(Finally *) override { return true; } + void endVisit(Finally *) override {} + + bool visit(FunctionDeclaration *) override { return true; } + void endVisit(FunctionDeclaration *) override {} + + bool visit(FunctionExpression *) override { return true; } + void endVisit(FunctionExpression *) override {} + + bool visit(FormalParameterList *) override { return true; } + void endVisit(FormalParameterList *) override {} + + bool visit(ClassExpression *) override { return true; } + void endVisit(ClassExpression *) override {} + + bool visit(ClassDeclaration *) override { return true; } + void endVisit(ClassDeclaration *) override {} + + bool visit(ClassElementList *) override { return true; } + void endVisit(ClassElementList *) override {} + + bool visit(Program *) override { return true; } + void endVisit(Program *) override {} + + bool visit(NameSpaceImport *) override { return true; } + void endVisit(NameSpaceImport *) override {} + + bool visit(ImportSpecifier *) override { return true; } + void endVisit(ImportSpecifier *) override {} + + bool visit(ImportsList *) override { return true; } + void endVisit(ImportsList *) override {} + + bool visit(NamedImports *) override { return true; } + void endVisit(NamedImports *) override {} + + bool visit(FromClause *) override { return true; } + void endVisit(FromClause *) override {} + + bool visit(ImportClause *) override { return true; } + void endVisit(ImportClause *) override {} + + bool visit(ImportDeclaration *) override { return true; } + void endVisit(ImportDeclaration *) override {} + + bool visit(ExportSpecifier *) override { return true; } + void endVisit(ExportSpecifier *) override {} + + bool visit(ExportsList *) override { return true; } + void endVisit(ExportsList *) override {} + + bool visit(ExportClause *) override { return true; } + void endVisit(ExportClause *) override {} + + bool visit(ExportDeclaration *) override { return true; } + void endVisit(ExportDeclaration *) override {} + + bool visit(ESModule *) override { return true; } + void endVisit(ESModule *) override {} + + bool visit(DebuggerStatement *) override { return true; } + void endVisit(DebuggerStatement *) override {} + + bool visit(Type *) override { return true; } + void endVisit(Type *) override {} + + bool visit(TypeArgumentList *) override { return true; } + void endVisit(TypeArgumentList *) override {} + + bool visit(TypeAnnotation *) override { return true; } + void endVisit(TypeAnnotation *) override {} +}; + } } // namespace AST QT_END_NAMESPACE diff --git a/src/qml/parser/qqmljsengine_p.cpp b/src/qml/parser/qqmljsengine_p.cpp index bb27f3992e..cb6b0375e6 100644 --- a/src/qml/parser/qqmljsengine_p.cpp +++ b/src/qml/parser/qqmljsengine_p.cpp @@ -123,9 +123,9 @@ void Engine::setCode(const QString &code) { _code = code; } void Engine::addComment(int pos, int len, int line, int col) -{ if (len > 0) _comments.append(QQmlJS::AST::SourceLocation(pos, len, line, col)); } +{ if (len > 0) _comments.append(QQmlJS::SourceLocation(pos, len, line, col)); } -QList<QQmlJS::AST::SourceLocation> Engine::comments() const +QList<QQmlJS::SourceLocation> Engine::comments() const { return _comments; } Lexer *Engine::lexer() const diff --git a/src/qml/parser/qqmljsengine_p.h b/src/qml/parser/qqmljsengine_p.h index 8a3e2db6a1..a34922fa1e 100644 --- a/src/qml/parser/qqmljsengine_p.h +++ b/src/qml/parser/qqmljsengine_p.h @@ -52,7 +52,7 @@ // #include "qqmljsglobal_p.h" -#include "qqmljssourcelocation_p.h" +#include <private/qqmljssourcelocation_p.h> #include <private/qqmljsmemorypool_p.h> @@ -97,7 +97,7 @@ class QML_PARSER_EXPORT Engine Lexer *_lexer; Directives *_directives; MemoryPool _pool; - QList<AST::SourceLocation> _comments; + QList<SourceLocation> _comments; QString _extraCode; QString _code; @@ -109,7 +109,7 @@ public: const QString &code() const { return _code; } void addComment(int pos, int len, int line, int col); - QList<AST::SourceLocation> comments() const; + QList<SourceLocation> comments() const; Lexer *lexer() const; void setLexer(Lexer *lexer); diff --git a/src/qml/parser/qqmljskeywords_p.h b/src/qml/parser/qqmljskeywords_p.h index 96b3709162..5f08cc4353 100644 --- a/src/qml/parser/qqmljskeywords_p.h +++ b/src/qml/parser/qqmljskeywords_p.h @@ -743,6 +743,18 @@ static inline int classify8(const QChar *s, int parseModeFlags) { } } } + } else if (s[2].unicode() == 'q') { + if (s[3].unicode() == 'u') { + if (s[4].unicode() == 'i') { + if (s[5].unicode() == 'r') { + if (s[6].unicode() == 'e') { + if (s[7].unicode() == 'd') { + return Lexer::T_REQUIRED; + } + } + } + } + } } } } @@ -824,6 +836,25 @@ static inline int classify9(const QChar *s, int parseModeFlags) { } } } + else if (s[0].unicode() == 'c') { + if (s[1].unicode() == 'o') { + if (s[2].unicode() == 'm') { + if (s[3].unicode() == 'p') { + if (s[4].unicode() == 'o') { + if (s[5].unicode() == 'n') { + if (s[6].unicode() == 'e') { + if (s[7].unicode() == 'n') { + if (s[8].unicode() == 't') { + return (parseModeFlags & Lexer::QmlMode) ? int(Lexer::T_COMPONENT) : int(Lexer::T_IDENTIFIER); + } + } + } + } + } + } + } + } + } return Lexer::T_IDENTIFIER; } diff --git a/src/qml/parser/qqmljslexer.cpp b/src/qml/parser/qqmljslexer.cpp index 1e0ac72bd1..243fc5bd30 100644 --- a/src/qml/parser/qqmljslexer.cpp +++ b/src/qml/parser/qqmljslexer.cpp @@ -492,6 +492,42 @@ int Lexer::scanToken() again: _validTokenText = false; + // handle comment can be called after a '/' has been read + // and returns true if it actually encountered a comment + auto handleComment = [this](){ + if (_char == QLatin1Char('*')) { + scanChar(); + while (_codePtr <= _endPtr) { + if (_char == QLatin1Char('*')) { + scanChar(); + if (_char == QLatin1Char('/')) { + scanChar(); + + if (_engine) { + _engine->addComment(tokenOffset() + 2, _codePtr - _tokenStartPtr - 1 - 4, + tokenStartLine(), tokenStartColumn() + 2); + } + + return true; + } + } else { + scanChar(); + } + } + } else if (_char == QLatin1Char('/')) { + while (_codePtr <= _endPtr && !isLineTerminator()) { + scanChar(); + } + if (_engine) { + _engine->addComment(tokenOffset() + 2, _codePtr - _tokenStartPtr - 1 - 2, + tokenStartLine(), tokenStartColumn() + 2); + } + return true; + } + return false; + }; + + while (_char.isSpace()) { if (isLineTerminator()) { if (_restrictedKeyword) { @@ -544,7 +580,14 @@ again: case ']': return T_RBRACKET; case '[': return T_LBRACKET; - case '?': return T_QUESTION; + case '?': { + if (_char == QLatin1Char('?')) { + scanChar(); + return T_QUESTION_QUESTION; + } + + return T_QUESTION; + } case '>': if (_char == QLatin1Char('>')) { @@ -599,35 +642,9 @@ again: case ':': return T_COLON; case '/': - if (_char == QLatin1Char('*')) { - scanChar(); - while (_codePtr <= _endPtr) { - if (_char == QLatin1Char('*')) { - scanChar(); - if (_char == QLatin1Char('/')) { - scanChar(); - - if (_engine) { - _engine->addComment(tokenOffset() + 2, _codePtr - _tokenStartPtr - 1 - 4, - tokenStartLine(), tokenStartColumn() + 2); - } - - goto again; - } - } else { - scanChar(); - } - } - } else if (_char == QLatin1Char('/')) { - while (_codePtr <= _endPtr && !isLineTerminator()) { - scanChar(); - } - if (_engine) { - _engine->addComment(tokenOffset() + 2, _codePtr - _tokenStartPtr - 1 - 2, - tokenStartLine(), tokenStartColumn() + 2); - } + if (handleComment()) goto again; - } if (_char == QLatin1Char('=')) { + else if (_char == QLatin1Char('=')) { scanChar(); return T_DIVIDE_EQ; } @@ -702,6 +719,8 @@ again: case ')': return T_RPAREN; case '(': return T_LPAREN; + case '@': return T_AT; + case '&': if (_char == QLatin1Char('=')) { scanChar(); @@ -829,6 +848,21 @@ again: if (!identifierWithEscapeChars) kind = classify(_tokenStartPtr, _tokenLength, parseModeFlags()); + if (kind == T_FUNCTION) { + continue_skipping: + while (_codePtr < _endPtr && _char.isSpace()) + scanChar(); + if (_char == QLatin1Char('*')) { + _tokenLength = _codePtr - _tokenStartPtr - 1; + kind = T_FUNCTION_STAR; + scanChar(); + } else if (_char == QLatin1Char('/')) { + scanChar(); + if (handleComment()) + goto continue_skipping; + } + } + if (_engine) { if (kind == T_IDENTIFIER && identifierWithEscapeChars) _tokenSpell = _engine->newStringRef(_tokenText); @@ -1407,6 +1441,7 @@ static const int uriTokens[] = { QQmlJSGrammar::T_FINALLY, QQmlJSGrammar::T_FOR, QQmlJSGrammar::T_FUNCTION, + QQmlJSGrammar::T_FUNCTION_STAR, QQmlJSGrammar::T_IF, QQmlJSGrammar::T_IN, QQmlJSGrammar::T_OF, @@ -1445,8 +1480,8 @@ bool Lexer::scanDirectives(Directives *directives, DiagnosticMessage *error) { auto setError = [error, this](QString message) { error->message = std::move(message); - error->line = tokenStartLine(); - error->column = tokenStartColumn(); + error->loc.startLine = tokenStartLine(); + error->loc.startColumn = tokenStartColumn(); }; QScopedValueRollback<bool> directivesGuard(_handlingDirectives, true); @@ -1561,8 +1596,8 @@ bool Lexer::scanDirectives(Directives *directives, DiagnosticMessage *error) else setError(QCoreApplication::translate("QQmlParser", "Module import requires a qualifier")); if (tokenStartLine() != lineNumber) { - error->line = lineNumber; - error->line = column; + error->loc.startLine = lineNumber; + error->loc.startColumn = column; } return false; // expected `as' } diff --git a/src/qml/parser/qqmljssourcelocation_p.h b/src/qml/parser/qqmljssourcelocation_p.h deleted file mode 100644 index d76e701d49..0000000000 --- a/src/qml/parser/qqmljssourcelocation_p.h +++ /dev/null @@ -1,87 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2018 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the QtQml module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 3 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL3 included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 3 requirements -** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 2.0 or (at your option) the GNU General -** Public license version 3 or any later version approved by the KDE Free -** Qt Foundation. The licenses are as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-2.0.html and -** https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef QQMLJSSOURCELOCATION_P_H -#define QQMLJSSOURCELOCATION_P_H - -#include "qqmljsglobal_p.h" - -#include <QtCore/qglobal.h> - -// -// W A R N I N G -// ------------- -// -// This file is not part of the Qt API. It exists purely as an -// implementation detail. This header file may change from version to -// version without notice, or even be removed. -// -// We mean it. -// - -QT_BEGIN_NAMESPACE - -namespace QQmlJS { namespace AST { - -class SourceLocation -{ -public: - explicit SourceLocation(quint32 offset = 0, quint32 length = 0, quint32 line = 0, quint32 column = 0) - : offset(offset), length(length), - startLine(line), startColumn(column) - { } - - bool isValid() const { return length != 0; } - - quint32 begin() const { return offset; } - quint32 end() const { return offset + length; } - -// attributes - // ### encode - quint32 offset; - quint32 length; - quint32 startLine; - quint32 startColumn; -}; - -} } // namespace AST - -QT_END_NAMESPACE - -#endif |