1 /**************************************************************************
3 ** This file is part of Qt Creator
5 ** Copyright (c) 2011 Nokia Corporation and/or its subsidiary(-ies).
7 ** Contact: Nokia Corporation (info@qt.nokia.com)
9 ** GNU Lesser General Public License Usage
11 ** This file may be used under the terms of the GNU Lesser General Public
12 ** License version 2.1 as published by the Free Software Foundation and
13 ** appearing in the file LICENSE.LGPL included in the packaging of this file.
14 ** Please review the following information to ensure the GNU Lesser General
15 ** Public License version 2.1 requirements will be met:
16 ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
18 ** In addition, as a special exception, Nokia gives you certain additional
19 ** rights. These rights are described in the Nokia Qt LGPL Exception
20 ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
24 ** Alternatively, this file may be used in accordance with the terms and
25 ** conditions contained in a signed written agreement between you and Nokia.
27 ** If you have questions regarding the use of this file, please contact
28 ** Nokia at qt-info@nokia.com.
30 **************************************************************************/
39 // This file is not part of the Qt API. It exists purely as an
40 // implementation detail. This header file may change from version to
41 // version without notice, or even be removed.
46 #include "qmljsastvisitor_p.h"
47 #include "qmljsglobal_p.h"
49 #include <QtCore/QString>
51 QT_QML_BEGIN_NAMESPACE
53 #define QMLJS_DECLARE_AST_NODE(name) \
54 enum { K = Kind_##name };
56 namespace QSOperator // ### rename
97 } // namespace QSOperator
103 template <typename _T1, typename _T2>
106 if (ast && ast->kind == static_cast<_T1>(0)->K)
107 return static_cast<_T1>(ast);
112 class QML_PARSER_EXPORT Node
120 Kind_ArrayMemberExpression,
121 Kind_BinaryExpression,
129 Kind_ConditionalExpression,
130 Kind_ContinueStatement,
131 Kind_DebuggerStatement,
133 Kind_DeleteExpression,
134 Kind_DoWhileStatement,
139 Kind_ExpressionStatement,
141 Kind_FieldMemberExpression,
143 Kind_ForEachStatement,
145 Kind_FormalParameterList,
147 Kind_FunctionDeclaration,
148 Kind_FunctionExpression,
149 Kind_FunctionSourceElement,
150 Kind_IdentifierExpression,
151 Kind_IdentifierPropertyName,
153 Kind_LabelledStatement,
154 Kind_LocalForEachStatement,
155 Kind_LocalForStatement,
157 Kind_NewMemberExpression,
161 Kind_NumericLiteralPropertyName,
163 Kind_PostDecrementExpression,
164 Kind_PostIncrementExpression,
165 Kind_PreDecrementExpression,
166 Kind_PreIncrementExpression,
169 Kind_PropertyNameAndValueList,
171 Kind_ReturnStatement,
175 Kind_StatementSourceElement,
177 Kind_StringLiteralPropertyName,
178 Kind_SwitchStatement,
181 Kind_TildeExpression,
184 Kind_TypeOfExpression,
185 Kind_UnaryMinusExpression,
186 Kind_UnaryPlusExpression,
187 Kind_VariableDeclaration,
188 Kind_VariableDeclarationList,
189 Kind_VariableStatement,
193 Kind_NestedExpression,
198 Kind_UiObjectBinding,
199 Kind_UiObjectDefinition,
200 Kind_UiObjectInitializer,
201 Kind_UiObjectMemberList,
202 Kind_UiArrayMemberList,
204 Kind_UiParameterList,
207 Kind_UiScriptBinding,
208 Kind_UiSourceElement,
215 : kind(Kind_Undefined) {}
217 // NOTE: node destructors are never called,
218 // instead we block free the memory
219 // (see the NodePool class)
222 virtual ExpressionNode *expressionCast();
223 virtual BinaryExpression *binaryExpressionCast();
224 virtual Statement *statementCast();
225 virtual UiObjectMember *uiObjectMemberCast();
227 void accept(Visitor *visitor);
228 static void accept(Node *node, Visitor *visitor);
230 inline static void acceptChild(Node *node, Visitor *visitor)
231 { return accept(node, visitor); } // ### remove
233 virtual void accept0(Visitor *visitor) = 0;
239 class QML_PARSER_EXPORT ExpressionNode: public Node
244 virtual ExpressionNode *expressionCast();
246 virtual SourceLocation firstSourceLocation() const = 0;
247 virtual SourceLocation lastSourceLocation() const = 0;
250 class QML_PARSER_EXPORT Statement: public Node
255 virtual Statement *statementCast();
257 virtual SourceLocation firstSourceLocation() const = 0;
258 virtual SourceLocation lastSourceLocation() const = 0;
261 class QML_PARSER_EXPORT UiFormal: public Node
264 QMLJS_DECLARE_AST_NODE(UiFormal)
266 UiFormal(NameId *name, NameId *alias = 0)
267 : name(name), alias(alias)
270 virtual SourceLocation firstSourceLocation() const
271 { return SourceLocation(); }
273 virtual SourceLocation lastSourceLocation() const
274 { return SourceLocation(); }
276 virtual void accept0(Visitor *visitor);
281 SourceLocation identifierToken;
282 SourceLocation asToken;
283 SourceLocation aliasToken;
286 class QML_PARSER_EXPORT UiFormalList: public Node
289 QMLJS_DECLARE_AST_NODE(UiFormalList)
291 UiFormalList(UiFormal *formal)
292 : formal(formal), next(this) {}
294 UiFormalList(UiFormalList *previous, UiFormal *formal)
297 next = previous->next;
298 previous->next = this;
301 UiFormalList *finish()
303 UiFormalList *head = next;
308 virtual SourceLocation firstSourceLocation() const
309 { return SourceLocation(); }
311 virtual SourceLocation lastSourceLocation() const
312 { return SourceLocation(); }
314 virtual void accept0(Visitor *visitor);
321 class QML_PARSER_EXPORT UiSignature: public Node
324 QMLJS_DECLARE_AST_NODE(UiSignature)
326 UiSignature(UiFormalList *formals = 0)
330 virtual SourceLocation firstSourceLocation() const
331 { return SourceLocation(); }
333 virtual SourceLocation lastSourceLocation() const
334 { return SourceLocation(); }
336 virtual void accept0(Visitor *visitor);
339 SourceLocation lparenToken;
340 UiFormalList *formals;
341 SourceLocation rparenToken;
344 class QML_PARSER_EXPORT NestedExpression: public ExpressionNode
347 QMLJS_DECLARE_AST_NODE(NestedExpression)
349 NestedExpression(ExpressionNode *expression)
350 : expression(expression)
353 virtual void accept0(Visitor *visitor);
355 virtual SourceLocation firstSourceLocation() const
356 { return lparenToken; }
358 virtual SourceLocation lastSourceLocation() const
359 { return rparenToken; }
362 ExpressionNode *expression;
363 SourceLocation lparenToken;
364 SourceLocation rparenToken;
367 class QML_PARSER_EXPORT ThisExpression: public ExpressionNode
370 QMLJS_DECLARE_AST_NODE(ThisExpression)
372 ThisExpression() { kind = K; }
374 virtual void accept0(Visitor *visitor);
376 virtual SourceLocation firstSourceLocation() const
377 { return thisToken; }
379 virtual SourceLocation lastSourceLocation() const
380 { return thisToken; }
383 SourceLocation thisToken;
386 class QML_PARSER_EXPORT IdentifierExpression: public ExpressionNode
389 QMLJS_DECLARE_AST_NODE(IdentifierExpression)
391 IdentifierExpression(NameId *n):
392 name (n) { kind = K; }
394 virtual void accept0(Visitor *visitor);
396 virtual SourceLocation firstSourceLocation() const
397 { return identifierToken; }
399 virtual SourceLocation lastSourceLocation() const
400 { return identifierToken; }
404 SourceLocation identifierToken;
407 class QML_PARSER_EXPORT NullExpression: public ExpressionNode
410 QMLJS_DECLARE_AST_NODE(NullExpression)
412 NullExpression() { kind = K; }
414 virtual void accept0(Visitor *visitor);
416 virtual SourceLocation firstSourceLocation() const
417 { return nullToken; }
419 virtual SourceLocation lastSourceLocation() const
420 { return nullToken; }
423 SourceLocation nullToken;
426 class QML_PARSER_EXPORT TrueLiteral: public ExpressionNode
429 QMLJS_DECLARE_AST_NODE(TrueLiteral)
431 TrueLiteral() { kind = K; }
433 virtual void accept0(Visitor *visitor);
435 virtual SourceLocation firstSourceLocation() const
436 { return trueToken; }
438 virtual SourceLocation lastSourceLocation() const
439 { return trueToken; }
442 SourceLocation trueToken;
445 class QML_PARSER_EXPORT FalseLiteral: public ExpressionNode
448 QMLJS_DECLARE_AST_NODE(FalseLiteral)
450 FalseLiteral() { kind = K; }
452 virtual void accept0(Visitor *visitor);
454 virtual SourceLocation firstSourceLocation() const
455 { return falseToken; }
457 virtual SourceLocation lastSourceLocation() const
458 { return falseToken; }
461 SourceLocation falseToken;
464 class QML_PARSER_EXPORT NumericLiteral: public ExpressionNode
467 QMLJS_DECLARE_AST_NODE(NumericLiteral)
469 NumericLiteral(double v):
470 value(v) { kind = K; }
472 virtual void accept0(Visitor *visitor);
474 virtual SourceLocation firstSourceLocation() const
475 { return literalToken; }
477 virtual SourceLocation lastSourceLocation() const
478 { return literalToken; }
482 SourceLocation literalToken;
485 class QML_PARSER_EXPORT StringLiteral: public ExpressionNode
488 QMLJS_DECLARE_AST_NODE(StringLiteral)
490 StringLiteral(NameId *v):
491 value (v) { kind = K; }
493 virtual void accept0(Visitor *visitor);
495 virtual SourceLocation firstSourceLocation() const
496 { return literalToken; }
498 virtual SourceLocation lastSourceLocation() const
499 { return literalToken; }
503 SourceLocation literalToken;
506 class QML_PARSER_EXPORT RegExpLiteral: public ExpressionNode
509 QMLJS_DECLARE_AST_NODE(RegExpLiteral)
511 RegExpLiteral(NameId *p, int f):
512 pattern (p), flags (f) { kind = K; }
514 virtual void accept0(Visitor *visitor);
516 virtual SourceLocation firstSourceLocation() const
517 { return literalToken; }
519 virtual SourceLocation lastSourceLocation() const
520 { return literalToken; }
525 SourceLocation literalToken;
528 class QML_PARSER_EXPORT ArrayLiteral: public ExpressionNode
531 QMLJS_DECLARE_AST_NODE(ArrayLiteral)
533 ArrayLiteral(Elision *e):
534 elements (0), elision (e)
537 ArrayLiteral(ElementList *elts):
538 elements (elts), elision (0)
541 ArrayLiteral(ElementList *elts, Elision *e):
542 elements (elts), elision (e)
545 virtual void accept0(Visitor *visitor);
547 virtual SourceLocation firstSourceLocation() const
548 { return lbracketToken; }
550 virtual SourceLocation lastSourceLocation() const
551 { return rbracketToken; }
554 ElementList *elements;
556 SourceLocation lbracketToken;
557 SourceLocation commaToken;
558 SourceLocation rbracketToken;
561 class QML_PARSER_EXPORT ObjectLiteral: public ExpressionNode
564 QMLJS_DECLARE_AST_NODE(ObjectLiteral)
567 properties (0) { kind = K; }
569 ObjectLiteral(PropertyNameAndValueList *plist):
570 properties (plist) { kind = K; }
572 virtual void accept0(Visitor *visitor);
574 virtual SourceLocation firstSourceLocation() const
575 { return lbraceToken; }
577 virtual SourceLocation lastSourceLocation() const
578 { return rbraceToken; }
581 PropertyNameAndValueList *properties;
582 SourceLocation lbraceToken;
583 SourceLocation rbraceToken;
586 class QML_PARSER_EXPORT ElementList: public Node
589 QMLJS_DECLARE_AST_NODE(ElementList)
591 ElementList(Elision *e, ExpressionNode *expr):
592 elision (e), expression (expr), next (this)
595 ElementList(ElementList *previous, Elision *e, ExpressionNode *expr):
596 elision (e), expression (expr)
599 next = previous->next;
600 previous->next = this;
603 inline ElementList *finish ()
605 ElementList *front = next;
610 virtual void accept0(Visitor *visitor);
614 ExpressionNode *expression;
616 SourceLocation commaToken;
619 class QML_PARSER_EXPORT Elision: public Node
622 QMLJS_DECLARE_AST_NODE(Elision)
625 next (this) { kind = K; }
627 Elision(Elision *previous)
630 next = previous->next;
631 previous->next = this;
634 virtual void accept0(Visitor *visitor);
636 inline Elision *finish ()
638 Elision *front = next;
645 SourceLocation commaToken;
648 class QML_PARSER_EXPORT PropertyNameAndValueList: public Node
651 QMLJS_DECLARE_AST_NODE(PropertyNameAndValueList)
653 PropertyNameAndValueList(PropertyName *n, ExpressionNode *v):
654 name (n), value (v), next (this)
657 PropertyNameAndValueList(PropertyNameAndValueList *previous, PropertyName *n, ExpressionNode *v):
661 next = previous->next;
662 previous->next = this;
665 virtual void accept0(Visitor *visitor);
667 inline PropertyNameAndValueList *finish ()
669 PropertyNameAndValueList *front = next;
676 ExpressionNode *value;
677 PropertyNameAndValueList *next;
678 SourceLocation colonToken;
679 SourceLocation commaToken;
682 class QML_PARSER_EXPORT PropertyName: public Node
685 QMLJS_DECLARE_AST_NODE(PropertyName)
687 PropertyName() { kind = K; }
690 SourceLocation propertyNameToken;
693 class QML_PARSER_EXPORT IdentifierPropertyName: public PropertyName
696 QMLJS_DECLARE_AST_NODE(IdentifierPropertyName)
698 IdentifierPropertyName(NameId *n):
701 virtual void accept0(Visitor *visitor);
707 class QML_PARSER_EXPORT StringLiteralPropertyName: public PropertyName
710 QMLJS_DECLARE_AST_NODE(StringLiteralPropertyName)
712 StringLiteralPropertyName(NameId *n):
715 virtual void accept0(Visitor *visitor);
721 class QML_PARSER_EXPORT NumericLiteralPropertyName: public PropertyName
724 QMLJS_DECLARE_AST_NODE(NumericLiteralPropertyName)
726 NumericLiteralPropertyName(double n):
729 virtual void accept0(Visitor *visitor);
735 class QML_PARSER_EXPORT ArrayMemberExpression: public ExpressionNode
738 QMLJS_DECLARE_AST_NODE(ArrayMemberExpression)
740 ArrayMemberExpression(ExpressionNode *b, ExpressionNode *e):
741 base (b), expression (e)
744 virtual void accept0(Visitor *visitor);
746 virtual SourceLocation firstSourceLocation() const
747 { return base->firstSourceLocation(); }
749 virtual SourceLocation lastSourceLocation() const
750 { return rbracketToken; }
753 ExpressionNode *base;
754 ExpressionNode *expression;
755 SourceLocation lbracketToken;
756 SourceLocation rbracketToken;
759 class QML_PARSER_EXPORT FieldMemberExpression: public ExpressionNode
762 QMLJS_DECLARE_AST_NODE(FieldMemberExpression)
764 FieldMemberExpression(ExpressionNode *b, NameId *n):
768 virtual void accept0(Visitor *visitor);
770 virtual SourceLocation firstSourceLocation() const
771 { return base->firstSourceLocation(); }
773 virtual SourceLocation lastSourceLocation() const
774 { return identifierToken; }
777 ExpressionNode *base;
779 SourceLocation dotToken;
780 SourceLocation identifierToken;
783 class QML_PARSER_EXPORT NewMemberExpression: public ExpressionNode
786 QMLJS_DECLARE_AST_NODE(NewMemberExpression)
788 NewMemberExpression(ExpressionNode *b, ArgumentList *a):
789 base (b), arguments (a)
792 virtual void accept0(Visitor *visitor);
794 virtual SourceLocation firstSourceLocation() const
797 virtual SourceLocation lastSourceLocation() const
798 { return rparenToken; }
801 ExpressionNode *base;
802 ArgumentList *arguments;
803 SourceLocation newToken;
804 SourceLocation lparenToken;
805 SourceLocation rparenToken;
808 class QML_PARSER_EXPORT NewExpression: public ExpressionNode
811 QMLJS_DECLARE_AST_NODE(NewExpression)
813 NewExpression(ExpressionNode *e):
814 expression (e) { kind = K; }
816 virtual void accept0(Visitor *visitor);
818 virtual SourceLocation firstSourceLocation() const
821 virtual SourceLocation lastSourceLocation() const
822 { return expression->lastSourceLocation(); }
825 ExpressionNode *expression;
826 SourceLocation newToken;
829 class QML_PARSER_EXPORT CallExpression: public ExpressionNode
832 QMLJS_DECLARE_AST_NODE(CallExpression)
834 CallExpression(ExpressionNode *b, ArgumentList *a):
835 base (b), arguments (a)
838 virtual void accept0(Visitor *visitor);
840 virtual SourceLocation firstSourceLocation() const
841 { return base->firstSourceLocation(); }
843 virtual SourceLocation lastSourceLocation() const
844 { return rparenToken; }
847 ExpressionNode *base;
848 ArgumentList *arguments;
849 SourceLocation lparenToken;
850 SourceLocation rparenToken;
853 class QML_PARSER_EXPORT ArgumentList: public Node
856 QMLJS_DECLARE_AST_NODE(ArgumentList)
858 ArgumentList(ExpressionNode *e):
859 expression (e), next (this)
862 ArgumentList(ArgumentList *previous, ExpressionNode *e):
866 next = previous->next;
867 previous->next = this;
870 virtual void accept0(Visitor *visitor);
872 inline ArgumentList *finish ()
874 ArgumentList *front = next;
880 ExpressionNode *expression;
882 SourceLocation commaToken;
885 class QML_PARSER_EXPORT PostIncrementExpression: public ExpressionNode
888 QMLJS_DECLARE_AST_NODE(PostIncrementExpression)
890 PostIncrementExpression(ExpressionNode *b):
891 base (b) { kind = K; }
893 virtual void accept0(Visitor *visitor);
895 virtual SourceLocation firstSourceLocation() const
896 { return base->firstSourceLocation(); }
898 virtual SourceLocation lastSourceLocation() const
899 { return incrementToken; }
902 ExpressionNode *base;
903 SourceLocation incrementToken;
906 class QML_PARSER_EXPORT PostDecrementExpression: public ExpressionNode
909 QMLJS_DECLARE_AST_NODE(PostDecrementExpression)
911 PostDecrementExpression(ExpressionNode *b):
912 base (b) { kind = K; }
914 virtual void accept0(Visitor *visitor);
916 virtual SourceLocation firstSourceLocation() const
917 { return base->firstSourceLocation(); }
919 virtual SourceLocation lastSourceLocation() const
920 { return decrementToken; }
923 ExpressionNode *base;
924 SourceLocation decrementToken;
927 class QML_PARSER_EXPORT DeleteExpression: public ExpressionNode
930 QMLJS_DECLARE_AST_NODE(DeleteExpression)
932 DeleteExpression(ExpressionNode *e):
933 expression (e) { kind = K; }
935 virtual void accept0(Visitor *visitor);
937 virtual SourceLocation firstSourceLocation() const
938 { return deleteToken; }
940 virtual SourceLocation lastSourceLocation() const
941 { return expression->lastSourceLocation(); }
944 ExpressionNode *expression;
945 SourceLocation deleteToken;
948 class QML_PARSER_EXPORT VoidExpression: public ExpressionNode
951 QMLJS_DECLARE_AST_NODE(VoidExpression)
953 VoidExpression(ExpressionNode *e):
954 expression (e) { kind = K; }
956 virtual void accept0(Visitor *visitor);
958 virtual SourceLocation firstSourceLocation() const
959 { return voidToken; }
961 virtual SourceLocation lastSourceLocation() const
962 { return expression->lastSourceLocation(); }
965 ExpressionNode *expression;
966 SourceLocation voidToken;
969 class QML_PARSER_EXPORT TypeOfExpression: public ExpressionNode
972 QMLJS_DECLARE_AST_NODE(TypeOfExpression)
974 TypeOfExpression(ExpressionNode *e):
975 expression (e) { kind = K; }
977 virtual void accept0(Visitor *visitor);
979 virtual SourceLocation firstSourceLocation() const
980 { return typeofToken; }
982 virtual SourceLocation lastSourceLocation() const
983 { return expression->lastSourceLocation(); }
986 ExpressionNode *expression;
987 SourceLocation typeofToken;
990 class QML_PARSER_EXPORT PreIncrementExpression: public ExpressionNode
993 QMLJS_DECLARE_AST_NODE(PreIncrementExpression)
995 PreIncrementExpression(ExpressionNode *e):
996 expression (e) { kind = K; }
998 virtual void accept0(Visitor *visitor);
1000 virtual SourceLocation firstSourceLocation() const
1001 { return incrementToken; }
1003 virtual SourceLocation lastSourceLocation() const
1004 { return expression->lastSourceLocation(); }
1007 ExpressionNode *expression;
1008 SourceLocation incrementToken;
1011 class QML_PARSER_EXPORT PreDecrementExpression: public ExpressionNode
1014 QMLJS_DECLARE_AST_NODE(PreDecrementExpression)
1016 PreDecrementExpression(ExpressionNode *e):
1017 expression (e) { kind = K; }
1019 virtual void accept0(Visitor *visitor);
1021 virtual SourceLocation firstSourceLocation() const
1022 { return decrementToken; }
1024 virtual SourceLocation lastSourceLocation() const
1025 { return expression->lastSourceLocation(); }
1028 ExpressionNode *expression;
1029 SourceLocation decrementToken;
1032 class QML_PARSER_EXPORT UnaryPlusExpression: public ExpressionNode
1035 QMLJS_DECLARE_AST_NODE(UnaryPlusExpression)
1037 UnaryPlusExpression(ExpressionNode *e):
1038 expression (e) { kind = K; }
1040 virtual void accept0(Visitor *visitor);
1042 virtual SourceLocation firstSourceLocation() const
1043 { return plusToken; }
1045 virtual SourceLocation lastSourceLocation() const
1046 { return expression->lastSourceLocation(); }
1049 ExpressionNode *expression;
1050 SourceLocation plusToken;
1053 class QML_PARSER_EXPORT UnaryMinusExpression: public ExpressionNode
1056 QMLJS_DECLARE_AST_NODE(UnaryMinusExpression)
1058 UnaryMinusExpression(ExpressionNode *e):
1059 expression (e) { kind = K; }
1061 virtual void accept0(Visitor *visitor);
1063 virtual SourceLocation firstSourceLocation() const
1064 { return minusToken; }
1066 virtual SourceLocation lastSourceLocation() const
1067 { return expression->lastSourceLocation(); }
1070 ExpressionNode *expression;
1071 SourceLocation minusToken;
1074 class QML_PARSER_EXPORT TildeExpression: public ExpressionNode
1077 QMLJS_DECLARE_AST_NODE(TildeExpression)
1079 TildeExpression(ExpressionNode *e):
1080 expression (e) { kind = K; }
1082 virtual void accept0(Visitor *visitor);
1084 virtual SourceLocation firstSourceLocation() const
1085 { return tildeToken; }
1087 virtual SourceLocation lastSourceLocation() const
1088 { return expression->lastSourceLocation(); }
1091 ExpressionNode *expression;
1092 SourceLocation tildeToken;
1095 class QML_PARSER_EXPORT NotExpression: public ExpressionNode
1098 QMLJS_DECLARE_AST_NODE(NotExpression)
1100 NotExpression(ExpressionNode *e):
1101 expression (e) { kind = K; }
1103 virtual void accept0(Visitor *visitor);
1105 virtual SourceLocation firstSourceLocation() const
1106 { return notToken; }
1108 virtual SourceLocation lastSourceLocation() const
1109 { return expression->lastSourceLocation(); }
1112 ExpressionNode *expression;
1113 SourceLocation notToken;
1116 class QML_PARSER_EXPORT BinaryExpression: public ExpressionNode
1119 QMLJS_DECLARE_AST_NODE(BinaryExpression)
1121 BinaryExpression(ExpressionNode *l, int o, ExpressionNode *r):
1122 left (l), op (o), right (r)
1125 virtual BinaryExpression *binaryExpressionCast();
1127 virtual void accept0(Visitor *visitor);
1129 virtual SourceLocation firstSourceLocation() const
1130 { return left->firstSourceLocation(); }
1132 virtual SourceLocation lastSourceLocation() const
1133 { return right->lastSourceLocation(); }
1136 ExpressionNode *left;
1138 ExpressionNode *right;
1139 SourceLocation operatorToken;
1142 class QML_PARSER_EXPORT ConditionalExpression: public ExpressionNode
1145 QMLJS_DECLARE_AST_NODE(ConditionalExpression)
1147 ConditionalExpression(ExpressionNode *e, ExpressionNode *t, ExpressionNode *f):
1148 expression (e), ok (t), ko (f)
1151 virtual void accept0(Visitor *visitor);
1153 virtual SourceLocation firstSourceLocation() const
1154 { return expression->firstSourceLocation(); }
1156 virtual SourceLocation lastSourceLocation() const
1157 { return ko->lastSourceLocation(); }
1160 ExpressionNode *expression;
1163 SourceLocation questionToken;
1164 SourceLocation colonToken;
1167 class QML_PARSER_EXPORT Expression: public ExpressionNode // ### rename
1170 QMLJS_DECLARE_AST_NODE(Expression)
1172 Expression(ExpressionNode *l, ExpressionNode *r):
1173 left (l), right (r) { kind = K; }
1175 virtual void accept0(Visitor *visitor);
1177 virtual SourceLocation firstSourceLocation() const
1178 { return left->firstSourceLocation(); }
1180 virtual SourceLocation lastSourceLocation() const
1181 { return right->lastSourceLocation(); }
1184 ExpressionNode *left;
1185 ExpressionNode *right;
1186 SourceLocation commaToken;
1189 class QML_PARSER_EXPORT Block: public Statement
1192 QMLJS_DECLARE_AST_NODE(Block)
1194 Block(StatementList *slist):
1195 statements (slist) { kind = K; }
1197 virtual void accept0(Visitor *visitor);
1199 virtual SourceLocation firstSourceLocation() const
1200 { return lbraceToken; }
1202 virtual SourceLocation lastSourceLocation() const
1203 { return rbraceToken; }
1206 StatementList *statements;
1207 SourceLocation lbraceToken;
1208 SourceLocation rbraceToken;
1211 class QML_PARSER_EXPORT StatementList: public Node
1214 QMLJS_DECLARE_AST_NODE(StatementList)
1216 StatementList(Statement *stmt):
1217 statement (stmt), next (this)
1220 StatementList(StatementList *previous, Statement *stmt):
1224 next = previous->next;
1225 previous->next = this;
1228 virtual void accept0(Visitor *visitor);
1230 inline StatementList *finish ()
1232 StatementList *front = next;
1238 Statement *statement;
1239 StatementList *next;
1242 class QML_PARSER_EXPORT VariableStatement: public Statement
1245 QMLJS_DECLARE_AST_NODE(VariableStatement)
1247 VariableStatement(VariableDeclarationList *vlist):
1248 declarations (vlist)
1251 virtual void accept0(Visitor *visitor);
1253 virtual SourceLocation firstSourceLocation() const
1254 { return declarationKindToken; }
1256 virtual SourceLocation lastSourceLocation() const
1257 { return semicolonToken; }
1260 VariableDeclarationList *declarations;
1261 SourceLocation declarationKindToken;
1262 SourceLocation semicolonToken;
1265 class QML_PARSER_EXPORT VariableDeclaration: public Node
1268 QMLJS_DECLARE_AST_NODE(VariableDeclaration)
1270 VariableDeclaration(NameId *n, ExpressionNode *e):
1271 name (n), expression (e), readOnly(false)
1274 virtual void accept0(Visitor *visitor);
1278 ExpressionNode *expression;
1280 SourceLocation identifierToken;
1283 class QML_PARSER_EXPORT VariableDeclarationList: public Node
1286 QMLJS_DECLARE_AST_NODE(VariableDeclarationList)
1288 VariableDeclarationList(VariableDeclaration *decl):
1289 declaration (decl), next (this)
1292 VariableDeclarationList(VariableDeclarationList *previous, VariableDeclaration *decl):
1296 next = previous->next;
1297 previous->next = this;
1300 virtual void accept0(Visitor *visitor);
1302 inline VariableDeclarationList *finish (bool readOnly)
1304 VariableDeclarationList *front = next;
1307 VariableDeclarationList *vdl;
1308 for (vdl = front; vdl != 0; vdl = vdl->next)
1309 vdl->declaration->readOnly = true;
1315 VariableDeclaration *declaration;
1316 VariableDeclarationList *next;
1317 SourceLocation commaToken;
1320 class QML_PARSER_EXPORT EmptyStatement: public Statement
1323 QMLJS_DECLARE_AST_NODE(EmptyStatement)
1325 EmptyStatement() { kind = K; }
1327 virtual void accept0(Visitor *visitor);
1329 virtual SourceLocation firstSourceLocation() const
1330 { return semicolonToken; }
1332 virtual SourceLocation lastSourceLocation() const
1333 { return semicolonToken; }
1336 SourceLocation semicolonToken;
1339 class QML_PARSER_EXPORT ExpressionStatement: public Statement
1342 QMLJS_DECLARE_AST_NODE(ExpressionStatement)
1344 ExpressionStatement(ExpressionNode *e):
1345 expression (e) { kind = K; }
1347 virtual void accept0(Visitor *visitor);
1349 virtual SourceLocation firstSourceLocation() const
1350 { return expression->firstSourceLocation(); }
1352 virtual SourceLocation lastSourceLocation() const
1353 { return semicolonToken; }
1356 ExpressionNode *expression;
1357 SourceLocation semicolonToken;
1360 class QML_PARSER_EXPORT IfStatement: public Statement
1363 QMLJS_DECLARE_AST_NODE(IfStatement)
1365 IfStatement(ExpressionNode *e, Statement *t, Statement *f = 0):
1366 expression (e), ok (t), ko (f)
1369 virtual void accept0(Visitor *visitor);
1371 virtual SourceLocation firstSourceLocation() const
1374 virtual SourceLocation lastSourceLocation() const
1377 return ko->lastSourceLocation();
1379 return ok->lastSourceLocation();
1383 ExpressionNode *expression;
1386 SourceLocation ifToken;
1387 SourceLocation lparenToken;
1388 SourceLocation rparenToken;
1389 SourceLocation elseToken;
1392 class QML_PARSER_EXPORT DoWhileStatement: public Statement
1395 QMLJS_DECLARE_AST_NODE(DoWhileStatement)
1397 DoWhileStatement(Statement *stmt, ExpressionNode *e):
1398 statement (stmt), expression (e)
1401 virtual void accept0(Visitor *visitor);
1403 virtual SourceLocation firstSourceLocation() const
1406 virtual SourceLocation lastSourceLocation() const
1407 { return semicolonToken; }
1410 Statement *statement;
1411 ExpressionNode *expression;
1412 SourceLocation doToken;
1413 SourceLocation whileToken;
1414 SourceLocation lparenToken;
1415 SourceLocation rparenToken;
1416 SourceLocation semicolonToken;
1419 class QML_PARSER_EXPORT WhileStatement: public Statement
1422 QMLJS_DECLARE_AST_NODE(WhileStatement)
1424 WhileStatement(ExpressionNode *e, Statement *stmt):
1425 expression (e), statement (stmt)
1428 virtual void accept0(Visitor *visitor);
1430 virtual SourceLocation firstSourceLocation() const
1431 { return whileToken; }
1433 virtual SourceLocation lastSourceLocation() const
1434 { return statement->lastSourceLocation(); }
1437 ExpressionNode *expression;
1438 Statement *statement;
1439 SourceLocation whileToken;
1440 SourceLocation lparenToken;
1441 SourceLocation rparenToken;
1444 class QML_PARSER_EXPORT ForStatement: public Statement
1447 QMLJS_DECLARE_AST_NODE(ForStatement)
1449 ForStatement(ExpressionNode *i, ExpressionNode *c, ExpressionNode *e, Statement *stmt):
1450 initialiser (i), condition (c), expression (e), statement (stmt)
1453 virtual void accept0(Visitor *visitor);
1455 virtual SourceLocation firstSourceLocation() const
1456 { return forToken; }
1458 virtual SourceLocation lastSourceLocation() const
1459 { return statement->lastSourceLocation(); }
1462 ExpressionNode *initialiser;
1463 ExpressionNode *condition;
1464 ExpressionNode *expression;
1465 Statement *statement;
1466 SourceLocation forToken;
1467 SourceLocation lparenToken;
1468 SourceLocation firstSemicolonToken;
1469 SourceLocation secondSemicolonToken;
1470 SourceLocation rparenToken;
1473 class QML_PARSER_EXPORT LocalForStatement: public Statement
1476 QMLJS_DECLARE_AST_NODE(LocalForStatement)
1478 LocalForStatement(VariableDeclarationList *vlist, ExpressionNode *c, ExpressionNode *e, Statement *stmt):
1479 declarations (vlist), condition (c), expression (e), statement (stmt)
1482 virtual void accept0(Visitor *visitor);
1484 virtual SourceLocation firstSourceLocation() const
1485 { return forToken; }
1487 virtual SourceLocation lastSourceLocation() const
1488 { return statement->lastSourceLocation(); }
1491 VariableDeclarationList *declarations;
1492 ExpressionNode *condition;
1493 ExpressionNode *expression;
1494 Statement *statement;
1495 SourceLocation forToken;
1496 SourceLocation lparenToken;
1497 SourceLocation varToken;
1498 SourceLocation firstSemicolonToken;
1499 SourceLocation secondSemicolonToken;
1500 SourceLocation rparenToken;
1503 class QML_PARSER_EXPORT ForEachStatement: public Statement
1506 QMLJS_DECLARE_AST_NODE(ForEachStatement)
1508 ForEachStatement(ExpressionNode *i, ExpressionNode *e, Statement *stmt):
1509 initialiser (i), expression (e), statement (stmt)
1512 virtual void accept0(Visitor *visitor);
1514 virtual SourceLocation firstSourceLocation() const
1515 { return forToken; }
1517 virtual SourceLocation lastSourceLocation() const
1518 { return statement->lastSourceLocation(); }
1521 ExpressionNode *initialiser;
1522 ExpressionNode *expression;
1523 Statement *statement;
1524 SourceLocation forToken;
1525 SourceLocation lparenToken;
1526 SourceLocation inToken;
1527 SourceLocation rparenToken;
1530 class QML_PARSER_EXPORT LocalForEachStatement: public Statement
1533 QMLJS_DECLARE_AST_NODE(LocalForEachStatement)
1535 LocalForEachStatement(VariableDeclaration *v, ExpressionNode *e, Statement *stmt):
1536 declaration (v), expression (e), statement (stmt)
1539 virtual void accept0(Visitor *visitor);
1541 virtual SourceLocation firstSourceLocation() const
1542 { return forToken; }
1544 virtual SourceLocation lastSourceLocation() const
1545 { return statement->lastSourceLocation(); }
1548 VariableDeclaration *declaration;
1549 ExpressionNode *expression;
1550 Statement *statement;
1551 SourceLocation forToken;
1552 SourceLocation lparenToken;
1553 SourceLocation varToken;
1554 SourceLocation inToken;
1555 SourceLocation rparenToken;
1558 class QML_PARSER_EXPORT ContinueStatement: public Statement
1561 QMLJS_DECLARE_AST_NODE(ContinueStatement)
1563 ContinueStatement(NameId *l = 0):
1564 label (l) { kind = K; }
1566 virtual void accept0(Visitor *visitor);
1568 virtual SourceLocation firstSourceLocation() const
1569 { return continueToken; }
1571 virtual SourceLocation lastSourceLocation() const
1572 { return semicolonToken; }
1576 SourceLocation continueToken;
1577 SourceLocation identifierToken;
1578 SourceLocation semicolonToken;
1581 class QML_PARSER_EXPORT BreakStatement: public Statement
1584 QMLJS_DECLARE_AST_NODE(BreakStatement)
1586 BreakStatement(NameId *l = 0):
1587 label (l) { kind = K; }
1589 virtual void accept0(Visitor *visitor);
1591 virtual SourceLocation firstSourceLocation() const
1592 { return breakToken; }
1594 virtual SourceLocation lastSourceLocation() const
1595 { return semicolonToken; }
1599 SourceLocation breakToken;
1600 SourceLocation identifierToken;
1601 SourceLocation semicolonToken;
1604 class QML_PARSER_EXPORT ReturnStatement: public Statement
1607 QMLJS_DECLARE_AST_NODE(ReturnStatement)
1609 ReturnStatement(ExpressionNode *e):
1610 expression (e) { kind = K; }
1612 virtual void accept0(Visitor *visitor);
1614 virtual SourceLocation firstSourceLocation() const
1615 { return returnToken; }
1617 virtual SourceLocation lastSourceLocation() const
1618 { return semicolonToken; }
1621 ExpressionNode *expression;
1622 SourceLocation returnToken;
1623 SourceLocation semicolonToken;
1626 class QML_PARSER_EXPORT WithStatement: public Statement
1629 QMLJS_DECLARE_AST_NODE(WithStatement)
1631 WithStatement(ExpressionNode *e, Statement *stmt):
1632 expression (e), statement (stmt)
1635 virtual void accept0(Visitor *visitor);
1637 virtual SourceLocation firstSourceLocation() const
1638 { return withToken; }
1640 virtual SourceLocation lastSourceLocation() const
1641 { return statement->lastSourceLocation(); }
1644 ExpressionNode *expression;
1645 Statement *statement;
1646 SourceLocation withToken;
1647 SourceLocation lparenToken;
1648 SourceLocation rparenToken;
1651 class QML_PARSER_EXPORT CaseBlock: public Node
1654 QMLJS_DECLARE_AST_NODE(CaseBlock)
1656 CaseBlock(CaseClauses *c, DefaultClause *d = 0, CaseClauses *r = 0):
1657 clauses (c), defaultClause (d), moreClauses (r)
1660 virtual void accept0(Visitor *visitor);
1663 CaseClauses *clauses;
1664 DefaultClause *defaultClause;
1665 CaseClauses *moreClauses;
1666 SourceLocation lbraceToken;
1667 SourceLocation rbraceToken;
1670 class QML_PARSER_EXPORT SwitchStatement: public Statement
1673 QMLJS_DECLARE_AST_NODE(SwitchStatement)
1675 SwitchStatement(ExpressionNode *e, CaseBlock *b):
1676 expression (e), block (b)
1679 virtual void accept0(Visitor *visitor);
1681 virtual SourceLocation firstSourceLocation() const
1682 { return switchToken; }
1684 virtual SourceLocation lastSourceLocation() const
1685 { return block->rbraceToken; }
1688 ExpressionNode *expression;
1690 SourceLocation switchToken;
1691 SourceLocation lparenToken;
1692 SourceLocation rparenToken;
1695 class QML_PARSER_EXPORT CaseClauses: public Node
1698 QMLJS_DECLARE_AST_NODE(CaseClauses)
1700 CaseClauses(CaseClause *c):
1701 clause (c), next (this)
1704 CaseClauses(CaseClauses *previous, CaseClause *c):
1708 next = previous->next;
1709 previous->next = this;
1712 virtual void accept0(Visitor *visitor);
1714 inline CaseClauses *finish ()
1716 CaseClauses *front = next;
1726 class QML_PARSER_EXPORT CaseClause: public Node
1729 QMLJS_DECLARE_AST_NODE(CaseClause)
1731 CaseClause(ExpressionNode *e, StatementList *slist):
1732 expression (e), statements (slist)
1735 virtual void accept0(Visitor *visitor);
1738 ExpressionNode *expression;
1739 StatementList *statements;
1740 SourceLocation caseToken;
1741 SourceLocation colonToken;
1744 class QML_PARSER_EXPORT DefaultClause: public Node
1747 QMLJS_DECLARE_AST_NODE(DefaultClause)
1749 DefaultClause(StatementList *slist):
1753 virtual void accept0(Visitor *visitor);
1756 StatementList *statements;
1757 SourceLocation defaultToken;
1758 SourceLocation colonToken;
1761 class QML_PARSER_EXPORT LabelledStatement: public Statement
1764 QMLJS_DECLARE_AST_NODE(LabelledStatement)
1766 LabelledStatement(NameId *l, Statement *stmt):
1767 label (l), statement (stmt)
1770 virtual void accept0(Visitor *visitor);
1772 virtual SourceLocation firstSourceLocation() const
1773 { return identifierToken; }
1775 virtual SourceLocation lastSourceLocation() const
1776 { return statement->lastSourceLocation(); }
1780 Statement *statement;
1781 SourceLocation identifierToken;
1782 SourceLocation colonToken;
1785 class QML_PARSER_EXPORT ThrowStatement: public Statement
1788 QMLJS_DECLARE_AST_NODE(ThrowStatement)
1790 ThrowStatement(ExpressionNode *e):
1791 expression (e) { kind = K; }
1793 virtual void accept0(Visitor *visitor);
1795 virtual SourceLocation firstSourceLocation() const
1796 { return throwToken; }
1798 virtual SourceLocation lastSourceLocation() const
1799 { return semicolonToken; }
1802 ExpressionNode *expression;
1803 SourceLocation throwToken;
1804 SourceLocation semicolonToken;
1807 class QML_PARSER_EXPORT Catch: public Node
1810 QMLJS_DECLARE_AST_NODE(Catch)
1812 Catch(NameId *n, Block *stmt):
1813 name (n), statement (stmt)
1816 virtual void accept0(Visitor *visitor);
1821 SourceLocation catchToken;
1822 SourceLocation lparenToken;
1823 SourceLocation identifierToken;
1824 SourceLocation rparenToken;
1827 class QML_PARSER_EXPORT Finally: public Node
1830 QMLJS_DECLARE_AST_NODE(Finally)
1832 Finally(Block *stmt):
1836 virtual void accept0(Visitor *visitor);
1840 SourceLocation finallyToken;
1843 class QML_PARSER_EXPORT TryStatement: public Statement
1846 QMLJS_DECLARE_AST_NODE(TryStatement)
1848 TryStatement(Statement *stmt, Catch *c, Finally *f):
1849 statement (stmt), catchExpression (c), finallyExpression (f)
1852 TryStatement(Statement *stmt, Finally *f):
1853 statement (stmt), catchExpression (0), finallyExpression (f)
1856 TryStatement(Statement *stmt, Catch *c):
1857 statement (stmt), catchExpression (c), finallyExpression (0)
1860 virtual void accept0(Visitor *visitor);
1862 virtual SourceLocation firstSourceLocation() const
1863 { return tryToken; }
1865 virtual SourceLocation lastSourceLocation() const
1867 if (finallyExpression)
1868 return finallyExpression->statement->rbraceToken;
1869 else if (catchExpression)
1870 return catchExpression->statement->rbraceToken;
1872 return statement->lastSourceLocation();
1876 Statement *statement;
1877 Catch *catchExpression;
1878 Finally *finallyExpression;
1879 SourceLocation tryToken;
1882 class QML_PARSER_EXPORT FunctionExpression: public ExpressionNode
1885 QMLJS_DECLARE_AST_NODE(FunctionExpression)
1887 FunctionExpression(NameId *n, FormalParameterList *f, FunctionBody *b):
1888 name (n), formals (f), body (b)
1891 virtual void accept0(Visitor *visitor);
1893 virtual SourceLocation firstSourceLocation() const
1894 { return functionToken; }
1896 virtual SourceLocation lastSourceLocation() const
1897 { return rbraceToken; }
1901 FormalParameterList *formals;
1903 SourceLocation functionToken;
1904 SourceLocation identifierToken;
1905 SourceLocation lparenToken;
1906 SourceLocation rparenToken;
1907 SourceLocation lbraceToken;
1908 SourceLocation rbraceToken;
1911 class QML_PARSER_EXPORT FunctionDeclaration: public FunctionExpression
1914 QMLJS_DECLARE_AST_NODE(FunctionDeclaration)
1916 FunctionDeclaration(NameId *n, FormalParameterList *f, FunctionBody *b):
1917 FunctionExpression(n, f, b)
1920 virtual void accept0(Visitor *visitor);
1923 class QML_PARSER_EXPORT FormalParameterList: public Node
1926 QMLJS_DECLARE_AST_NODE(FormalParameterList)
1928 FormalParameterList(NameId *n):
1929 name (n), next (this)
1932 FormalParameterList(FormalParameterList *previous, NameId *n):
1936 next = previous->next;
1937 previous->next = this;
1940 virtual void accept0(Visitor *visitor);
1942 inline FormalParameterList *finish ()
1944 FormalParameterList *front = next;
1951 FormalParameterList *next;
1952 SourceLocation commaToken;
1953 SourceLocation identifierToken;
1956 class QML_PARSER_EXPORT FunctionBody: public Node
1959 QMLJS_DECLARE_AST_NODE(FunctionBody)
1961 FunctionBody(SourceElements *elts):
1965 virtual void accept0(Visitor *visitor);
1968 SourceElements *elements;
1971 class QML_PARSER_EXPORT Program: public Node
1974 QMLJS_DECLARE_AST_NODE(Program)
1976 Program(SourceElements *elts):
1980 virtual void accept0(Visitor *visitor);
1983 SourceElements *elements;
1986 class QML_PARSER_EXPORT SourceElements: public Node
1989 QMLJS_DECLARE_AST_NODE(SourceElements)
1991 SourceElements(SourceElement *elt):
1992 element (elt), next (this)
1995 SourceElements(SourceElements *previous, SourceElement *elt):
1999 next = previous->next;
2000 previous->next = this;
2003 virtual void accept0(Visitor *visitor);
2005 inline SourceElements *finish ()
2007 SourceElements *front = next;
2013 SourceElement *element;
2014 SourceElements *next;
2017 class QML_PARSER_EXPORT SourceElement: public Node
2020 QMLJS_DECLARE_AST_NODE(SourceElement)
2022 inline SourceElement()
2026 class QML_PARSER_EXPORT FunctionSourceElement: public SourceElement
2029 QMLJS_DECLARE_AST_NODE(FunctionSourceElement)
2031 FunctionSourceElement(FunctionDeclaration *f):
2035 virtual void accept0(Visitor *visitor);
2038 FunctionDeclaration *declaration;
2041 class QML_PARSER_EXPORT StatementSourceElement: public SourceElement
2044 QMLJS_DECLARE_AST_NODE(StatementSourceElement)
2046 StatementSourceElement(Statement *stmt):
2050 virtual void accept0(Visitor *visitor);
2053 Statement *statement;
2056 class QML_PARSER_EXPORT DebuggerStatement: public Statement
2059 QMLJS_DECLARE_AST_NODE(DebuggerStatement)
2064 virtual void accept0(Visitor *visitor);
2066 virtual SourceLocation firstSourceLocation() const
2067 { return debuggerToken; }
2069 virtual SourceLocation lastSourceLocation() const
2070 { return semicolonToken; }
2073 SourceLocation debuggerToken;
2074 SourceLocation semicolonToken;
2077 class QML_PARSER_EXPORT UiProgram: public Node
2080 QMLJS_DECLARE_AST_NODE(UiProgram)
2082 UiProgram(UiImportList *imports, UiObjectMemberList *members)
2083 : imports(imports), members(members)
2086 virtual void accept0(Visitor *visitor);
2089 UiImportList *imports;
2090 UiObjectMemberList *members;
2093 class QML_PARSER_EXPORT UiQualifiedId: public Node
2096 QMLJS_DECLARE_AST_NODE(UiQualifiedId)
2098 UiQualifiedId(NameId *name)
2099 : next(this), name(name)
2102 UiQualifiedId(UiQualifiedId *previous, NameId *name)
2106 next = previous->next;
2107 previous->next = this;
2110 UiQualifiedId *finish()
2112 UiQualifiedId *head = next;
2117 virtual void accept0(Visitor *visitor);
2120 UiQualifiedId *next;
2122 SourceLocation identifierToken;
2125 class QML_PARSER_EXPORT UiImport: public Node
2128 QMLJS_DECLARE_AST_NODE(UiImport)
2130 UiImport(NameId *fileName)
2131 : fileName(fileName), importUri(0), importId(0)
2134 UiImport(UiQualifiedId *uri)
2135 : fileName(0), importUri(uri), importId(0)
2138 virtual SourceLocation firstSourceLocation() const
2139 { return importToken; }
2141 virtual SourceLocation lastSourceLocation() const
2142 { return semicolonToken; }
2144 virtual void accept0(Visitor *visitor);
2148 UiQualifiedId *importUri;
2150 SourceLocation importToken;
2151 SourceLocation fileNameToken;
2152 SourceLocation versionToken;
2153 SourceLocation asToken;
2154 SourceLocation importIdToken;
2155 SourceLocation semicolonToken;
2158 class QML_PARSER_EXPORT UiImportList: public Node
2161 QMLJS_DECLARE_AST_NODE(UiImportList)
2163 UiImportList(UiImport *import)
2168 UiImportList(UiImportList *previous, UiImport *import)
2172 next = previous->next;
2173 previous->next = this;
2176 virtual SourceLocation firstSourceLocation() const
2178 if (import) return import->firstSourceLocation();
2179 else return SourceLocation();
2182 virtual SourceLocation lastSourceLocation() const
2184 for (const UiImportList *it = this; it; it = it->next)
2185 if (!it->next && it->import)
2186 return it->import->lastSourceLocation();
2188 return SourceLocation();
2191 UiImportList *finish()
2193 UiImportList *head = next;
2198 virtual void accept0(Visitor *visitor);
2205 class QML_PARSER_EXPORT UiObjectMember: public Node
2208 virtual SourceLocation firstSourceLocation() const = 0;
2209 virtual SourceLocation lastSourceLocation() const = 0;
2211 virtual UiObjectMember *uiObjectMemberCast();
2214 class QML_PARSER_EXPORT UiObjectMemberList: public Node
2217 QMLJS_DECLARE_AST_NODE(UiObjectMemberList)
2219 UiObjectMemberList(UiObjectMember *member)
2220 : next(this), member(member)
2223 UiObjectMemberList(UiObjectMemberList *previous, UiObjectMember *member)
2227 next = previous->next;
2228 previous->next = this;
2231 virtual void accept0(Visitor *visitor);
2233 UiObjectMemberList *finish()
2235 UiObjectMemberList *head = next;
2241 UiObjectMemberList *next;
2242 UiObjectMember *member;
2245 class QML_PARSER_EXPORT UiArrayMemberList: public Node
2248 QMLJS_DECLARE_AST_NODE(UiArrayMemberList)
2250 UiArrayMemberList(UiObjectMember *member)
2251 : next(this), member(member)
2254 UiArrayMemberList(UiArrayMemberList *previous, UiObjectMember *member)
2258 next = previous->next;
2259 previous->next = this;
2262 virtual void accept0(Visitor *visitor);
2264 UiArrayMemberList *finish()
2266 UiArrayMemberList *head = next;
2272 UiArrayMemberList *next;
2273 UiObjectMember *member;
2274 SourceLocation commaToken;
2277 class QML_PARSER_EXPORT UiObjectInitializer: public Node
2280 QMLJS_DECLARE_AST_NODE(UiObjectInitializer)
2282 UiObjectInitializer(UiObjectMemberList *members)
2286 virtual void accept0(Visitor *visitor);
2289 SourceLocation lbraceToken;
2290 UiObjectMemberList *members;
2291 SourceLocation rbraceToken;
2294 class QML_PARSER_EXPORT UiParameterList: public Node
2297 QMLJS_DECLARE_AST_NODE(UiParameterList)
2299 UiParameterList(NameId *t, NameId *n):
2300 type (t), name (n), next (this)
2303 UiParameterList(UiParameterList *previous, NameId *t, NameId *n):
2307 next = previous->next;
2308 previous->next = this;
2311 virtual void accept0(Visitor *) {}
2313 inline UiParameterList *finish ()
2315 UiParameterList *front = next;
2323 UiParameterList *next;
2324 SourceLocation commaToken;
2325 SourceLocation identifierToken;
2328 class QML_PARSER_EXPORT UiPublicMember: public UiObjectMember
2331 QMLJS_DECLARE_AST_NODE(UiPublicMember)
2333 UiPublicMember(NameId *memberType,
2335 : type(Property), typeModifier(0), memberType(memberType), name(name), expression(0), binding(0), isDefaultMember(false), isReadonlyMember(false), parameters(0)
2338 UiPublicMember(NameId *memberType,
2340 ExpressionNode *expression)
2341 : type(Property), typeModifier(0), memberType(memberType), name(name), expression(expression), binding(0), isDefaultMember(false), isReadonlyMember(false), parameters(0)
2344 virtual SourceLocation firstSourceLocation() const
2346 if (defaultToken.isValid())
2347 return defaultToken;
2348 else if (readonlyToken.isValid())
2349 return readonlyToken;
2351 return propertyToken;
2354 virtual SourceLocation lastSourceLocation() const
2357 return binding->lastSourceLocation();
2359 return semicolonToken;
2362 virtual void accept0(Visitor *visitor);
2365 enum { Signal, Property } type;
2366 NameId *typeModifier;
2369 ExpressionNode *expression; // initialized with a JS expression
2370 UiObjectMember *binding; // initialized with a QML object or array.
2371 bool isDefaultMember;
2372 bool isReadonlyMember;
2373 UiParameterList *parameters;
2374 SourceLocation defaultToken;
2375 SourceLocation readonlyToken;
2376 SourceLocation propertyToken;
2377 SourceLocation typeModifierToken;
2378 SourceLocation typeToken;
2379 SourceLocation identifierToken;
2380 SourceLocation colonToken;
2381 SourceLocation semicolonToken;
2384 class QML_PARSER_EXPORT UiObjectDefinition: public UiObjectMember
2387 QMLJS_DECLARE_AST_NODE(UiObjectDefinition)
2389 UiObjectDefinition(UiQualifiedId *qualifiedTypeNameId,
2390 UiObjectInitializer *initializer)
2391 : qualifiedTypeNameId(qualifiedTypeNameId), initializer(initializer)
2394 virtual SourceLocation firstSourceLocation() const
2395 { return qualifiedTypeNameId->identifierToken; }
2397 virtual SourceLocation lastSourceLocation() const
2398 { return initializer->rbraceToken; }
2400 virtual void accept0(Visitor *visitor);
2403 UiQualifiedId *qualifiedTypeNameId;
2404 UiObjectInitializer *initializer;
2407 class QML_PARSER_EXPORT UiSourceElement: public UiObjectMember
2410 QMLJS_DECLARE_AST_NODE(UiSourceElement)
2412 UiSourceElement(Node *sourceElement)
2413 : sourceElement(sourceElement)
2416 virtual SourceLocation firstSourceLocation() const
2418 if (FunctionDeclaration *funDecl = cast<FunctionDeclaration *>(sourceElement))
2419 return funDecl->firstSourceLocation();
2420 else if (VariableStatement *varStmt = cast<VariableStatement *>(sourceElement))
2421 return varStmt->firstSourceLocation();
2423 return SourceLocation();
2426 virtual SourceLocation lastSourceLocation() const
2428 if (FunctionDeclaration *funDecl = cast<FunctionDeclaration *>(sourceElement))
2429 return funDecl->lastSourceLocation();
2430 else if (VariableStatement *varStmt = cast<VariableStatement *>(sourceElement))
2431 return varStmt->lastSourceLocation();
2433 return SourceLocation();
2437 virtual void accept0(Visitor *visitor);
2440 Node *sourceElement;
2443 class QML_PARSER_EXPORT UiObjectBinding: public UiObjectMember
2446 QMLJS_DECLARE_AST_NODE(UiObjectBinding)
2448 UiObjectBinding(UiQualifiedId *qualifiedId,
2449 UiQualifiedId *qualifiedTypeNameId,
2450 UiObjectInitializer *initializer)
2451 : qualifiedId(qualifiedId),
2452 qualifiedTypeNameId(qualifiedTypeNameId),
2453 initializer(initializer),
2457 virtual SourceLocation firstSourceLocation() const
2459 if (hasOnToken && qualifiedTypeNameId)
2460 return qualifiedTypeNameId->identifierToken;
2462 return qualifiedId->identifierToken;
2465 virtual SourceLocation lastSourceLocation() const
2466 { return initializer->rbraceToken; }
2468 virtual void accept0(Visitor *visitor);
2471 UiQualifiedId *qualifiedId;
2472 UiQualifiedId *qualifiedTypeNameId;
2473 UiObjectInitializer *initializer;
2474 SourceLocation colonToken;
2478 class QML_PARSER_EXPORT UiScriptBinding: public UiObjectMember
2481 QMLJS_DECLARE_AST_NODE(UiScriptBinding)
2483 UiScriptBinding(UiQualifiedId *qualifiedId,
2484 Statement *statement)
2485 : qualifiedId(qualifiedId),
2486 statement(statement)
2489 virtual SourceLocation firstSourceLocation() const
2490 { return qualifiedId->identifierToken; }
2492 virtual SourceLocation lastSourceLocation() const
2493 { return statement->lastSourceLocation(); }
2495 virtual void accept0(Visitor *visitor);
2498 UiQualifiedId *qualifiedId;
2499 Statement *statement;
2500 SourceLocation colonToken;
2503 class QML_PARSER_EXPORT UiArrayBinding: public UiObjectMember
2506 QMLJS_DECLARE_AST_NODE(UiArrayBinding)
2508 UiArrayBinding(UiQualifiedId *qualifiedId,
2509 UiArrayMemberList *members)
2510 : qualifiedId(qualifiedId),
2514 virtual SourceLocation firstSourceLocation() const
2515 { return qualifiedId->identifierToken; }
2517 virtual SourceLocation lastSourceLocation() const
2518 { return rbracketToken; }
2520 virtual void accept0(Visitor *visitor);
2523 UiQualifiedId *qualifiedId;
2524 UiArrayMemberList *members;
2525 SourceLocation colonToken;
2526 SourceLocation lbracketToken;
2527 SourceLocation rbracketToken;
2530 } } // namespace AST
2534 QT_QML_END_NAMESPACE