1 /****************************************************************************
3 ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
4 ** Contact: http://www.qt-project.org/
6 ** This file is part of the QtQml module of the Qt Toolkit.
8 ** $QT_BEGIN_LICENSE:LGPL$
9 ** GNU Lesser General Public License Usage
10 ** This file may be used under the terms of the GNU Lesser General Public
11 ** License version 2.1 as published by the Free Software Foundation and
12 ** appearing in the file LICENSE.LGPL included in the packaging of this
13 ** file. Please review the following information to ensure the GNU Lesser
14 ** General Public License version 2.1 requirements will be met:
15 ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
17 ** In addition, as a special exception, Nokia gives you certain additional
18 ** rights. These rights are described in the Nokia Qt LGPL Exception
19 ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
21 ** GNU General Public License Usage
22 ** Alternatively, this file may be used under the terms of the GNU General
23 ** Public License version 3.0 as published by the Free Software Foundation
24 ** and appearing in the file LICENSE.GPL included in the packaging of this
25 ** file. Please review the following information to ensure the GNU General
26 ** Public License version 3.0 requirements will be met:
27 ** http://www.gnu.org/copyleft/gpl.html.
30 ** Alternatively, this file may be used in accordance with the terms and
31 ** conditions contained in a signed written agreement between you and Nokia.
40 ****************************************************************************/
49 // This file is not part of the Qt API. It exists purely as an
50 // implementation detail. This header file may change from version to
51 // version without notice, or even be removed.
56 #include "qqmljsastvisitor_p.h"
57 #include "qqmljsglobal_p.h"
58 #include "qqmljsmemorypool_p.h"
60 #include <QtCore/QString>
62 QT_QML_BEGIN_NAMESPACE
64 #define QQMLJS_DECLARE_AST_NODE(name) \
65 enum { K = Kind_##name };
67 namespace QSOperator // ### rename
108 } // namespace QSOperator
114 template <typename _T1, typename _T2>
117 if (ast && ast->kind == static_cast<_T1>(0)->K)
118 return static_cast<_T1>(ast);
123 class QML_PARSER_EXPORT Node: public Managed
131 Kind_ArrayMemberExpression,
132 Kind_BinaryExpression,
140 Kind_ConditionalExpression,
141 Kind_ContinueStatement,
142 Kind_DebuggerStatement,
144 Kind_DeleteExpression,
145 Kind_DoWhileStatement,
150 Kind_ExpressionStatement,
152 Kind_FieldMemberExpression,
154 Kind_ForEachStatement,
156 Kind_FormalParameterList,
158 Kind_FunctionDeclaration,
159 Kind_FunctionExpression,
160 Kind_FunctionSourceElement,
161 Kind_IdentifierExpression,
162 Kind_IdentifierPropertyName,
164 Kind_LabelledStatement,
165 Kind_LocalForEachStatement,
166 Kind_LocalForStatement,
168 Kind_NewMemberExpression,
172 Kind_NumericLiteralPropertyName,
174 Kind_PostDecrementExpression,
175 Kind_PostIncrementExpression,
176 Kind_PreDecrementExpression,
177 Kind_PreIncrementExpression,
180 Kind_PropertyNameAndValueList,
182 Kind_ReturnStatement,
186 Kind_StatementSourceElement,
188 Kind_StringLiteralPropertyName,
189 Kind_SwitchStatement,
192 Kind_TildeExpression,
195 Kind_TypeOfExpression,
196 Kind_UnaryMinusExpression,
197 Kind_UnaryPlusExpression,
198 Kind_VariableDeclaration,
199 Kind_VariableDeclarationList,
200 Kind_VariableStatement,
204 Kind_NestedExpression,
209 Kind_UiObjectBinding,
210 Kind_UiObjectDefinition,
211 Kind_UiObjectInitializer,
212 Kind_UiObjectMemberList,
213 Kind_UiArrayMemberList,
215 Kind_UiParameterList,
218 Kind_UiScriptBinding,
223 : kind(Kind_Undefined) {}
225 // NOTE: node destructors are never called,
226 // instead we block free the memory
227 // (see the NodePool class)
230 virtual ExpressionNode *expressionCast();
231 virtual BinaryExpression *binaryExpressionCast();
232 virtual Statement *statementCast();
233 virtual UiObjectMember *uiObjectMemberCast();
235 void accept(Visitor *visitor);
236 static void accept(Node *node, Visitor *visitor);
238 inline static void acceptChild(Node *node, Visitor *visitor)
239 { return accept(node, visitor); } // ### remove
241 virtual void accept0(Visitor *visitor) = 0;
242 virtual SourceLocation firstSourceLocation() const = 0;
243 virtual SourceLocation lastSourceLocation() const = 0;
249 class QML_PARSER_EXPORT ExpressionNode: public Node
254 virtual ExpressionNode *expressionCast();
257 class QML_PARSER_EXPORT Statement: public Node
262 virtual Statement *statementCast();
265 class QML_PARSER_EXPORT NestedExpression: public ExpressionNode
268 QQMLJS_DECLARE_AST_NODE(NestedExpression)
270 NestedExpression(ExpressionNode *expression)
271 : expression(expression)
274 virtual void accept0(Visitor *visitor);
276 virtual SourceLocation firstSourceLocation() const
277 { return lparenToken; }
279 virtual SourceLocation lastSourceLocation() const
280 { return rparenToken; }
283 ExpressionNode *expression;
284 SourceLocation lparenToken;
285 SourceLocation rparenToken;
288 class QML_PARSER_EXPORT ThisExpression: public ExpressionNode
291 QQMLJS_DECLARE_AST_NODE(ThisExpression)
293 ThisExpression() { kind = K; }
295 virtual void accept0(Visitor *visitor);
297 virtual SourceLocation firstSourceLocation() const
298 { return thisToken; }
300 virtual SourceLocation lastSourceLocation() const
301 { return thisToken; }
304 SourceLocation thisToken;
307 class QML_PARSER_EXPORT IdentifierExpression: public ExpressionNode
310 QQMLJS_DECLARE_AST_NODE(IdentifierExpression)
312 IdentifierExpression(const QStringRef &n):
313 name (n) { kind = K; }
315 virtual void accept0(Visitor *visitor);
317 virtual SourceLocation firstSourceLocation() const
318 { return identifierToken; }
320 virtual SourceLocation lastSourceLocation() const
321 { return identifierToken; }
325 SourceLocation identifierToken;
328 class QML_PARSER_EXPORT NullExpression: public ExpressionNode
331 QQMLJS_DECLARE_AST_NODE(NullExpression)
333 NullExpression() { kind = K; }
335 virtual void accept0(Visitor *visitor);
337 virtual SourceLocation firstSourceLocation() const
338 { return nullToken; }
340 virtual SourceLocation lastSourceLocation() const
341 { return nullToken; }
344 SourceLocation nullToken;
347 class QML_PARSER_EXPORT TrueLiteral: public ExpressionNode
350 QQMLJS_DECLARE_AST_NODE(TrueLiteral)
352 TrueLiteral() { kind = K; }
354 virtual void accept0(Visitor *visitor);
356 virtual SourceLocation firstSourceLocation() const
357 { return trueToken; }
359 virtual SourceLocation lastSourceLocation() const
360 { return trueToken; }
363 SourceLocation trueToken;
366 class QML_PARSER_EXPORT FalseLiteral: public ExpressionNode
369 QQMLJS_DECLARE_AST_NODE(FalseLiteral)
371 FalseLiteral() { kind = K; }
373 virtual void accept0(Visitor *visitor);
375 virtual SourceLocation firstSourceLocation() const
376 { return falseToken; }
378 virtual SourceLocation lastSourceLocation() const
379 { return falseToken; }
382 SourceLocation falseToken;
385 class QML_PARSER_EXPORT NumericLiteral: public ExpressionNode
388 QQMLJS_DECLARE_AST_NODE(NumericLiteral)
390 NumericLiteral(double v):
391 value(v) { kind = K; }
393 virtual void accept0(Visitor *visitor);
395 virtual SourceLocation firstSourceLocation() const
396 { return literalToken; }
398 virtual SourceLocation lastSourceLocation() const
399 { return literalToken; }
403 SourceLocation literalToken;
406 class QML_PARSER_EXPORT StringLiteral: public ExpressionNode
409 QQMLJS_DECLARE_AST_NODE(StringLiteral)
411 StringLiteral(const QStringRef &v):
412 value (v) { kind = K; }
414 virtual void accept0(Visitor *visitor);
416 virtual SourceLocation firstSourceLocation() const
417 { return literalToken; }
419 virtual SourceLocation lastSourceLocation() const
420 { return literalToken; }
424 SourceLocation literalToken;
427 class QML_PARSER_EXPORT RegExpLiteral: public ExpressionNode
430 QQMLJS_DECLARE_AST_NODE(RegExpLiteral)
432 RegExpLiteral(const QStringRef &p, int f):
433 pattern (p), flags (f) { kind = K; }
435 virtual void accept0(Visitor *visitor);
437 virtual SourceLocation firstSourceLocation() const
438 { return literalToken; }
440 virtual SourceLocation lastSourceLocation() const
441 { return literalToken; }
446 SourceLocation literalToken;
449 class QML_PARSER_EXPORT ArrayLiteral: public ExpressionNode
452 QQMLJS_DECLARE_AST_NODE(ArrayLiteral)
454 ArrayLiteral(Elision *e):
455 elements (0), elision (e)
458 ArrayLiteral(ElementList *elts):
459 elements (elts), elision (0)
462 ArrayLiteral(ElementList *elts, Elision *e):
463 elements (elts), elision (e)
466 virtual void accept0(Visitor *visitor);
468 virtual SourceLocation firstSourceLocation() const
469 { return lbracketToken; }
471 virtual SourceLocation lastSourceLocation() const
472 { return rbracketToken; }
475 ElementList *elements;
477 SourceLocation lbracketToken;
478 SourceLocation commaToken;
479 SourceLocation rbracketToken;
482 class QML_PARSER_EXPORT ObjectLiteral: public ExpressionNode
485 QQMLJS_DECLARE_AST_NODE(ObjectLiteral)
488 properties (0) { kind = K; }
490 ObjectLiteral(PropertyNameAndValueList *plist):
491 properties (plist) { kind = K; }
493 virtual void accept0(Visitor *visitor);
495 virtual SourceLocation firstSourceLocation() const
496 { return lbraceToken; }
498 virtual SourceLocation lastSourceLocation() const
499 { return rbraceToken; }
502 PropertyNameAndValueList *properties;
503 SourceLocation lbraceToken;
504 SourceLocation rbraceToken;
507 class QML_PARSER_EXPORT Elision: public Node
510 QQMLJS_DECLARE_AST_NODE(Elision)
513 next (this) { kind = K; }
515 Elision(Elision *previous)
518 next = previous->next;
519 previous->next = this;
522 virtual void accept0(Visitor *visitor);
524 virtual SourceLocation firstSourceLocation() const
525 { return commaToken; }
527 virtual SourceLocation lastSourceLocation() const
528 { return next ? next->lastSourceLocation() : commaToken; }
530 inline Elision *finish ()
532 Elision *front = next;
539 SourceLocation commaToken;
542 class QML_PARSER_EXPORT ElementList: public Node
545 QQMLJS_DECLARE_AST_NODE(ElementList)
547 ElementList(Elision *e, ExpressionNode *expr):
548 elision (e), expression (expr), next (this)
551 ElementList(ElementList *previous, Elision *e, ExpressionNode *expr):
552 elision (e), expression (expr)
555 next = previous->next;
556 previous->next = this;
559 inline ElementList *finish ()
561 ElementList *front = next;
566 virtual void accept0(Visitor *visitor);
568 virtual SourceLocation firstSourceLocation() const
571 return elision->firstSourceLocation();
572 return expression->firstSourceLocation();
575 virtual SourceLocation lastSourceLocation() const
578 return next->lastSourceLocation();
579 return expression->lastSourceLocation();
584 ExpressionNode *expression;
586 SourceLocation commaToken;
589 class QML_PARSER_EXPORT PropertyName: public Node
592 QQMLJS_DECLARE_AST_NODE(PropertyName)
594 PropertyName() { kind = K; }
596 virtual SourceLocation firstSourceLocation() const
597 { return propertyNameToken; }
599 virtual SourceLocation lastSourceLocation() const
600 { return propertyNameToken; }
603 SourceLocation propertyNameToken;
606 class QML_PARSER_EXPORT PropertyNameAndValueList: public Node
609 QQMLJS_DECLARE_AST_NODE(PropertyNameAndValueList)
611 PropertyNameAndValueList(PropertyName *n, ExpressionNode *v):
612 name (n), value (v), next (this)
615 PropertyNameAndValueList(PropertyNameAndValueList *previous, PropertyName *n, ExpressionNode *v):
619 next = previous->next;
620 previous->next = this;
623 virtual void accept0(Visitor *visitor);
625 virtual SourceLocation firstSourceLocation() const
626 { return name->firstSourceLocation(); }
628 virtual SourceLocation lastSourceLocation() const
631 return next->lastSourceLocation();
632 return value->lastSourceLocation();
635 inline PropertyNameAndValueList *finish ()
637 PropertyNameAndValueList *front = next;
644 ExpressionNode *value;
645 PropertyNameAndValueList *next;
646 SourceLocation colonToken;
647 SourceLocation commaToken;
650 class QML_PARSER_EXPORT IdentifierPropertyName: public PropertyName
653 QQMLJS_DECLARE_AST_NODE(IdentifierPropertyName)
655 IdentifierPropertyName(const QStringRef &n):
658 virtual void accept0(Visitor *visitor);
664 class QML_PARSER_EXPORT StringLiteralPropertyName: public PropertyName
667 QQMLJS_DECLARE_AST_NODE(StringLiteralPropertyName)
669 StringLiteralPropertyName(const QStringRef &n):
672 virtual void accept0(Visitor *visitor);
678 class QML_PARSER_EXPORT NumericLiteralPropertyName: public PropertyName
681 QQMLJS_DECLARE_AST_NODE(NumericLiteralPropertyName)
683 NumericLiteralPropertyName(double n):
686 virtual void accept0(Visitor *visitor);
692 class QML_PARSER_EXPORT ArrayMemberExpression: public ExpressionNode
695 QQMLJS_DECLARE_AST_NODE(ArrayMemberExpression)
697 ArrayMemberExpression(ExpressionNode *b, ExpressionNode *e):
698 base (b), expression (e)
701 virtual void accept0(Visitor *visitor);
703 virtual SourceLocation firstSourceLocation() const
704 { return base->firstSourceLocation(); }
706 virtual SourceLocation lastSourceLocation() const
707 { return rbracketToken; }
710 ExpressionNode *base;
711 ExpressionNode *expression;
712 SourceLocation lbracketToken;
713 SourceLocation rbracketToken;
716 class QML_PARSER_EXPORT FieldMemberExpression: public ExpressionNode
719 QQMLJS_DECLARE_AST_NODE(FieldMemberExpression)
721 FieldMemberExpression(ExpressionNode *b, const QStringRef &n):
725 virtual void accept0(Visitor *visitor);
727 virtual SourceLocation firstSourceLocation() const
728 { return base->firstSourceLocation(); }
730 virtual SourceLocation lastSourceLocation() const
731 { return identifierToken; }
734 ExpressionNode *base;
736 SourceLocation dotToken;
737 SourceLocation identifierToken;
740 class QML_PARSER_EXPORT NewMemberExpression: public ExpressionNode
743 QQMLJS_DECLARE_AST_NODE(NewMemberExpression)
745 NewMemberExpression(ExpressionNode *b, ArgumentList *a):
746 base (b), arguments (a)
749 virtual void accept0(Visitor *visitor);
751 virtual SourceLocation firstSourceLocation() const
754 virtual SourceLocation lastSourceLocation() const
755 { return rparenToken; }
758 ExpressionNode *base;
759 ArgumentList *arguments;
760 SourceLocation newToken;
761 SourceLocation lparenToken;
762 SourceLocation rparenToken;
765 class QML_PARSER_EXPORT NewExpression: public ExpressionNode
768 QQMLJS_DECLARE_AST_NODE(NewExpression)
770 NewExpression(ExpressionNode *e):
771 expression (e) { kind = K; }
773 virtual void accept0(Visitor *visitor);
775 virtual SourceLocation firstSourceLocation() const
778 virtual SourceLocation lastSourceLocation() const
779 { return expression->lastSourceLocation(); }
782 ExpressionNode *expression;
783 SourceLocation newToken;
786 class QML_PARSER_EXPORT CallExpression: public ExpressionNode
789 QQMLJS_DECLARE_AST_NODE(CallExpression)
791 CallExpression(ExpressionNode *b, ArgumentList *a):
792 base (b), arguments (a)
795 virtual void accept0(Visitor *visitor);
797 virtual SourceLocation firstSourceLocation() const
798 { return base->firstSourceLocation(); }
800 virtual SourceLocation lastSourceLocation() const
801 { return rparenToken; }
804 ExpressionNode *base;
805 ArgumentList *arguments;
806 SourceLocation lparenToken;
807 SourceLocation rparenToken;
810 class QML_PARSER_EXPORT ArgumentList: public Node
813 QQMLJS_DECLARE_AST_NODE(ArgumentList)
815 ArgumentList(ExpressionNode *e):
816 expression (e), next (this)
819 ArgumentList(ArgumentList *previous, ExpressionNode *e):
823 next = previous->next;
824 previous->next = this;
827 virtual void accept0(Visitor *visitor);
829 virtual SourceLocation firstSourceLocation() const
830 { return expression->firstSourceLocation(); }
832 virtual SourceLocation lastSourceLocation() const
835 return next->lastSourceLocation();
836 return expression->lastSourceLocation();
839 inline ArgumentList *finish ()
841 ArgumentList *front = next;
847 ExpressionNode *expression;
849 SourceLocation commaToken;
852 class QML_PARSER_EXPORT PostIncrementExpression: public ExpressionNode
855 QQMLJS_DECLARE_AST_NODE(PostIncrementExpression)
857 PostIncrementExpression(ExpressionNode *b):
858 base (b) { kind = K; }
860 virtual void accept0(Visitor *visitor);
862 virtual SourceLocation firstSourceLocation() const
863 { return base->firstSourceLocation(); }
865 virtual SourceLocation lastSourceLocation() const
866 { return incrementToken; }
869 ExpressionNode *base;
870 SourceLocation incrementToken;
873 class QML_PARSER_EXPORT PostDecrementExpression: public ExpressionNode
876 QQMLJS_DECLARE_AST_NODE(PostDecrementExpression)
878 PostDecrementExpression(ExpressionNode *b):
879 base (b) { kind = K; }
881 virtual void accept0(Visitor *visitor);
883 virtual SourceLocation firstSourceLocation() const
884 { return base->firstSourceLocation(); }
886 virtual SourceLocation lastSourceLocation() const
887 { return decrementToken; }
890 ExpressionNode *base;
891 SourceLocation decrementToken;
894 class QML_PARSER_EXPORT DeleteExpression: public ExpressionNode
897 QQMLJS_DECLARE_AST_NODE(DeleteExpression)
899 DeleteExpression(ExpressionNode *e):
900 expression (e) { kind = K; }
902 virtual void accept0(Visitor *visitor);
904 virtual SourceLocation firstSourceLocation() const
905 { return deleteToken; }
907 virtual SourceLocation lastSourceLocation() const
908 { return expression->lastSourceLocation(); }
911 ExpressionNode *expression;
912 SourceLocation deleteToken;
915 class QML_PARSER_EXPORT VoidExpression: public ExpressionNode
918 QQMLJS_DECLARE_AST_NODE(VoidExpression)
920 VoidExpression(ExpressionNode *e):
921 expression (e) { kind = K; }
923 virtual void accept0(Visitor *visitor);
925 virtual SourceLocation firstSourceLocation() const
926 { return voidToken; }
928 virtual SourceLocation lastSourceLocation() const
929 { return expression->lastSourceLocation(); }
932 ExpressionNode *expression;
933 SourceLocation voidToken;
936 class QML_PARSER_EXPORT TypeOfExpression: public ExpressionNode
939 QQMLJS_DECLARE_AST_NODE(TypeOfExpression)
941 TypeOfExpression(ExpressionNode *e):
942 expression (e) { kind = K; }
944 virtual void accept0(Visitor *visitor);
946 virtual SourceLocation firstSourceLocation() const
947 { return typeofToken; }
949 virtual SourceLocation lastSourceLocation() const
950 { return expression->lastSourceLocation(); }
953 ExpressionNode *expression;
954 SourceLocation typeofToken;
957 class QML_PARSER_EXPORT PreIncrementExpression: public ExpressionNode
960 QQMLJS_DECLARE_AST_NODE(PreIncrementExpression)
962 PreIncrementExpression(ExpressionNode *e):
963 expression (e) { kind = K; }
965 virtual void accept0(Visitor *visitor);
967 virtual SourceLocation firstSourceLocation() const
968 { return incrementToken; }
970 virtual SourceLocation lastSourceLocation() const
971 { return expression->lastSourceLocation(); }
974 ExpressionNode *expression;
975 SourceLocation incrementToken;
978 class QML_PARSER_EXPORT PreDecrementExpression: public ExpressionNode
981 QQMLJS_DECLARE_AST_NODE(PreDecrementExpression)
983 PreDecrementExpression(ExpressionNode *e):
984 expression (e) { kind = K; }
986 virtual void accept0(Visitor *visitor);
988 virtual SourceLocation firstSourceLocation() const
989 { return decrementToken; }
991 virtual SourceLocation lastSourceLocation() const
992 { return expression->lastSourceLocation(); }
995 ExpressionNode *expression;
996 SourceLocation decrementToken;
999 class QML_PARSER_EXPORT UnaryPlusExpression: public ExpressionNode
1002 QQMLJS_DECLARE_AST_NODE(UnaryPlusExpression)
1004 UnaryPlusExpression(ExpressionNode *e):
1005 expression (e) { kind = K; }
1007 virtual void accept0(Visitor *visitor);
1009 virtual SourceLocation firstSourceLocation() const
1010 { return plusToken; }
1012 virtual SourceLocation lastSourceLocation() const
1013 { return expression->lastSourceLocation(); }
1016 ExpressionNode *expression;
1017 SourceLocation plusToken;
1020 class QML_PARSER_EXPORT UnaryMinusExpression: public ExpressionNode
1023 QQMLJS_DECLARE_AST_NODE(UnaryMinusExpression)
1025 UnaryMinusExpression(ExpressionNode *e):
1026 expression (e) { kind = K; }
1028 virtual void accept0(Visitor *visitor);
1030 virtual SourceLocation firstSourceLocation() const
1031 { return minusToken; }
1033 virtual SourceLocation lastSourceLocation() const
1034 { return expression->lastSourceLocation(); }
1037 ExpressionNode *expression;
1038 SourceLocation minusToken;
1041 class QML_PARSER_EXPORT TildeExpression: public ExpressionNode
1044 QQMLJS_DECLARE_AST_NODE(TildeExpression)
1046 TildeExpression(ExpressionNode *e):
1047 expression (e) { kind = K; }
1049 virtual void accept0(Visitor *visitor);
1051 virtual SourceLocation firstSourceLocation() const
1052 { return tildeToken; }
1054 virtual SourceLocation lastSourceLocation() const
1055 { return expression->lastSourceLocation(); }
1058 ExpressionNode *expression;
1059 SourceLocation tildeToken;
1062 class QML_PARSER_EXPORT NotExpression: public ExpressionNode
1065 QQMLJS_DECLARE_AST_NODE(NotExpression)
1067 NotExpression(ExpressionNode *e):
1068 expression (e) { kind = K; }
1070 virtual void accept0(Visitor *visitor);
1072 virtual SourceLocation firstSourceLocation() const
1073 { return notToken; }
1075 virtual SourceLocation lastSourceLocation() const
1076 { return expression->lastSourceLocation(); }
1079 ExpressionNode *expression;
1080 SourceLocation notToken;
1083 class QML_PARSER_EXPORT BinaryExpression: public ExpressionNode
1086 QQMLJS_DECLARE_AST_NODE(BinaryExpression)
1088 BinaryExpression(ExpressionNode *l, int o, ExpressionNode *r):
1089 left (l), op (o), right (r)
1092 virtual BinaryExpression *binaryExpressionCast();
1094 virtual void accept0(Visitor *visitor);
1096 virtual SourceLocation firstSourceLocation() const
1097 { return left->firstSourceLocation(); }
1099 virtual SourceLocation lastSourceLocation() const
1100 { return right->lastSourceLocation(); }
1103 ExpressionNode *left;
1105 ExpressionNode *right;
1106 SourceLocation operatorToken;
1109 class QML_PARSER_EXPORT ConditionalExpression: public ExpressionNode
1112 QQMLJS_DECLARE_AST_NODE(ConditionalExpression)
1114 ConditionalExpression(ExpressionNode *e, ExpressionNode *t, ExpressionNode *f):
1115 expression (e), ok (t), ko (f)
1118 virtual void accept0(Visitor *visitor);
1120 virtual SourceLocation firstSourceLocation() const
1121 { return expression->firstSourceLocation(); }
1123 virtual SourceLocation lastSourceLocation() const
1124 { return ko->lastSourceLocation(); }
1127 ExpressionNode *expression;
1130 SourceLocation questionToken;
1131 SourceLocation colonToken;
1134 class QML_PARSER_EXPORT Expression: public ExpressionNode // ### rename
1137 QQMLJS_DECLARE_AST_NODE(Expression)
1139 Expression(ExpressionNode *l, ExpressionNode *r):
1140 left (l), right (r) { kind = K; }
1142 virtual void accept0(Visitor *visitor);
1144 virtual SourceLocation firstSourceLocation() const
1145 { return left->firstSourceLocation(); }
1147 virtual SourceLocation lastSourceLocation() const
1148 { return right->lastSourceLocation(); }
1151 ExpressionNode *left;
1152 ExpressionNode *right;
1153 SourceLocation commaToken;
1156 class QML_PARSER_EXPORT Block: public Statement
1159 QQMLJS_DECLARE_AST_NODE(Block)
1161 Block(StatementList *slist):
1162 statements (slist) { kind = K; }
1164 virtual void accept0(Visitor *visitor);
1166 virtual SourceLocation firstSourceLocation() const
1167 { return lbraceToken; }
1169 virtual SourceLocation lastSourceLocation() const
1170 { return rbraceToken; }
1173 StatementList *statements;
1174 SourceLocation lbraceToken;
1175 SourceLocation rbraceToken;
1178 class QML_PARSER_EXPORT StatementList: public Node
1181 QQMLJS_DECLARE_AST_NODE(StatementList)
1183 StatementList(Statement *stmt):
1184 statement (stmt), next (this)
1187 StatementList(StatementList *previous, Statement *stmt):
1191 next = previous->next;
1192 previous->next = this;
1195 virtual void accept0(Visitor *visitor);
1197 virtual SourceLocation firstSourceLocation() const
1198 { return statement->firstSourceLocation(); }
1200 virtual SourceLocation lastSourceLocation() const
1201 { return next ? next->lastSourceLocation() : statement->lastSourceLocation(); }
1203 inline StatementList *finish ()
1205 StatementList *front = next;
1211 Statement *statement;
1212 StatementList *next;
1215 class QML_PARSER_EXPORT VariableStatement: public Statement
1218 QQMLJS_DECLARE_AST_NODE(VariableStatement)
1220 VariableStatement(VariableDeclarationList *vlist):
1221 declarations (vlist)
1224 virtual void accept0(Visitor *visitor);
1226 virtual SourceLocation firstSourceLocation() const
1227 { return declarationKindToken; }
1229 virtual SourceLocation lastSourceLocation() const
1230 { return semicolonToken; }
1233 VariableDeclarationList *declarations;
1234 SourceLocation declarationKindToken;
1235 SourceLocation semicolonToken;
1238 class QML_PARSER_EXPORT VariableDeclaration: public Node
1241 QQMLJS_DECLARE_AST_NODE(VariableDeclaration)
1243 VariableDeclaration(const QStringRef &n, ExpressionNode *e):
1244 name (n), expression (e), readOnly(false)
1247 virtual void accept0(Visitor *visitor);
1249 virtual SourceLocation firstSourceLocation() const
1250 { return identifierToken; }
1252 virtual SourceLocation lastSourceLocation() const
1253 { return expression ? expression->lastSourceLocation() : identifierToken; }
1257 ExpressionNode *expression;
1259 SourceLocation identifierToken;
1262 class QML_PARSER_EXPORT VariableDeclarationList: public Node
1265 QQMLJS_DECLARE_AST_NODE(VariableDeclarationList)
1267 VariableDeclarationList(VariableDeclaration *decl):
1268 declaration (decl), next (this)
1271 VariableDeclarationList(VariableDeclarationList *previous, VariableDeclaration *decl):
1275 next = previous->next;
1276 previous->next = this;
1279 virtual void accept0(Visitor *visitor);
1281 virtual SourceLocation firstSourceLocation() const
1282 { return declaration->firstSourceLocation(); }
1284 virtual SourceLocation lastSourceLocation() const
1287 return next->lastSourceLocation();
1288 return declaration->lastSourceLocation();
1291 inline VariableDeclarationList *finish (bool readOnly)
1293 VariableDeclarationList *front = next;
1296 VariableDeclarationList *vdl;
1297 for (vdl = front; vdl != 0; vdl = vdl->next)
1298 vdl->declaration->readOnly = true;
1304 VariableDeclaration *declaration;
1305 VariableDeclarationList *next;
1306 SourceLocation commaToken;
1309 class QML_PARSER_EXPORT EmptyStatement: public Statement
1312 QQMLJS_DECLARE_AST_NODE(EmptyStatement)
1314 EmptyStatement() { kind = K; }
1316 virtual void accept0(Visitor *visitor);
1318 virtual SourceLocation firstSourceLocation() const
1319 { return semicolonToken; }
1321 virtual SourceLocation lastSourceLocation() const
1322 { return semicolonToken; }
1325 SourceLocation semicolonToken;
1328 class QML_PARSER_EXPORT ExpressionStatement: public Statement
1331 QQMLJS_DECLARE_AST_NODE(ExpressionStatement)
1333 ExpressionStatement(ExpressionNode *e):
1334 expression (e) { kind = K; }
1336 virtual void accept0(Visitor *visitor);
1338 virtual SourceLocation firstSourceLocation() const
1339 { return expression->firstSourceLocation(); }
1341 virtual SourceLocation lastSourceLocation() const
1342 { return semicolonToken; }
1345 ExpressionNode *expression;
1346 SourceLocation semicolonToken;
1349 class QML_PARSER_EXPORT IfStatement: public Statement
1352 QQMLJS_DECLARE_AST_NODE(IfStatement)
1354 IfStatement(ExpressionNode *e, Statement *t, Statement *f = 0):
1355 expression (e), ok (t), ko (f)
1358 virtual void accept0(Visitor *visitor);
1360 virtual SourceLocation firstSourceLocation() const
1363 virtual SourceLocation lastSourceLocation() const
1366 return ko->lastSourceLocation();
1368 return ok->lastSourceLocation();
1372 ExpressionNode *expression;
1375 SourceLocation ifToken;
1376 SourceLocation lparenToken;
1377 SourceLocation rparenToken;
1378 SourceLocation elseToken;
1381 class QML_PARSER_EXPORT DoWhileStatement: public Statement
1384 QQMLJS_DECLARE_AST_NODE(DoWhileStatement)
1386 DoWhileStatement(Statement *stmt, ExpressionNode *e):
1387 statement (stmt), expression (e)
1390 virtual void accept0(Visitor *visitor);
1392 virtual SourceLocation firstSourceLocation() const
1395 virtual SourceLocation lastSourceLocation() const
1396 { return semicolonToken; }
1399 Statement *statement;
1400 ExpressionNode *expression;
1401 SourceLocation doToken;
1402 SourceLocation whileToken;
1403 SourceLocation lparenToken;
1404 SourceLocation rparenToken;
1405 SourceLocation semicolonToken;
1408 class QML_PARSER_EXPORT WhileStatement: public Statement
1411 QQMLJS_DECLARE_AST_NODE(WhileStatement)
1413 WhileStatement(ExpressionNode *e, Statement *stmt):
1414 expression (e), statement (stmt)
1417 virtual void accept0(Visitor *visitor);
1419 virtual SourceLocation firstSourceLocation() const
1420 { return whileToken; }
1422 virtual SourceLocation lastSourceLocation() const
1423 { return statement->lastSourceLocation(); }
1426 ExpressionNode *expression;
1427 Statement *statement;
1428 SourceLocation whileToken;
1429 SourceLocation lparenToken;
1430 SourceLocation rparenToken;
1433 class QML_PARSER_EXPORT ForStatement: public Statement
1436 QQMLJS_DECLARE_AST_NODE(ForStatement)
1438 ForStatement(ExpressionNode *i, ExpressionNode *c, ExpressionNode *e, Statement *stmt):
1439 initialiser (i), condition (c), expression (e), statement (stmt)
1442 virtual void accept0(Visitor *visitor);
1444 virtual SourceLocation firstSourceLocation() const
1445 { return forToken; }
1447 virtual SourceLocation lastSourceLocation() const
1448 { return statement->lastSourceLocation(); }
1451 ExpressionNode *initialiser;
1452 ExpressionNode *condition;
1453 ExpressionNode *expression;
1454 Statement *statement;
1455 SourceLocation forToken;
1456 SourceLocation lparenToken;
1457 SourceLocation firstSemicolonToken;
1458 SourceLocation secondSemicolonToken;
1459 SourceLocation rparenToken;
1462 class QML_PARSER_EXPORT LocalForStatement: public Statement
1465 QQMLJS_DECLARE_AST_NODE(LocalForStatement)
1467 LocalForStatement(VariableDeclarationList *vlist, ExpressionNode *c, ExpressionNode *e, Statement *stmt):
1468 declarations (vlist), condition (c), expression (e), statement (stmt)
1471 virtual void accept0(Visitor *visitor);
1473 virtual SourceLocation firstSourceLocation() const
1474 { return forToken; }
1476 virtual SourceLocation lastSourceLocation() const
1477 { return statement->lastSourceLocation(); }
1480 VariableDeclarationList *declarations;
1481 ExpressionNode *condition;
1482 ExpressionNode *expression;
1483 Statement *statement;
1484 SourceLocation forToken;
1485 SourceLocation lparenToken;
1486 SourceLocation varToken;
1487 SourceLocation firstSemicolonToken;
1488 SourceLocation secondSemicolonToken;
1489 SourceLocation rparenToken;
1492 class QML_PARSER_EXPORT ForEachStatement: public Statement
1495 QQMLJS_DECLARE_AST_NODE(ForEachStatement)
1497 ForEachStatement(ExpressionNode *i, ExpressionNode *e, Statement *stmt):
1498 initialiser (i), expression (e), statement (stmt)
1501 virtual void accept0(Visitor *visitor);
1503 virtual SourceLocation firstSourceLocation() const
1504 { return forToken; }
1506 virtual SourceLocation lastSourceLocation() const
1507 { return statement->lastSourceLocation(); }
1510 ExpressionNode *initialiser;
1511 ExpressionNode *expression;
1512 Statement *statement;
1513 SourceLocation forToken;
1514 SourceLocation lparenToken;
1515 SourceLocation inToken;
1516 SourceLocation rparenToken;
1519 class QML_PARSER_EXPORT LocalForEachStatement: public Statement
1522 QQMLJS_DECLARE_AST_NODE(LocalForEachStatement)
1524 LocalForEachStatement(VariableDeclaration *v, ExpressionNode *e, Statement *stmt):
1525 declaration (v), expression (e), statement (stmt)
1528 virtual void accept0(Visitor *visitor);
1530 virtual SourceLocation firstSourceLocation() const
1531 { return forToken; }
1533 virtual SourceLocation lastSourceLocation() const
1534 { return statement->lastSourceLocation(); }
1537 VariableDeclaration *declaration;
1538 ExpressionNode *expression;
1539 Statement *statement;
1540 SourceLocation forToken;
1541 SourceLocation lparenToken;
1542 SourceLocation varToken;
1543 SourceLocation inToken;
1544 SourceLocation rparenToken;
1547 class QML_PARSER_EXPORT ContinueStatement: public Statement
1550 QQMLJS_DECLARE_AST_NODE(ContinueStatement)
1552 ContinueStatement(const QStringRef &l = QStringRef()):
1553 label (l) { kind = K; }
1555 virtual void accept0(Visitor *visitor);
1557 virtual SourceLocation firstSourceLocation() const
1558 { return continueToken; }
1560 virtual SourceLocation lastSourceLocation() const
1561 { return semicolonToken; }
1565 SourceLocation continueToken;
1566 SourceLocation identifierToken;
1567 SourceLocation semicolonToken;
1570 class QML_PARSER_EXPORT BreakStatement: public Statement
1573 QQMLJS_DECLARE_AST_NODE(BreakStatement)
1575 BreakStatement(const QStringRef &l):
1576 label (l) { kind = K; }
1578 virtual void accept0(Visitor *visitor);
1580 virtual SourceLocation firstSourceLocation() const
1581 { return breakToken; }
1583 virtual SourceLocation lastSourceLocation() const
1584 { return semicolonToken; }
1588 SourceLocation breakToken;
1589 SourceLocation identifierToken;
1590 SourceLocation semicolonToken;
1593 class QML_PARSER_EXPORT ReturnStatement: public Statement
1596 QQMLJS_DECLARE_AST_NODE(ReturnStatement)
1598 ReturnStatement(ExpressionNode *e):
1599 expression (e) { kind = K; }
1601 virtual void accept0(Visitor *visitor);
1603 virtual SourceLocation firstSourceLocation() const
1604 { return returnToken; }
1606 virtual SourceLocation lastSourceLocation() const
1607 { return semicolonToken; }
1610 ExpressionNode *expression;
1611 SourceLocation returnToken;
1612 SourceLocation semicolonToken;
1615 class QML_PARSER_EXPORT WithStatement: public Statement
1618 QQMLJS_DECLARE_AST_NODE(WithStatement)
1620 WithStatement(ExpressionNode *e, Statement *stmt):
1621 expression (e), statement (stmt)
1624 virtual void accept0(Visitor *visitor);
1626 virtual SourceLocation firstSourceLocation() const
1627 { return withToken; }
1629 virtual SourceLocation lastSourceLocation() const
1630 { return statement->lastSourceLocation(); }
1633 ExpressionNode *expression;
1634 Statement *statement;
1635 SourceLocation withToken;
1636 SourceLocation lparenToken;
1637 SourceLocation rparenToken;
1640 class QML_PARSER_EXPORT CaseBlock: public Node
1643 QQMLJS_DECLARE_AST_NODE(CaseBlock)
1645 CaseBlock(CaseClauses *c, DefaultClause *d = 0, CaseClauses *r = 0):
1646 clauses (c), defaultClause (d), moreClauses (r)
1649 virtual void accept0(Visitor *visitor);
1651 virtual SourceLocation firstSourceLocation() const
1652 { return lbraceToken; }
1654 virtual SourceLocation lastSourceLocation() const
1655 { return rbraceToken; }
1658 CaseClauses *clauses;
1659 DefaultClause *defaultClause;
1660 CaseClauses *moreClauses;
1661 SourceLocation lbraceToken;
1662 SourceLocation rbraceToken;
1665 class QML_PARSER_EXPORT SwitchStatement: public Statement
1668 QQMLJS_DECLARE_AST_NODE(SwitchStatement)
1670 SwitchStatement(ExpressionNode *e, CaseBlock *b):
1671 expression (e), block (b)
1674 virtual void accept0(Visitor *visitor);
1676 virtual SourceLocation firstSourceLocation() const
1677 { return switchToken; }
1679 virtual SourceLocation lastSourceLocation() const
1680 { return block->rbraceToken; }
1683 ExpressionNode *expression;
1685 SourceLocation switchToken;
1686 SourceLocation lparenToken;
1687 SourceLocation rparenToken;
1690 class QML_PARSER_EXPORT CaseClause: public Node
1693 QQMLJS_DECLARE_AST_NODE(CaseClause)
1695 CaseClause(ExpressionNode *e, StatementList *slist):
1696 expression (e), statements (slist)
1699 virtual void accept0(Visitor *visitor);
1701 virtual SourceLocation firstSourceLocation() const
1702 { return caseToken; }
1704 virtual SourceLocation lastSourceLocation() const
1705 { return statements ? statements->lastSourceLocation() : colonToken; }
1708 ExpressionNode *expression;
1709 StatementList *statements;
1710 SourceLocation caseToken;
1711 SourceLocation colonToken;
1714 class QML_PARSER_EXPORT CaseClauses: public Node
1717 QQMLJS_DECLARE_AST_NODE(CaseClauses)
1719 CaseClauses(CaseClause *c):
1720 clause (c), next (this)
1723 CaseClauses(CaseClauses *previous, CaseClause *c):
1727 next = previous->next;
1728 previous->next = this;
1731 virtual void accept0(Visitor *visitor);
1733 virtual SourceLocation firstSourceLocation() const
1734 { return clause->firstSourceLocation(); }
1736 virtual SourceLocation lastSourceLocation() const
1737 { return next ? next->lastSourceLocation() : clause->lastSourceLocation(); }
1739 inline CaseClauses *finish ()
1741 CaseClauses *front = next;
1751 class QML_PARSER_EXPORT DefaultClause: public Node
1754 QQMLJS_DECLARE_AST_NODE(DefaultClause)
1756 DefaultClause(StatementList *slist):
1760 virtual void accept0(Visitor *visitor);
1762 virtual SourceLocation firstSourceLocation() const
1763 { return defaultToken; }
1765 virtual SourceLocation lastSourceLocation() const
1766 { return statements ? statements->lastSourceLocation() : colonToken; }
1769 StatementList *statements;
1770 SourceLocation defaultToken;
1771 SourceLocation colonToken;
1774 class QML_PARSER_EXPORT LabelledStatement: public Statement
1777 QQMLJS_DECLARE_AST_NODE(LabelledStatement)
1779 LabelledStatement(const QStringRef &l, Statement *stmt):
1780 label (l), statement (stmt)
1783 virtual void accept0(Visitor *visitor);
1785 virtual SourceLocation firstSourceLocation() const
1786 { return identifierToken; }
1788 virtual SourceLocation lastSourceLocation() const
1789 { return statement->lastSourceLocation(); }
1793 Statement *statement;
1794 SourceLocation identifierToken;
1795 SourceLocation colonToken;
1798 class QML_PARSER_EXPORT ThrowStatement: public Statement
1801 QQMLJS_DECLARE_AST_NODE(ThrowStatement)
1803 ThrowStatement(ExpressionNode *e):
1804 expression (e) { kind = K; }
1806 virtual void accept0(Visitor *visitor);
1808 virtual SourceLocation firstSourceLocation() const
1809 { return throwToken; }
1811 virtual SourceLocation lastSourceLocation() const
1812 { return semicolonToken; }
1815 ExpressionNode *expression;
1816 SourceLocation throwToken;
1817 SourceLocation semicolonToken;
1820 class QML_PARSER_EXPORT Catch: public Node
1823 QQMLJS_DECLARE_AST_NODE(Catch)
1825 Catch(const QStringRef &n, Block *stmt):
1826 name (n), statement (stmt)
1829 virtual void accept0(Visitor *visitor);
1831 virtual SourceLocation firstSourceLocation() const
1832 { return catchToken; }
1834 virtual SourceLocation lastSourceLocation() const
1835 { return statement->lastSourceLocation(); }
1840 SourceLocation catchToken;
1841 SourceLocation lparenToken;
1842 SourceLocation identifierToken;
1843 SourceLocation rparenToken;
1846 class QML_PARSER_EXPORT Finally: public Node
1849 QQMLJS_DECLARE_AST_NODE(Finally)
1851 Finally(Block *stmt):
1855 virtual void accept0(Visitor *visitor);
1857 virtual SourceLocation firstSourceLocation() const
1858 { return finallyToken; }
1860 virtual SourceLocation lastSourceLocation() const
1861 { return statement ? statement->lastSourceLocation() : finallyToken; }
1865 SourceLocation finallyToken;
1868 class QML_PARSER_EXPORT TryStatement: public Statement
1871 QQMLJS_DECLARE_AST_NODE(TryStatement)
1873 TryStatement(Statement *stmt, Catch *c, Finally *f):
1874 statement (stmt), catchExpression (c), finallyExpression (f)
1877 TryStatement(Statement *stmt, Finally *f):
1878 statement (stmt), catchExpression (0), finallyExpression (f)
1881 TryStatement(Statement *stmt, Catch *c):
1882 statement (stmt), catchExpression (c), finallyExpression (0)
1885 virtual void accept0(Visitor *visitor);
1887 virtual SourceLocation firstSourceLocation() const
1888 { return tryToken; }
1890 virtual SourceLocation lastSourceLocation() const
1892 if (finallyExpression)
1893 return finallyExpression->statement->rbraceToken;
1894 else if (catchExpression)
1895 return catchExpression->statement->rbraceToken;
1897 return statement->lastSourceLocation();
1901 Statement *statement;
1902 Catch *catchExpression;
1903 Finally *finallyExpression;
1904 SourceLocation tryToken;
1907 class QML_PARSER_EXPORT FunctionExpression: public ExpressionNode
1910 QQMLJS_DECLARE_AST_NODE(FunctionExpression)
1912 FunctionExpression(const QStringRef &n, FormalParameterList *f, FunctionBody *b):
1913 name (n), formals (f), body (b)
1916 virtual void accept0(Visitor *visitor);
1918 virtual SourceLocation firstSourceLocation() const
1919 { return functionToken; }
1921 virtual SourceLocation lastSourceLocation() const
1922 { return rbraceToken; }
1926 FormalParameterList *formals;
1928 SourceLocation functionToken;
1929 SourceLocation identifierToken;
1930 SourceLocation lparenToken;
1931 SourceLocation rparenToken;
1932 SourceLocation lbraceToken;
1933 SourceLocation rbraceToken;
1936 class QML_PARSER_EXPORT FunctionDeclaration: public FunctionExpression
1939 QQMLJS_DECLARE_AST_NODE(FunctionDeclaration)
1941 FunctionDeclaration(const QStringRef &n, FormalParameterList *f, FunctionBody *b):
1942 FunctionExpression(n, f, b)
1945 virtual void accept0(Visitor *visitor);
1948 class QML_PARSER_EXPORT FormalParameterList: public Node
1951 QQMLJS_DECLARE_AST_NODE(FormalParameterList)
1953 FormalParameterList(const QStringRef &n):
1954 name (n), next (this)
1957 FormalParameterList(FormalParameterList *previous, const QStringRef &n):
1961 next = previous->next;
1962 previous->next = this;
1965 virtual void accept0(Visitor *visitor);
1967 virtual SourceLocation firstSourceLocation() const
1968 { return identifierToken; }
1970 virtual SourceLocation lastSourceLocation() const
1971 { return next ? next->lastSourceLocation() : identifierToken; }
1973 inline FormalParameterList *finish ()
1975 FormalParameterList *front = next;
1982 FormalParameterList *next;
1983 SourceLocation commaToken;
1984 SourceLocation identifierToken;
1987 class QML_PARSER_EXPORT SourceElement: public Node
1990 QQMLJS_DECLARE_AST_NODE(SourceElement)
1992 inline SourceElement()
1996 class QML_PARSER_EXPORT SourceElements: public Node
1999 QQMLJS_DECLARE_AST_NODE(SourceElements)
2001 SourceElements(SourceElement *elt):
2002 element (elt), next (this)
2005 SourceElements(SourceElements *previous, SourceElement *elt):
2009 next = previous->next;
2010 previous->next = this;
2013 virtual void accept0(Visitor *visitor);
2015 virtual SourceLocation firstSourceLocation() const
2016 { return element->firstSourceLocation(); }
2018 virtual SourceLocation lastSourceLocation() const
2019 { return next ? next->lastSourceLocation() : element->lastSourceLocation(); }
2021 inline SourceElements *finish ()
2023 SourceElements *front = next;
2029 SourceElement *element;
2030 SourceElements *next;
2033 class QML_PARSER_EXPORT FunctionBody: public Node
2036 QQMLJS_DECLARE_AST_NODE(FunctionBody)
2038 FunctionBody(SourceElements *elts):
2042 virtual void accept0(Visitor *visitor);
2044 virtual SourceLocation firstSourceLocation() const
2045 { return elements ? elements->firstSourceLocation() : SourceLocation(); }
2047 virtual SourceLocation lastSourceLocation() const
2048 { return elements ? elements->lastSourceLocation() : SourceLocation(); }
2051 SourceElements *elements;
2054 class QML_PARSER_EXPORT Program: public Node
2057 QQMLJS_DECLARE_AST_NODE(Program)
2059 Program(SourceElements *elts):
2063 virtual void accept0(Visitor *visitor);
2065 virtual SourceLocation firstSourceLocation() const
2066 { return elements ? elements->firstSourceLocation() : SourceLocation(); }
2068 virtual SourceLocation lastSourceLocation() const
2069 { return elements ? elements->lastSourceLocation() : SourceLocation(); }
2072 SourceElements *elements;
2075 class QML_PARSER_EXPORT FunctionSourceElement: public SourceElement
2078 QQMLJS_DECLARE_AST_NODE(FunctionSourceElement)
2080 FunctionSourceElement(FunctionDeclaration *f):
2084 virtual void accept0(Visitor *visitor);
2086 virtual SourceLocation firstSourceLocation() const
2087 { return declaration->firstSourceLocation(); }
2089 virtual SourceLocation lastSourceLocation() const
2090 { return declaration->lastSourceLocation(); }
2093 FunctionDeclaration *declaration;
2096 class QML_PARSER_EXPORT StatementSourceElement: public SourceElement
2099 QQMLJS_DECLARE_AST_NODE(StatementSourceElement)
2101 StatementSourceElement(Statement *stmt):
2105 virtual void accept0(Visitor *visitor);
2107 virtual SourceLocation firstSourceLocation() const
2108 { return statement->firstSourceLocation(); }
2110 virtual SourceLocation lastSourceLocation() const
2111 { return statement->lastSourceLocation(); }
2114 Statement *statement;
2117 class QML_PARSER_EXPORT DebuggerStatement: public Statement
2120 QQMLJS_DECLARE_AST_NODE(DebuggerStatement)
2125 virtual void accept0(Visitor *visitor);
2127 virtual SourceLocation firstSourceLocation() const
2128 { return debuggerToken; }
2130 virtual SourceLocation lastSourceLocation() const
2131 { return semicolonToken; }
2134 SourceLocation debuggerToken;
2135 SourceLocation semicolonToken;
2138 class QML_PARSER_EXPORT UiQualifiedId: public Node
2141 QQMLJS_DECLARE_AST_NODE(UiQualifiedId)
2143 UiQualifiedId(const QStringRef &name)
2144 : next(this), name(name)
2147 UiQualifiedId(UiQualifiedId *previous, const QStringRef &name)
2151 next = previous->next;
2152 previous->next = this;
2155 UiQualifiedId *finish()
2157 UiQualifiedId *head = next;
2162 virtual void accept0(Visitor *visitor);
2164 virtual SourceLocation firstSourceLocation() const
2165 { return identifierToken; }
2167 virtual SourceLocation lastSourceLocation() const
2168 { return next ? next->lastSourceLocation() : identifierToken; }
2171 UiQualifiedId *next;
2173 SourceLocation identifierToken;
2176 class QML_PARSER_EXPORT UiImport: public Node
2179 QQMLJS_DECLARE_AST_NODE(UiImport)
2181 UiImport(const QStringRef &fileName)
2182 : fileName(fileName), importUri(0)
2185 UiImport(UiQualifiedId *uri)
2189 virtual void accept0(Visitor *visitor);
2191 virtual SourceLocation firstSourceLocation() const
2192 { return importToken; }
2194 virtual SourceLocation lastSourceLocation() const
2195 { return semicolonToken; }
2198 QStringRef fileName;
2199 UiQualifiedId *importUri;
2200 QStringRef importId;
2201 SourceLocation importToken;
2202 SourceLocation fileNameToken;
2203 SourceLocation versionToken;
2204 SourceLocation asToken;
2205 SourceLocation importIdToken;
2206 SourceLocation semicolonToken;
2209 class QML_PARSER_EXPORT UiImportList: public Node
2212 QQMLJS_DECLARE_AST_NODE(UiImportList)
2214 UiImportList(UiImport *import)
2219 UiImportList(UiImportList *previous, UiImport *import)
2223 next = previous->next;
2224 previous->next = this;
2227 UiImportList *finish()
2229 UiImportList *head = next;
2234 virtual void accept0(Visitor *visitor);
2236 virtual SourceLocation firstSourceLocation() const
2237 { return import->firstSourceLocation(); }
2239 virtual SourceLocation lastSourceLocation() const
2240 { return next ? next->lastSourceLocation() : import->lastSourceLocation(); }
2247 class QML_PARSER_EXPORT UiObjectMember: public Node
2250 virtual SourceLocation firstSourceLocation() const = 0;
2251 virtual SourceLocation lastSourceLocation() const = 0;
2253 virtual UiObjectMember *uiObjectMemberCast();
2256 class QML_PARSER_EXPORT UiObjectMemberList: public Node
2259 QQMLJS_DECLARE_AST_NODE(UiObjectMemberList)
2261 UiObjectMemberList(UiObjectMember *member)
2262 : next(this), member(member)
2265 UiObjectMemberList(UiObjectMemberList *previous, UiObjectMember *member)
2269 next = previous->next;
2270 previous->next = this;
2273 virtual void accept0(Visitor *visitor);
2275 virtual SourceLocation firstSourceLocation() const
2276 { return member->firstSourceLocation(); }
2278 virtual SourceLocation lastSourceLocation() const
2279 { return next ? next->lastSourceLocation() : member->lastSourceLocation(); }
2281 UiObjectMemberList *finish()
2283 UiObjectMemberList *head = next;
2289 UiObjectMemberList *next;
2290 UiObjectMember *member;
2293 class QML_PARSER_EXPORT UiProgram: public Node
2296 QQMLJS_DECLARE_AST_NODE(UiProgram)
2298 UiProgram(UiImportList *imports, UiObjectMemberList *members)
2299 : imports(imports), members(members)
2302 virtual void accept0(Visitor *visitor);
2304 virtual SourceLocation firstSourceLocation() const
2307 return imports->firstSourceLocation();
2309 return members->firstSourceLocation();
2310 return SourceLocation();
2313 virtual SourceLocation lastSourceLocation() const
2316 return members->lastSourceLocation();
2318 return imports->lastSourceLocation();
2319 return SourceLocation();
2323 UiImportList *imports;
2324 UiObjectMemberList *members;
2327 class QML_PARSER_EXPORT UiArrayMemberList: public Node
2330 QQMLJS_DECLARE_AST_NODE(UiArrayMemberList)
2332 UiArrayMemberList(UiObjectMember *member)
2333 : next(this), member(member)
2336 UiArrayMemberList(UiArrayMemberList *previous, UiObjectMember *member)
2340 next = previous->next;
2341 previous->next = this;
2344 virtual void accept0(Visitor *visitor);
2346 virtual SourceLocation firstSourceLocation() const
2347 { return member->firstSourceLocation(); }
2349 virtual SourceLocation lastSourceLocation() const
2350 { return next ? next->lastSourceLocation() : member->lastSourceLocation(); }
2352 UiArrayMemberList *finish()
2354 UiArrayMemberList *head = next;
2360 UiArrayMemberList *next;
2361 UiObjectMember *member;
2362 SourceLocation commaToken;
2365 class QML_PARSER_EXPORT UiObjectInitializer: public Node
2368 QQMLJS_DECLARE_AST_NODE(UiObjectInitializer)
2370 UiObjectInitializer(UiObjectMemberList *members)
2374 virtual void accept0(Visitor *visitor);
2376 virtual SourceLocation firstSourceLocation() const
2377 { return lbraceToken; }
2379 virtual SourceLocation lastSourceLocation() const
2380 { return rbraceToken; }
2383 SourceLocation lbraceToken;
2384 UiObjectMemberList *members;
2385 SourceLocation rbraceToken;
2388 class QML_PARSER_EXPORT UiParameterList: public Node
2391 QQMLJS_DECLARE_AST_NODE(UiParameterList)
2393 UiParameterList(const QStringRef &t, const QStringRef &n):
2394 type (t), name (n), next (this)
2397 UiParameterList(UiParameterList *previous, const QStringRef &t, const QStringRef &n):
2401 next = previous->next;
2402 previous->next = this;
2405 virtual void accept0(Visitor *) {}
2407 virtual SourceLocation firstSourceLocation() const
2408 { return propertyTypeToken; }
2410 virtual SourceLocation lastSourceLocation() const
2411 { return next ? next->lastSourceLocation() : identifierToken; }
2413 inline UiParameterList *finish ()
2415 UiParameterList *front = next;
2423 UiParameterList *next;
2424 SourceLocation commaToken;
2425 SourceLocation propertyTypeToken;
2426 SourceLocation identifierToken;
2429 class QML_PARSER_EXPORT UiPublicMember: public UiObjectMember
2432 QQMLJS_DECLARE_AST_NODE(UiPublicMember)
2434 UiPublicMember(const QStringRef &memberType,
2435 const QStringRef &name)
2436 : type(Property), memberType(memberType), name(name), statement(0), binding(0), isDefaultMember(false), isReadonlyMember(false), parameters(0)
2439 UiPublicMember(const QStringRef &memberType,
2440 const QStringRef &name,
2441 Statement *statement)
2442 : type(Property), memberType(memberType), name(name), statement(statement), binding(0), isDefaultMember(false), isReadonlyMember(false), parameters(0)
2445 virtual void accept0(Visitor *visitor);
2447 virtual SourceLocation firstSourceLocation() const
2449 if (defaultToken.isValid())
2450 return defaultToken;
2451 else if (readonlyToken.isValid())
2452 return readonlyToken;
2454 return propertyToken;
2457 virtual SourceLocation lastSourceLocation() const
2460 return binding->lastSourceLocation();
2462 return statement->lastSourceLocation();
2464 return semicolonToken;
2468 enum { Signal, Property } type;
2469 QStringRef typeModifier;
2470 QStringRef memberType;
2472 Statement *statement; // initialized with a JS expression
2473 UiObjectMember *binding; // initialized with a QML object or array.
2474 bool isDefaultMember;
2475 bool isReadonlyMember;
2476 UiParameterList *parameters;
2477 SourceLocation defaultToken;
2478 SourceLocation readonlyToken;
2479 SourceLocation propertyToken;
2480 SourceLocation typeModifierToken;
2481 SourceLocation typeToken;
2482 SourceLocation identifierToken;
2483 SourceLocation colonToken;
2484 SourceLocation semicolonToken;
2487 class QML_PARSER_EXPORT UiObjectDefinition: public UiObjectMember
2490 QQMLJS_DECLARE_AST_NODE(UiObjectDefinition)
2492 UiObjectDefinition(UiQualifiedId *qualifiedTypeNameId,
2493 UiObjectInitializer *initializer)
2494 : qualifiedTypeNameId(qualifiedTypeNameId), initializer(initializer)
2497 virtual void accept0(Visitor *visitor);
2499 virtual SourceLocation firstSourceLocation() const
2500 { return qualifiedTypeNameId->identifierToken; }
2502 virtual SourceLocation lastSourceLocation() const
2503 { return initializer->rbraceToken; }
2506 UiQualifiedId *qualifiedTypeNameId;
2507 UiObjectInitializer *initializer;
2510 class QML_PARSER_EXPORT UiSourceElement: public UiObjectMember
2513 QQMLJS_DECLARE_AST_NODE(UiSourceElement)
2515 UiSourceElement(Node *sourceElement)
2516 : sourceElement(sourceElement)
2519 virtual SourceLocation firstSourceLocation() const
2521 if (FunctionDeclaration *funDecl = cast<FunctionDeclaration *>(sourceElement))
2522 return funDecl->firstSourceLocation();
2523 else if (VariableStatement *varStmt = cast<VariableStatement *>(sourceElement))
2524 return varStmt->firstSourceLocation();
2526 return SourceLocation();
2529 virtual SourceLocation lastSourceLocation() const
2531 if (FunctionDeclaration *funDecl = cast<FunctionDeclaration *>(sourceElement))
2532 return funDecl->lastSourceLocation();
2533 else if (VariableStatement *varStmt = cast<VariableStatement *>(sourceElement))
2534 return varStmt->lastSourceLocation();
2536 return SourceLocation();
2539 virtual void accept0(Visitor *visitor);
2543 Node *sourceElement;
2546 class QML_PARSER_EXPORT UiObjectBinding: public UiObjectMember
2549 QQMLJS_DECLARE_AST_NODE(UiObjectBinding)
2551 UiObjectBinding(UiQualifiedId *qualifiedId,
2552 UiQualifiedId *qualifiedTypeNameId,
2553 UiObjectInitializer *initializer)
2554 : qualifiedId(qualifiedId),
2555 qualifiedTypeNameId(qualifiedTypeNameId),
2556 initializer(initializer),
2560 virtual SourceLocation firstSourceLocation() const
2562 if (hasOnToken && qualifiedTypeNameId)
2563 return qualifiedTypeNameId->identifierToken;
2565 return qualifiedId->identifierToken;
2568 virtual SourceLocation lastSourceLocation() const
2569 { return initializer->rbraceToken; }
2571 virtual void accept0(Visitor *visitor);
2575 UiQualifiedId *qualifiedId;
2576 UiQualifiedId *qualifiedTypeNameId;
2577 UiObjectInitializer *initializer;
2578 SourceLocation colonToken;
2582 class QML_PARSER_EXPORT UiScriptBinding: public UiObjectMember
2585 QQMLJS_DECLARE_AST_NODE(UiScriptBinding)
2587 UiScriptBinding(UiQualifiedId *qualifiedId,
2588 Statement *statement)
2589 : qualifiedId(qualifiedId),
2590 statement(statement)
2593 virtual SourceLocation firstSourceLocation() const
2594 { return qualifiedId->identifierToken; }
2596 virtual SourceLocation lastSourceLocation() const
2597 { return statement->lastSourceLocation(); }
2599 virtual void accept0(Visitor *visitor);
2602 UiQualifiedId *qualifiedId;
2603 Statement *statement;
2604 SourceLocation colonToken;
2607 class QML_PARSER_EXPORT UiArrayBinding: public UiObjectMember
2610 QQMLJS_DECLARE_AST_NODE(UiArrayBinding)
2612 UiArrayBinding(UiQualifiedId *qualifiedId,
2613 UiArrayMemberList *members)
2614 : qualifiedId(qualifiedId),
2618 virtual SourceLocation firstSourceLocation() const
2619 { return qualifiedId->identifierToken; }
2621 virtual SourceLocation lastSourceLocation() const
2622 { return rbracketToken; }
2624 virtual void accept0(Visitor *visitor);
2627 UiQualifiedId *qualifiedId;
2628 UiArrayMemberList *members;
2629 SourceLocation colonToken;
2630 SourceLocation lbracketToken;
2631 SourceLocation rbracketToken;
2634 } } // namespace AST
2638 QT_QML_END_NAMESPACE