Remove "All rights reserved" line from license headers.
[profile/ivi/qtdeclarative.git] / src / declarative / qml / parser / qdeclarativejsast_p.h
1 /****************************************************************************
2 **
3 ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
4 ** Contact: http://www.qt-project.org/
5 **
6 ** This file is part of the QtDeclarative module of the Qt Toolkit.
7 **
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.
16 **
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.
20 **
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.
28 **
29 ** Other Usage
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.
32 **
33 **
34 **
35 **
36 **
37 **
38 ** $QT_END_LICENSE$
39 **
40 ****************************************************************************/
41
42 #ifndef QDECLARATIVEJSAST_P_H
43 #define QDECLARATIVEJSAST_P_H
44
45 //
46 //  W A R N I N G
47 //  -------------
48 //
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.
52 //
53 // We mean it.
54 //
55
56 #include "qdeclarativejsastvisitor_p.h"
57 #include "qdeclarativejsglobal_p.h"
58 #include "qdeclarativejsmemorypool_p.h"
59
60 #include <QtCore/QString>
61
62 QT_QML_BEGIN_NAMESPACE
63
64 #define QDECLARATIVEJS_DECLARE_AST_NODE(name) \
65   enum { K = Kind_##name };
66
67 namespace QSOperator // ### rename
68 {
69
70 enum Op {
71     Add,
72     And,
73     InplaceAnd,
74     Assign,
75     BitAnd,
76     BitOr,
77     BitXor,
78     InplaceSub,
79     Div,
80     InplaceDiv,
81     Equal,
82     Ge,
83     Gt,
84     In,
85     InplaceAdd,
86     InstanceOf,
87     Le,
88     LShift,
89     InplaceLeftShift,
90     Lt,
91     Mod,
92     InplaceMod,
93     Mul,
94     InplaceMul,
95     NotEqual,
96     Or,
97     InplaceOr,
98     RShift,
99     InplaceRightShift,
100     StrictEqual,
101     StrictNotEqual,
102     Sub,
103     URShift,
104     InplaceURightShift,
105     InplaceXor
106 };
107
108 } // namespace QSOperator
109
110 namespace QDeclarativeJS {
111
112 namespace AST {
113
114 template <typename _T1, typename _T2>
115 _T1 cast(_T2 *ast)
116 {
117     if (ast && ast->kind == static_cast<_T1>(0)->K)
118         return static_cast<_T1>(ast);
119
120     return 0;
121 }
122
123 class QML_PARSER_EXPORT Node: public Managed
124 {
125 public:
126     enum Kind {
127         Kind_Undefined,
128
129         Kind_ArgumentList,
130         Kind_ArrayLiteral,
131         Kind_ArrayMemberExpression,
132         Kind_BinaryExpression,
133         Kind_Block,
134         Kind_BreakStatement,
135         Kind_CallExpression,
136         Kind_CaseBlock,
137         Kind_CaseClause,
138         Kind_CaseClauses,
139         Kind_Catch,
140         Kind_ConditionalExpression,
141         Kind_ContinueStatement,
142         Kind_DebuggerStatement,
143         Kind_DefaultClause,
144         Kind_DeleteExpression,
145         Kind_DoWhileStatement,
146         Kind_ElementList,
147         Kind_Elision,
148         Kind_EmptyStatement,
149         Kind_Expression,
150         Kind_ExpressionStatement,
151         Kind_FalseLiteral,
152         Kind_FieldMemberExpression,
153         Kind_Finally,
154         Kind_ForEachStatement,
155         Kind_ForStatement,
156         Kind_FormalParameterList,
157         Kind_FunctionBody,
158         Kind_FunctionDeclaration,
159         Kind_FunctionExpression,
160         Kind_FunctionSourceElement,
161         Kind_IdentifierExpression,
162         Kind_IdentifierPropertyName,
163         Kind_IfStatement,
164         Kind_LabelledStatement,
165         Kind_LocalForEachStatement,
166         Kind_LocalForStatement,
167         Kind_NewExpression,
168         Kind_NewMemberExpression,
169         Kind_NotExpression,
170         Kind_NullExpression,
171         Kind_NumericLiteral,
172         Kind_NumericLiteralPropertyName,
173         Kind_ObjectLiteral,
174         Kind_PostDecrementExpression,
175         Kind_PostIncrementExpression,
176         Kind_PreDecrementExpression,
177         Kind_PreIncrementExpression,
178         Kind_Program,
179         Kind_PropertyName,
180         Kind_PropertyNameAndValueList,
181         Kind_RegExpLiteral,
182         Kind_ReturnStatement,
183         Kind_SourceElement,
184         Kind_SourceElements,
185         Kind_StatementList,
186         Kind_StatementSourceElement,
187         Kind_StringLiteral,
188         Kind_StringLiteralPropertyName,
189         Kind_SwitchStatement,
190         Kind_ThisExpression,
191         Kind_ThrowStatement,
192         Kind_TildeExpression,
193         Kind_TrueLiteral,
194         Kind_TryStatement,
195         Kind_TypeOfExpression,
196         Kind_UnaryMinusExpression,
197         Kind_UnaryPlusExpression,
198         Kind_VariableDeclaration,
199         Kind_VariableDeclarationList,
200         Kind_VariableStatement,
201         Kind_VoidExpression,
202         Kind_WhileStatement,
203         Kind_WithStatement,
204         Kind_NestedExpression,
205
206         Kind_UiArrayBinding,
207         Kind_UiImport,
208         Kind_UiImportList,
209         Kind_UiObjectBinding,
210         Kind_UiObjectDefinition,
211         Kind_UiObjectInitializer,
212         Kind_UiObjectMemberList,
213         Kind_UiArrayMemberList,
214         Kind_UiProgram,
215         Kind_UiParameterList,
216         Kind_UiPublicMember,
217         Kind_UiQualifiedId,
218         Kind_UiScriptBinding,
219         Kind_UiSourceElement
220     };
221
222     inline Node()
223         : kind(Kind_Undefined) {}
224
225     // NOTE: node destructors are never called,
226     //       instead we block free the memory
227     //       (see the NodePool class)
228     virtual ~Node() {}
229
230     virtual ExpressionNode *expressionCast();
231     virtual BinaryExpression *binaryExpressionCast();
232     virtual Statement *statementCast();
233     virtual UiObjectMember *uiObjectMemberCast();
234
235     void accept(Visitor *visitor);
236     static void accept(Node *node, Visitor *visitor);
237
238     inline static void acceptChild(Node *node, Visitor *visitor)
239     { return accept(node, visitor); } // ### remove
240
241     virtual void accept0(Visitor *visitor) = 0;
242     virtual SourceLocation firstSourceLocation() const = 0;
243     virtual SourceLocation lastSourceLocation() const = 0;
244
245 // attributes
246     int kind;
247 };
248
249 class QML_PARSER_EXPORT ExpressionNode: public Node
250 {
251 public:
252     ExpressionNode() {}
253
254     virtual ExpressionNode *expressionCast();
255 };
256
257 class QML_PARSER_EXPORT Statement: public Node
258 {
259 public:
260     Statement() {}
261
262     virtual Statement *statementCast();
263 };
264
265 class QML_PARSER_EXPORT NestedExpression: public ExpressionNode
266 {
267 public:
268     QDECLARATIVEJS_DECLARE_AST_NODE(NestedExpression)
269
270     NestedExpression(ExpressionNode *expression)
271         : expression(expression)
272     { kind = K; }
273
274     virtual void accept0(Visitor *visitor);
275
276     virtual SourceLocation firstSourceLocation() const
277     { return lparenToken; }
278
279     virtual SourceLocation lastSourceLocation() const
280     { return rparenToken; }
281
282 // attributes
283     ExpressionNode *expression;
284     SourceLocation lparenToken;
285     SourceLocation rparenToken;
286 };
287
288 class QML_PARSER_EXPORT ThisExpression: public ExpressionNode
289 {
290 public:
291     QDECLARATIVEJS_DECLARE_AST_NODE(ThisExpression)
292
293     ThisExpression() { kind = K; }
294
295     virtual void accept0(Visitor *visitor);
296
297     virtual SourceLocation firstSourceLocation() const
298     { return thisToken; }
299
300     virtual SourceLocation lastSourceLocation() const
301     { return thisToken; }
302
303 // attributes
304     SourceLocation thisToken;
305 };
306
307 class QML_PARSER_EXPORT IdentifierExpression: public ExpressionNode
308 {
309 public:
310     QDECLARATIVEJS_DECLARE_AST_NODE(IdentifierExpression)
311
312     IdentifierExpression(const QStringRef &n):
313         name (n) { kind = K; }
314
315     virtual void accept0(Visitor *visitor);
316
317     virtual SourceLocation firstSourceLocation() const
318     { return identifierToken; }
319
320     virtual SourceLocation lastSourceLocation() const
321     { return identifierToken; }
322
323 // attributes
324     QStringRef name;
325     SourceLocation identifierToken;
326 };
327
328 class QML_PARSER_EXPORT NullExpression: public ExpressionNode
329 {
330 public:
331     QDECLARATIVEJS_DECLARE_AST_NODE(NullExpression)
332
333     NullExpression() { kind = K; }
334
335     virtual void accept0(Visitor *visitor);
336
337     virtual SourceLocation firstSourceLocation() const
338     { return nullToken; }
339
340     virtual SourceLocation lastSourceLocation() const
341     { return nullToken; }
342
343 // attributes
344     SourceLocation nullToken;
345 };
346
347 class QML_PARSER_EXPORT TrueLiteral: public ExpressionNode
348 {
349 public:
350     QDECLARATIVEJS_DECLARE_AST_NODE(TrueLiteral)
351
352     TrueLiteral() { kind = K; }
353
354     virtual void accept0(Visitor *visitor);
355
356     virtual SourceLocation firstSourceLocation() const
357     { return trueToken; }
358
359     virtual SourceLocation lastSourceLocation() const
360     { return trueToken; }
361
362 // attributes
363     SourceLocation trueToken;
364 };
365
366 class QML_PARSER_EXPORT FalseLiteral: public ExpressionNode
367 {
368 public:
369     QDECLARATIVEJS_DECLARE_AST_NODE(FalseLiteral)
370
371     FalseLiteral() { kind = K; }
372
373     virtual void accept0(Visitor *visitor);
374
375     virtual SourceLocation firstSourceLocation() const
376     { return falseToken; }
377
378     virtual SourceLocation lastSourceLocation() const
379     { return falseToken; }
380
381 // attributes
382     SourceLocation falseToken;
383 };
384
385 class QML_PARSER_EXPORT NumericLiteral: public ExpressionNode
386 {
387 public:
388     QDECLARATIVEJS_DECLARE_AST_NODE(NumericLiteral)
389
390     NumericLiteral(double v):
391         value(v) { kind = K; }
392
393     virtual void accept0(Visitor *visitor);
394
395     virtual SourceLocation firstSourceLocation() const
396     { return literalToken; }
397
398     virtual SourceLocation lastSourceLocation() const
399     { return literalToken; }
400
401 // attributes:
402     double value;
403     SourceLocation literalToken;
404 };
405
406 class QML_PARSER_EXPORT StringLiteral: public ExpressionNode
407 {
408 public:
409     QDECLARATIVEJS_DECLARE_AST_NODE(StringLiteral)
410
411     StringLiteral(const QStringRef &v):
412         value (v) { kind = K; }
413
414     virtual void accept0(Visitor *visitor);
415
416     virtual SourceLocation firstSourceLocation() const
417     { return literalToken; }
418
419     virtual SourceLocation lastSourceLocation() const
420     { return literalToken; }
421
422 // attributes:
423     QStringRef value;
424     SourceLocation literalToken;
425 };
426
427 class QML_PARSER_EXPORT RegExpLiteral: public ExpressionNode
428 {
429 public:
430     QDECLARATIVEJS_DECLARE_AST_NODE(RegExpLiteral)
431
432     RegExpLiteral(const QStringRef &p, int f):
433         pattern (p), flags (f) { kind = K; }
434
435     virtual void accept0(Visitor *visitor);
436
437     virtual SourceLocation firstSourceLocation() const
438     { return literalToken; }
439
440     virtual SourceLocation lastSourceLocation() const
441     { return literalToken; }
442
443 // attributes:
444     QStringRef pattern;
445     int flags;
446     SourceLocation literalToken;
447 };
448
449 class QML_PARSER_EXPORT ArrayLiteral: public ExpressionNode
450 {
451 public:
452     QDECLARATIVEJS_DECLARE_AST_NODE(ArrayLiteral)
453
454     ArrayLiteral(Elision *e):
455         elements (0), elision (e)
456         { kind = K; }
457
458     ArrayLiteral(ElementList *elts):
459         elements (elts), elision (0)
460         { kind = K; }
461
462     ArrayLiteral(ElementList *elts, Elision *e):
463         elements (elts), elision (e)
464         { kind = K; }
465
466     virtual void accept0(Visitor *visitor);
467
468     virtual SourceLocation firstSourceLocation() const
469     { return lbracketToken; }
470
471     virtual SourceLocation lastSourceLocation() const
472     { return rbracketToken; }
473
474 // attributes
475     ElementList *elements;
476     Elision *elision;
477     SourceLocation lbracketToken;
478     SourceLocation commaToken;
479     SourceLocation rbracketToken;
480 };
481
482 class QML_PARSER_EXPORT ObjectLiteral: public ExpressionNode
483 {
484 public:
485     QDECLARATIVEJS_DECLARE_AST_NODE(ObjectLiteral)
486
487     ObjectLiteral():
488         properties (0) { kind = K; }
489
490     ObjectLiteral(PropertyNameAndValueList *plist):
491         properties (plist) { kind = K; }
492
493     virtual void accept0(Visitor *visitor);
494
495     virtual SourceLocation firstSourceLocation() const
496     { return lbraceToken; }
497
498     virtual SourceLocation lastSourceLocation() const
499     { return rbraceToken; }
500
501 // attributes
502     PropertyNameAndValueList *properties;
503     SourceLocation lbraceToken;
504     SourceLocation rbraceToken;
505 };
506
507 class QML_PARSER_EXPORT Elision: public Node
508 {
509 public:
510     QDECLARATIVEJS_DECLARE_AST_NODE(Elision)
511
512     Elision():
513         next (this) { kind = K; }
514
515     Elision(Elision *previous)
516     {
517         kind = K;
518         next = previous->next;
519         previous->next = this;
520     }
521
522     virtual void accept0(Visitor *visitor);
523
524     virtual SourceLocation firstSourceLocation() const
525     { return commaToken; }
526
527     virtual SourceLocation lastSourceLocation() const
528     { return next ? next->lastSourceLocation() : commaToken; }
529
530     inline Elision *finish ()
531     {
532         Elision *front = next;
533         next = 0;
534         return front;
535     }
536
537 // attributes
538     Elision *next;
539     SourceLocation commaToken;
540 };
541
542 class QML_PARSER_EXPORT ElementList: public Node
543 {
544 public:
545     QDECLARATIVEJS_DECLARE_AST_NODE(ElementList)
546
547     ElementList(Elision *e, ExpressionNode *expr):
548         elision (e), expression (expr), next (this)
549     { kind = K; }
550
551     ElementList(ElementList *previous, Elision *e, ExpressionNode *expr):
552         elision (e), expression (expr)
553     {
554         kind = K;
555         next = previous->next;
556         previous->next = this;
557     }
558
559     inline ElementList *finish ()
560     {
561         ElementList *front = next;
562         next = 0;
563         return front;
564     }
565
566     virtual void accept0(Visitor *visitor);
567
568     virtual SourceLocation firstSourceLocation() const
569     {
570         if (elision)
571             return elision->firstSourceLocation();
572         return expression->firstSourceLocation();
573     }
574
575     virtual SourceLocation lastSourceLocation() const
576     {
577         if (next)
578             return next->lastSourceLocation();
579         return expression->lastSourceLocation();
580     }
581
582 // attributes
583     Elision *elision;
584     ExpressionNode *expression;
585     ElementList *next;
586     SourceLocation commaToken;
587 };
588
589 class QML_PARSER_EXPORT PropertyName: public Node
590 {
591 public:
592     QDECLARATIVEJS_DECLARE_AST_NODE(PropertyName)
593
594     PropertyName() { kind = K; }
595
596     virtual SourceLocation firstSourceLocation() const
597     { return propertyNameToken; }
598
599     virtual SourceLocation lastSourceLocation() const
600     { return propertyNameToken; }
601
602 // attributes
603     SourceLocation propertyNameToken;
604 };
605
606 class QML_PARSER_EXPORT PropertyNameAndValueList: public Node
607 {
608 public:
609     QDECLARATIVEJS_DECLARE_AST_NODE(PropertyNameAndValueList)
610
611     PropertyNameAndValueList(PropertyName *n, ExpressionNode *v):
612         name (n), value (v), next (this)
613         { kind = K; }
614
615     PropertyNameAndValueList(PropertyNameAndValueList *previous, PropertyName *n, ExpressionNode *v):
616         name (n), value (v)
617     {
618         kind = K;
619         next = previous->next;
620         previous->next = this;
621     }
622
623     virtual void accept0(Visitor *visitor);
624
625     virtual SourceLocation firstSourceLocation() const
626     { return name->firstSourceLocation(); }
627
628     virtual SourceLocation lastSourceLocation() const
629     {
630         if (next)
631             return next->lastSourceLocation();
632         return value->lastSourceLocation();
633     }
634
635     inline PropertyNameAndValueList *finish ()
636     {
637         PropertyNameAndValueList *front = next;
638         next = 0;
639         return front;
640     }
641
642 // attributes
643     PropertyName *name;
644     ExpressionNode *value;
645     PropertyNameAndValueList *next;
646     SourceLocation colonToken;
647     SourceLocation commaToken;
648 };
649
650 class QML_PARSER_EXPORT IdentifierPropertyName: public PropertyName
651 {
652 public:
653     QDECLARATIVEJS_DECLARE_AST_NODE(IdentifierPropertyName)
654
655     IdentifierPropertyName(const QStringRef &n):
656         id (n) { kind = K; }
657
658     virtual void accept0(Visitor *visitor);
659
660 // attributes
661     QStringRef id;
662 };
663
664 class QML_PARSER_EXPORT StringLiteralPropertyName: public PropertyName
665 {
666 public:
667     QDECLARATIVEJS_DECLARE_AST_NODE(StringLiteralPropertyName)
668
669     StringLiteralPropertyName(const QStringRef &n):
670         id (n) { kind = K; }
671
672     virtual void accept0(Visitor *visitor);
673
674 // attributes
675     QStringRef id;
676 };
677
678 class QML_PARSER_EXPORT NumericLiteralPropertyName: public PropertyName
679 {
680 public:
681     QDECLARATIVEJS_DECLARE_AST_NODE(NumericLiteralPropertyName)
682
683     NumericLiteralPropertyName(double n):
684         id (n) { kind = K; }
685
686     virtual void accept0(Visitor *visitor);
687
688 // attributes
689     double id;
690 };
691
692 class QML_PARSER_EXPORT ArrayMemberExpression: public ExpressionNode
693 {
694 public:
695     QDECLARATIVEJS_DECLARE_AST_NODE(ArrayMemberExpression)
696
697     ArrayMemberExpression(ExpressionNode *b, ExpressionNode *e):
698         base (b), expression (e)
699         { kind = K; }
700
701     virtual void accept0(Visitor *visitor);
702
703     virtual SourceLocation firstSourceLocation() const
704     { return base->firstSourceLocation(); }
705
706     virtual SourceLocation lastSourceLocation() const
707     { return rbracketToken; }
708
709 // attributes
710     ExpressionNode *base;
711     ExpressionNode *expression;
712     SourceLocation lbracketToken;
713     SourceLocation rbracketToken;
714 };
715
716 class QML_PARSER_EXPORT FieldMemberExpression: public ExpressionNode
717 {
718 public:
719     QDECLARATIVEJS_DECLARE_AST_NODE(FieldMemberExpression)
720
721     FieldMemberExpression(ExpressionNode *b, const QStringRef &n):
722         base (b), name (n)
723         { kind = K; }
724
725     virtual void accept0(Visitor *visitor);
726
727     virtual SourceLocation firstSourceLocation() const
728     { return base->firstSourceLocation(); }
729
730     virtual SourceLocation lastSourceLocation() const
731     { return identifierToken; }
732
733     // attributes
734     ExpressionNode *base;
735     QStringRef name;
736     SourceLocation dotToken;
737     SourceLocation identifierToken;
738 };
739
740 class QML_PARSER_EXPORT NewMemberExpression: public ExpressionNode
741 {
742 public:
743     QDECLARATIVEJS_DECLARE_AST_NODE(NewMemberExpression)
744
745     NewMemberExpression(ExpressionNode *b, ArgumentList *a):
746         base (b), arguments (a)
747         { kind = K; }
748
749     virtual void accept0(Visitor *visitor);
750
751     virtual SourceLocation firstSourceLocation() const
752     { return newToken; }
753
754     virtual SourceLocation lastSourceLocation() const
755     { return rparenToken; }
756
757     // attributes
758     ExpressionNode *base;
759     ArgumentList *arguments;
760     SourceLocation newToken;
761     SourceLocation lparenToken;
762     SourceLocation rparenToken;
763 };
764
765 class QML_PARSER_EXPORT NewExpression: public ExpressionNode
766 {
767 public:
768     QDECLARATIVEJS_DECLARE_AST_NODE(NewExpression)
769
770     NewExpression(ExpressionNode *e):
771         expression (e) { kind = K; }
772
773     virtual void accept0(Visitor *visitor);
774
775     virtual SourceLocation firstSourceLocation() const
776     { return newToken; }
777
778     virtual SourceLocation lastSourceLocation() const
779     { return expression->lastSourceLocation(); }
780
781 // attributes
782     ExpressionNode *expression;
783     SourceLocation newToken;
784 };
785
786 class QML_PARSER_EXPORT CallExpression: public ExpressionNode
787 {
788 public:
789     QDECLARATIVEJS_DECLARE_AST_NODE(CallExpression)
790
791     CallExpression(ExpressionNode *b, ArgumentList *a):
792         base (b), arguments (a)
793         { kind = K; }
794
795     virtual void accept0(Visitor *visitor);
796
797     virtual SourceLocation firstSourceLocation() const
798     { return base->firstSourceLocation(); }
799
800     virtual SourceLocation lastSourceLocation() const
801     { return rparenToken; }
802
803 // attributes
804     ExpressionNode *base;
805     ArgumentList *arguments;
806     SourceLocation lparenToken;
807     SourceLocation rparenToken;
808 };
809
810 class QML_PARSER_EXPORT ArgumentList: public Node
811 {
812 public:
813     QDECLARATIVEJS_DECLARE_AST_NODE(ArgumentList)
814
815     ArgumentList(ExpressionNode *e):
816         expression (e), next (this)
817         { kind = K; }
818
819     ArgumentList(ArgumentList *previous, ExpressionNode *e):
820         expression (e)
821     {
822         kind = K;
823         next = previous->next;
824         previous->next = this;
825     }
826
827     virtual void accept0(Visitor *visitor);
828
829     virtual SourceLocation firstSourceLocation() const
830     { return expression->firstSourceLocation(); }
831
832     virtual SourceLocation lastSourceLocation() const
833     {
834         if (next)
835             return next->lastSourceLocation();
836         return expression->lastSourceLocation();
837     }
838
839     inline ArgumentList *finish ()
840     {
841         ArgumentList *front = next;
842         next = 0;
843         return front;
844     }
845
846 // attributes
847     ExpressionNode *expression;
848     ArgumentList *next;
849     SourceLocation commaToken;
850 };
851
852 class QML_PARSER_EXPORT PostIncrementExpression: public ExpressionNode
853 {
854 public:
855     QDECLARATIVEJS_DECLARE_AST_NODE(PostIncrementExpression)
856
857     PostIncrementExpression(ExpressionNode *b):
858         base (b) { kind = K; }
859
860     virtual void accept0(Visitor *visitor);
861
862     virtual SourceLocation firstSourceLocation() const
863     { return base->firstSourceLocation(); }
864
865     virtual SourceLocation lastSourceLocation() const
866     { return incrementToken; }
867
868 // attributes
869     ExpressionNode *base;
870     SourceLocation incrementToken;
871 };
872
873 class QML_PARSER_EXPORT PostDecrementExpression: public ExpressionNode
874 {
875 public:
876     QDECLARATIVEJS_DECLARE_AST_NODE(PostDecrementExpression)
877
878     PostDecrementExpression(ExpressionNode *b):
879         base (b) { kind = K; }
880
881     virtual void accept0(Visitor *visitor);
882
883     virtual SourceLocation firstSourceLocation() const
884     { return base->firstSourceLocation(); }
885
886     virtual SourceLocation lastSourceLocation() const
887     { return decrementToken; }
888
889 // attributes
890     ExpressionNode *base;
891     SourceLocation decrementToken;
892 };
893
894 class QML_PARSER_EXPORT DeleteExpression: public ExpressionNode
895 {
896 public:
897     QDECLARATIVEJS_DECLARE_AST_NODE(DeleteExpression)
898
899     DeleteExpression(ExpressionNode *e):
900         expression (e) { kind = K; }
901
902     virtual void accept0(Visitor *visitor);
903
904     virtual SourceLocation firstSourceLocation() const
905     { return deleteToken; }
906
907     virtual SourceLocation lastSourceLocation() const
908     { return expression->lastSourceLocation(); }
909
910 // attributes
911     ExpressionNode *expression;
912     SourceLocation deleteToken;
913 };
914
915 class QML_PARSER_EXPORT VoidExpression: public ExpressionNode
916 {
917 public:
918     QDECLARATIVEJS_DECLARE_AST_NODE(VoidExpression)
919
920     VoidExpression(ExpressionNode *e):
921         expression (e) { kind = K; }
922
923     virtual void accept0(Visitor *visitor);
924
925     virtual SourceLocation firstSourceLocation() const
926     { return voidToken; }
927
928     virtual SourceLocation lastSourceLocation() const
929     { return expression->lastSourceLocation(); }
930
931 // attributes
932     ExpressionNode *expression;
933     SourceLocation voidToken;
934 };
935
936 class QML_PARSER_EXPORT TypeOfExpression: public ExpressionNode
937 {
938 public:
939     QDECLARATIVEJS_DECLARE_AST_NODE(TypeOfExpression)
940
941     TypeOfExpression(ExpressionNode *e):
942         expression (e) { kind = K; }
943
944     virtual void accept0(Visitor *visitor);
945
946     virtual SourceLocation firstSourceLocation() const
947     { return typeofToken; }
948
949     virtual SourceLocation lastSourceLocation() const
950     { return expression->lastSourceLocation(); }
951
952 // attributes
953     ExpressionNode *expression;
954     SourceLocation typeofToken;
955 };
956
957 class QML_PARSER_EXPORT PreIncrementExpression: public ExpressionNode
958 {
959 public:
960     QDECLARATIVEJS_DECLARE_AST_NODE(PreIncrementExpression)
961
962     PreIncrementExpression(ExpressionNode *e):
963         expression (e) { kind = K; }
964
965     virtual void accept0(Visitor *visitor);
966
967     virtual SourceLocation firstSourceLocation() const
968     { return incrementToken; }
969
970     virtual SourceLocation lastSourceLocation() const
971     { return expression->lastSourceLocation(); }
972
973 // attributes
974     ExpressionNode *expression;
975     SourceLocation incrementToken;
976 };
977
978 class QML_PARSER_EXPORT PreDecrementExpression: public ExpressionNode
979 {
980 public:
981     QDECLARATIVEJS_DECLARE_AST_NODE(PreDecrementExpression)
982
983     PreDecrementExpression(ExpressionNode *e):
984         expression (e) { kind = K; }
985
986     virtual void accept0(Visitor *visitor);
987
988     virtual SourceLocation firstSourceLocation() const
989     { return decrementToken; }
990
991     virtual SourceLocation lastSourceLocation() const
992     { return expression->lastSourceLocation(); }
993
994 // attributes
995     ExpressionNode *expression;
996     SourceLocation decrementToken;
997 };
998
999 class QML_PARSER_EXPORT UnaryPlusExpression: public ExpressionNode
1000 {
1001 public:
1002     QDECLARATIVEJS_DECLARE_AST_NODE(UnaryPlusExpression)
1003
1004     UnaryPlusExpression(ExpressionNode *e):
1005         expression (e) { kind = K; }
1006
1007     virtual void accept0(Visitor *visitor);
1008
1009     virtual SourceLocation firstSourceLocation() const
1010     { return plusToken; }
1011
1012     virtual SourceLocation lastSourceLocation() const
1013     { return expression->lastSourceLocation(); }
1014
1015 // attributes
1016     ExpressionNode *expression;
1017     SourceLocation plusToken;
1018 };
1019
1020 class QML_PARSER_EXPORT UnaryMinusExpression: public ExpressionNode
1021 {
1022 public:
1023     QDECLARATIVEJS_DECLARE_AST_NODE(UnaryMinusExpression)
1024
1025     UnaryMinusExpression(ExpressionNode *e):
1026         expression (e) { kind = K; }
1027
1028     virtual void accept0(Visitor *visitor);
1029
1030     virtual SourceLocation firstSourceLocation() const
1031     { return minusToken; }
1032
1033     virtual SourceLocation lastSourceLocation() const
1034     { return expression->lastSourceLocation(); }
1035
1036 // attributes
1037     ExpressionNode *expression;
1038     SourceLocation minusToken;
1039 };
1040
1041 class QML_PARSER_EXPORT TildeExpression: public ExpressionNode
1042 {
1043 public:
1044     QDECLARATIVEJS_DECLARE_AST_NODE(TildeExpression)
1045
1046     TildeExpression(ExpressionNode *e):
1047         expression (e) { kind = K; }
1048
1049     virtual void accept0(Visitor *visitor);
1050
1051     virtual SourceLocation firstSourceLocation() const
1052     { return tildeToken; }
1053
1054     virtual SourceLocation lastSourceLocation() const
1055     { return expression->lastSourceLocation(); }
1056
1057 // attributes
1058     ExpressionNode *expression;
1059     SourceLocation tildeToken;
1060 };
1061
1062 class QML_PARSER_EXPORT NotExpression: public ExpressionNode
1063 {
1064 public:
1065     QDECLARATIVEJS_DECLARE_AST_NODE(NotExpression)
1066
1067     NotExpression(ExpressionNode *e):
1068         expression (e) { kind = K; }
1069
1070     virtual void accept0(Visitor *visitor);
1071
1072     virtual SourceLocation firstSourceLocation() const
1073     { return notToken; }
1074
1075     virtual SourceLocation lastSourceLocation() const
1076     { return expression->lastSourceLocation(); }
1077
1078 // attributes
1079     ExpressionNode *expression;
1080     SourceLocation notToken;
1081 };
1082
1083 class QML_PARSER_EXPORT BinaryExpression: public ExpressionNode
1084 {
1085 public:
1086     QDECLARATIVEJS_DECLARE_AST_NODE(BinaryExpression)
1087
1088     BinaryExpression(ExpressionNode *l, int o, ExpressionNode *r):
1089         left (l), op (o), right (r)
1090         { kind = K; }
1091
1092     virtual BinaryExpression *binaryExpressionCast();
1093
1094     virtual void accept0(Visitor *visitor);
1095
1096     virtual SourceLocation firstSourceLocation() const
1097     { return left->firstSourceLocation(); }
1098
1099     virtual SourceLocation lastSourceLocation() const
1100     { return right->lastSourceLocation(); }
1101
1102 // attributes
1103     ExpressionNode *left;
1104     int op;
1105     ExpressionNode *right;
1106     SourceLocation operatorToken;
1107 };
1108
1109 class QML_PARSER_EXPORT ConditionalExpression: public ExpressionNode
1110 {
1111 public:
1112     QDECLARATIVEJS_DECLARE_AST_NODE(ConditionalExpression)
1113
1114     ConditionalExpression(ExpressionNode *e, ExpressionNode *t, ExpressionNode *f):
1115         expression (e), ok (t), ko (f)
1116         { kind = K; }
1117
1118     virtual void accept0(Visitor *visitor);
1119
1120     virtual SourceLocation firstSourceLocation() const
1121     { return expression->firstSourceLocation(); }
1122
1123     virtual SourceLocation lastSourceLocation() const
1124     { return ko->lastSourceLocation(); }
1125
1126 // attributes
1127     ExpressionNode *expression;
1128     ExpressionNode *ok;
1129     ExpressionNode *ko;
1130     SourceLocation questionToken;
1131     SourceLocation colonToken;
1132 };
1133
1134 class QML_PARSER_EXPORT Expression: public ExpressionNode // ### rename
1135 {
1136 public:
1137     QDECLARATIVEJS_DECLARE_AST_NODE(Expression)
1138
1139     Expression(ExpressionNode *l, ExpressionNode *r):
1140         left (l), right (r) { kind = K; }
1141
1142     virtual void accept0(Visitor *visitor);
1143
1144     virtual SourceLocation firstSourceLocation() const
1145     { return left->firstSourceLocation(); }
1146
1147     virtual SourceLocation lastSourceLocation() const
1148     { return right->lastSourceLocation(); }
1149
1150 // attributes
1151     ExpressionNode *left;
1152     ExpressionNode *right;
1153     SourceLocation commaToken;
1154 };
1155
1156 class QML_PARSER_EXPORT Block: public Statement
1157 {
1158 public:
1159     QDECLARATIVEJS_DECLARE_AST_NODE(Block)
1160
1161     Block(StatementList *slist):
1162         statements (slist) { kind = K; }
1163
1164     virtual void accept0(Visitor *visitor);
1165
1166     virtual SourceLocation firstSourceLocation() const
1167     { return lbraceToken; }
1168
1169     virtual SourceLocation lastSourceLocation() const
1170     { return rbraceToken; }
1171
1172     // attributes
1173     StatementList *statements;
1174     SourceLocation lbraceToken;
1175     SourceLocation rbraceToken;
1176 };
1177
1178 class QML_PARSER_EXPORT StatementList: public Node
1179 {
1180 public:
1181     QDECLARATIVEJS_DECLARE_AST_NODE(StatementList)
1182
1183     StatementList(Statement *stmt):
1184         statement (stmt), next (this)
1185         { kind = K; }
1186
1187     StatementList(StatementList *previous, Statement *stmt):
1188         statement (stmt)
1189     {
1190         kind = K;
1191         next = previous->next;
1192         previous->next = this;
1193     }
1194
1195     virtual void accept0(Visitor *visitor);
1196
1197     virtual SourceLocation firstSourceLocation() const
1198     { return statement->firstSourceLocation(); }
1199
1200     virtual SourceLocation lastSourceLocation() const
1201     { return next ? next->lastSourceLocation() : statement->lastSourceLocation(); }
1202
1203     inline StatementList *finish ()
1204     {
1205         StatementList *front = next;
1206         next = 0;
1207         return front;
1208     }
1209
1210 // attributes
1211     Statement *statement;
1212     StatementList *next;
1213 };
1214
1215 class QML_PARSER_EXPORT VariableStatement: public Statement
1216 {
1217 public:
1218     QDECLARATIVEJS_DECLARE_AST_NODE(VariableStatement)
1219
1220     VariableStatement(VariableDeclarationList *vlist):
1221         declarations (vlist)
1222         { kind = K; }
1223
1224     virtual void accept0(Visitor *visitor);
1225
1226     virtual SourceLocation firstSourceLocation() const
1227     { return declarationKindToken; }
1228
1229     virtual SourceLocation lastSourceLocation() const
1230     { return semicolonToken; }
1231
1232 // attributes
1233     VariableDeclarationList *declarations;
1234     SourceLocation declarationKindToken;
1235     SourceLocation semicolonToken;
1236 };
1237
1238 class QML_PARSER_EXPORT VariableDeclaration: public Node
1239 {
1240 public:
1241     QDECLARATIVEJS_DECLARE_AST_NODE(VariableDeclaration)
1242
1243     VariableDeclaration(const QStringRef &n, ExpressionNode *e):
1244         name (n), expression (e), readOnly(false)
1245         { kind = K; }
1246
1247     virtual void accept0(Visitor *visitor);
1248
1249     virtual SourceLocation firstSourceLocation() const
1250     { return identifierToken; }
1251
1252     virtual SourceLocation lastSourceLocation() const
1253     { return expression ? expression->lastSourceLocation() : identifierToken; }
1254
1255 // attributes
1256     QStringRef name;
1257     ExpressionNode *expression;
1258     bool readOnly;
1259     SourceLocation identifierToken;
1260 };
1261
1262 class QML_PARSER_EXPORT VariableDeclarationList: public Node
1263 {
1264 public:
1265     QDECLARATIVEJS_DECLARE_AST_NODE(VariableDeclarationList)
1266
1267     VariableDeclarationList(VariableDeclaration *decl):
1268         declaration (decl), next (this)
1269         { kind = K; }
1270
1271     VariableDeclarationList(VariableDeclarationList *previous, VariableDeclaration *decl):
1272         declaration (decl)
1273     {
1274         kind = K;
1275         next = previous->next;
1276         previous->next = this;
1277     }
1278
1279     virtual void accept0(Visitor *visitor);
1280
1281     virtual SourceLocation firstSourceLocation() const
1282     { return declaration->firstSourceLocation(); }
1283
1284     virtual SourceLocation lastSourceLocation() const
1285     {
1286         if (next)
1287             return next->lastSourceLocation();
1288         return declaration->lastSourceLocation();
1289     }
1290
1291     inline VariableDeclarationList *finish (bool readOnly)
1292     {
1293         VariableDeclarationList *front = next;
1294         next = 0;
1295         if (readOnly) {
1296             VariableDeclarationList *vdl;
1297             for (vdl = front; vdl != 0; vdl = vdl->next)
1298                 vdl->declaration->readOnly = true;
1299         }
1300         return front;
1301     }
1302
1303 // attributes
1304     VariableDeclaration *declaration;
1305     VariableDeclarationList *next;
1306     SourceLocation commaToken;
1307 };
1308
1309 class QML_PARSER_EXPORT EmptyStatement: public Statement
1310 {
1311 public:
1312     QDECLARATIVEJS_DECLARE_AST_NODE(EmptyStatement)
1313
1314     EmptyStatement() { kind = K; }
1315
1316     virtual void accept0(Visitor *visitor);
1317
1318     virtual SourceLocation firstSourceLocation() const
1319     { return semicolonToken; }
1320
1321     virtual SourceLocation lastSourceLocation() const
1322     { return semicolonToken; }
1323
1324 // attributes
1325     SourceLocation semicolonToken;
1326 };
1327
1328 class QML_PARSER_EXPORT ExpressionStatement: public Statement
1329 {
1330 public:
1331     QDECLARATIVEJS_DECLARE_AST_NODE(ExpressionStatement)
1332
1333     ExpressionStatement(ExpressionNode *e):
1334         expression (e) { kind = K; }
1335
1336     virtual void accept0(Visitor *visitor);
1337
1338     virtual SourceLocation firstSourceLocation() const
1339     { return expression->firstSourceLocation(); }
1340
1341     virtual SourceLocation lastSourceLocation() const
1342     { return semicolonToken; }
1343
1344 // attributes
1345     ExpressionNode *expression;
1346     SourceLocation semicolonToken;
1347 };
1348
1349 class QML_PARSER_EXPORT IfStatement: public Statement
1350 {
1351 public:
1352     QDECLARATIVEJS_DECLARE_AST_NODE(IfStatement)
1353
1354     IfStatement(ExpressionNode *e, Statement *t, Statement *f = 0):
1355         expression (e), ok (t), ko (f)
1356         { kind = K; }
1357
1358     virtual void accept0(Visitor *visitor);
1359
1360     virtual SourceLocation firstSourceLocation() const
1361     { return ifToken; }
1362
1363     virtual SourceLocation lastSourceLocation() const
1364     {
1365         if (ko)
1366             return ko->lastSourceLocation();
1367
1368         return ok->lastSourceLocation();
1369     }
1370
1371 // attributes
1372     ExpressionNode *expression;
1373     Statement *ok;
1374     Statement *ko;
1375     SourceLocation ifToken;
1376     SourceLocation lparenToken;
1377     SourceLocation rparenToken;
1378     SourceLocation elseToken;
1379 };
1380
1381 class QML_PARSER_EXPORT DoWhileStatement: public Statement
1382 {
1383 public:
1384     QDECLARATIVEJS_DECLARE_AST_NODE(DoWhileStatement)
1385
1386     DoWhileStatement(Statement *stmt, ExpressionNode *e):
1387         statement (stmt), expression (e)
1388         { kind = K; }
1389
1390     virtual void accept0(Visitor *visitor);
1391
1392     virtual SourceLocation firstSourceLocation() const
1393     { return doToken; }
1394
1395     virtual SourceLocation lastSourceLocation() const
1396     { return semicolonToken; }
1397
1398 // attributes
1399     Statement *statement;
1400     ExpressionNode *expression;
1401     SourceLocation doToken;
1402     SourceLocation whileToken;
1403     SourceLocation lparenToken;
1404     SourceLocation rparenToken;
1405     SourceLocation semicolonToken;
1406 };
1407
1408 class QML_PARSER_EXPORT WhileStatement: public Statement
1409 {
1410 public:
1411     QDECLARATIVEJS_DECLARE_AST_NODE(WhileStatement)
1412
1413     WhileStatement(ExpressionNode *e, Statement *stmt):
1414         expression (e), statement (stmt)
1415         { kind = K; }
1416
1417     virtual void accept0(Visitor *visitor);
1418
1419     virtual SourceLocation firstSourceLocation() const
1420     { return whileToken; }
1421
1422     virtual SourceLocation lastSourceLocation() const
1423     { return statement->lastSourceLocation(); }
1424
1425 // attributes
1426     ExpressionNode *expression;
1427     Statement *statement;
1428     SourceLocation whileToken;
1429     SourceLocation lparenToken;
1430     SourceLocation rparenToken;
1431 };
1432
1433 class QML_PARSER_EXPORT ForStatement: public Statement
1434 {
1435 public:
1436     QDECLARATIVEJS_DECLARE_AST_NODE(ForStatement)
1437
1438     ForStatement(ExpressionNode *i, ExpressionNode *c, ExpressionNode *e, Statement *stmt):
1439         initialiser (i), condition (c), expression (e), statement (stmt)
1440         { kind = K; }
1441
1442     virtual void accept0(Visitor *visitor);
1443
1444     virtual SourceLocation firstSourceLocation() const
1445     { return forToken; }
1446
1447     virtual SourceLocation lastSourceLocation() const
1448     { return statement->lastSourceLocation(); }
1449
1450 // attributes
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;
1460 };
1461
1462 class QML_PARSER_EXPORT LocalForStatement: public Statement
1463 {
1464 public:
1465     QDECLARATIVEJS_DECLARE_AST_NODE(LocalForStatement)
1466
1467     LocalForStatement(VariableDeclarationList *vlist, ExpressionNode *c, ExpressionNode *e, Statement *stmt):
1468         declarations (vlist), condition (c), expression (e), statement (stmt)
1469         { kind = K; }
1470
1471     virtual void accept0(Visitor *visitor);
1472
1473     virtual SourceLocation firstSourceLocation() const
1474     { return forToken; }
1475
1476     virtual SourceLocation lastSourceLocation() const
1477     { return statement->lastSourceLocation(); }
1478
1479 // attributes
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;
1490 };
1491
1492 class QML_PARSER_EXPORT ForEachStatement: public Statement
1493 {
1494 public:
1495     QDECLARATIVEJS_DECLARE_AST_NODE(ForEachStatement)
1496
1497     ForEachStatement(ExpressionNode *i, ExpressionNode *e, Statement *stmt):
1498         initialiser (i), expression (e), statement (stmt)
1499         { kind = K; }
1500
1501     virtual void accept0(Visitor *visitor);
1502
1503     virtual SourceLocation firstSourceLocation() const
1504     { return forToken; }
1505
1506     virtual SourceLocation lastSourceLocation() const
1507     { return statement->lastSourceLocation(); }
1508
1509 // attributes
1510     ExpressionNode *initialiser;
1511     ExpressionNode *expression;
1512     Statement *statement;
1513     SourceLocation forToken;
1514     SourceLocation lparenToken;
1515     SourceLocation inToken;
1516     SourceLocation rparenToken;
1517 };
1518
1519 class QML_PARSER_EXPORT LocalForEachStatement: public Statement
1520 {
1521 public:
1522     QDECLARATIVEJS_DECLARE_AST_NODE(LocalForEachStatement)
1523
1524     LocalForEachStatement(VariableDeclaration *v, ExpressionNode *e, Statement *stmt):
1525         declaration (v), expression (e), statement (stmt)
1526         { kind = K; }
1527
1528     virtual void accept0(Visitor *visitor);
1529
1530     virtual SourceLocation firstSourceLocation() const
1531     { return forToken; }
1532
1533     virtual SourceLocation lastSourceLocation() const
1534     { return statement->lastSourceLocation(); }
1535
1536 // attributes
1537     VariableDeclaration *declaration;
1538     ExpressionNode *expression;
1539     Statement *statement;
1540     SourceLocation forToken;
1541     SourceLocation lparenToken;
1542     SourceLocation varToken;
1543     SourceLocation inToken;
1544     SourceLocation rparenToken;
1545 };
1546
1547 class QML_PARSER_EXPORT ContinueStatement: public Statement
1548 {
1549 public:
1550     QDECLARATIVEJS_DECLARE_AST_NODE(ContinueStatement)
1551
1552     ContinueStatement(const QStringRef &l = QStringRef()):
1553         label (l) { kind = K; }
1554
1555     virtual void accept0(Visitor *visitor);
1556
1557     virtual SourceLocation firstSourceLocation() const
1558     { return continueToken; }
1559
1560     virtual SourceLocation lastSourceLocation() const
1561     { return semicolonToken; }
1562
1563 // attributes
1564     QStringRef label;
1565     SourceLocation continueToken;
1566     SourceLocation identifierToken;
1567     SourceLocation semicolonToken;
1568 };
1569
1570 class QML_PARSER_EXPORT BreakStatement: public Statement
1571 {
1572 public:
1573     QDECLARATIVEJS_DECLARE_AST_NODE(BreakStatement)
1574
1575     BreakStatement(const QStringRef &l):
1576         label (l) { kind = K; }
1577
1578     virtual void accept0(Visitor *visitor);
1579
1580     virtual SourceLocation firstSourceLocation() const
1581     { return breakToken; }
1582
1583     virtual SourceLocation lastSourceLocation() const
1584     { return semicolonToken; }
1585
1586     // attributes
1587     QStringRef label;
1588     SourceLocation breakToken;
1589     SourceLocation identifierToken;
1590     SourceLocation semicolonToken;
1591 };
1592
1593 class QML_PARSER_EXPORT ReturnStatement: public Statement
1594 {
1595 public:
1596     QDECLARATIVEJS_DECLARE_AST_NODE(ReturnStatement)
1597
1598     ReturnStatement(ExpressionNode *e):
1599         expression (e) { kind = K; }
1600
1601     virtual void accept0(Visitor *visitor);
1602
1603     virtual SourceLocation firstSourceLocation() const
1604     { return returnToken; }
1605
1606     virtual SourceLocation lastSourceLocation() const
1607     { return semicolonToken; }
1608
1609 // attributes
1610     ExpressionNode *expression;
1611     SourceLocation returnToken;
1612     SourceLocation semicolonToken;
1613 };
1614
1615 class QML_PARSER_EXPORT WithStatement: public Statement
1616 {
1617 public:
1618     QDECLARATIVEJS_DECLARE_AST_NODE(WithStatement)
1619
1620     WithStatement(ExpressionNode *e, Statement *stmt):
1621         expression (e), statement (stmt)
1622         { kind = K; }
1623
1624     virtual void accept0(Visitor *visitor);
1625
1626     virtual SourceLocation firstSourceLocation() const
1627     { return withToken; }
1628
1629     virtual SourceLocation lastSourceLocation() const
1630     { return statement->lastSourceLocation(); }
1631
1632 // attributes
1633     ExpressionNode *expression;
1634     Statement *statement;
1635     SourceLocation withToken;
1636     SourceLocation lparenToken;
1637     SourceLocation rparenToken;
1638 };
1639
1640 class QML_PARSER_EXPORT CaseBlock: public Node
1641 {
1642 public:
1643     QDECLARATIVEJS_DECLARE_AST_NODE(CaseBlock)
1644
1645     CaseBlock(CaseClauses *c, DefaultClause *d = 0, CaseClauses *r = 0):
1646         clauses (c), defaultClause (d), moreClauses (r)
1647         { kind = K; }
1648
1649     virtual void accept0(Visitor *visitor);
1650
1651     virtual SourceLocation firstSourceLocation() const
1652     { return lbraceToken; }
1653
1654     virtual SourceLocation lastSourceLocation() const
1655     { return rbraceToken; }
1656
1657 // attributes
1658     CaseClauses *clauses;
1659     DefaultClause *defaultClause;
1660     CaseClauses *moreClauses;
1661     SourceLocation lbraceToken;
1662     SourceLocation rbraceToken;
1663 };
1664
1665 class QML_PARSER_EXPORT SwitchStatement: public Statement
1666 {
1667 public:
1668     QDECLARATIVEJS_DECLARE_AST_NODE(SwitchStatement)
1669
1670     SwitchStatement(ExpressionNode *e, CaseBlock *b):
1671         expression (e), block (b)
1672         { kind = K; }
1673
1674     virtual void accept0(Visitor *visitor);
1675
1676     virtual SourceLocation firstSourceLocation() const
1677     { return switchToken; }
1678
1679     virtual SourceLocation lastSourceLocation() const
1680     { return block->rbraceToken; }
1681
1682 // attributes
1683     ExpressionNode *expression;
1684     CaseBlock *block;
1685     SourceLocation switchToken;
1686     SourceLocation lparenToken;
1687     SourceLocation rparenToken;
1688 };
1689
1690 class QML_PARSER_EXPORT CaseClause: public Node
1691 {
1692 public:
1693     QDECLARATIVEJS_DECLARE_AST_NODE(CaseClause)
1694
1695     CaseClause(ExpressionNode *e, StatementList *slist):
1696         expression (e), statements (slist)
1697         { kind = K; }
1698
1699     virtual void accept0(Visitor *visitor);
1700
1701     virtual SourceLocation firstSourceLocation() const
1702     { return caseToken; }
1703
1704     virtual SourceLocation lastSourceLocation() const
1705     { return statements ? statements->lastSourceLocation() : colonToken; }
1706
1707 // attributes
1708     ExpressionNode *expression;
1709     StatementList *statements;
1710     SourceLocation caseToken;
1711     SourceLocation colonToken;
1712 };
1713
1714 class QML_PARSER_EXPORT CaseClauses: public Node
1715 {
1716 public:
1717     QDECLARATIVEJS_DECLARE_AST_NODE(CaseClauses)
1718
1719     CaseClauses(CaseClause *c):
1720         clause (c), next (this)
1721         { kind = K; }
1722
1723     CaseClauses(CaseClauses *previous, CaseClause *c):
1724         clause (c)
1725     {
1726         kind = K;
1727         next = previous->next;
1728         previous->next = this;
1729     }
1730
1731     virtual void accept0(Visitor *visitor);
1732
1733     virtual SourceLocation firstSourceLocation() const
1734     { return clause->firstSourceLocation(); }
1735
1736     virtual SourceLocation lastSourceLocation() const
1737     { return next ? next->lastSourceLocation() : clause->lastSourceLocation(); }
1738
1739     inline CaseClauses *finish ()
1740     {
1741         CaseClauses *front = next;
1742         next = 0;
1743         return front;
1744     }
1745
1746 //attributes
1747     CaseClause *clause;
1748     CaseClauses *next;
1749 };
1750
1751 class QML_PARSER_EXPORT DefaultClause: public Node
1752 {
1753 public:
1754     QDECLARATIVEJS_DECLARE_AST_NODE(DefaultClause)
1755
1756     DefaultClause(StatementList *slist):
1757         statements (slist)
1758         { kind = K; }
1759
1760     virtual void accept0(Visitor *visitor);
1761
1762     virtual SourceLocation firstSourceLocation() const
1763     { return defaultToken; }
1764
1765     virtual SourceLocation lastSourceLocation() const
1766     { return statements ? statements->lastSourceLocation() : colonToken; }
1767
1768 // attributes
1769     StatementList *statements;
1770     SourceLocation defaultToken;
1771     SourceLocation colonToken;
1772 };
1773
1774 class QML_PARSER_EXPORT LabelledStatement: public Statement
1775 {
1776 public:
1777     QDECLARATIVEJS_DECLARE_AST_NODE(LabelledStatement)
1778
1779     LabelledStatement(const QStringRef &l, Statement *stmt):
1780         label (l), statement (stmt)
1781         { kind = K; }
1782
1783     virtual void accept0(Visitor *visitor);
1784
1785     virtual SourceLocation firstSourceLocation() const
1786     { return identifierToken; }
1787
1788     virtual SourceLocation lastSourceLocation() const
1789     { return statement->lastSourceLocation(); }
1790
1791 // attributes
1792     QStringRef label;
1793     Statement *statement;
1794     SourceLocation identifierToken;
1795     SourceLocation colonToken;
1796 };
1797
1798 class QML_PARSER_EXPORT ThrowStatement: public Statement
1799 {
1800 public:
1801     QDECLARATIVEJS_DECLARE_AST_NODE(ThrowStatement)
1802
1803     ThrowStatement(ExpressionNode *e):
1804         expression (e) { kind = K; }
1805
1806     virtual void accept0(Visitor *visitor);
1807
1808     virtual SourceLocation firstSourceLocation() const
1809     { return throwToken; }
1810
1811     virtual SourceLocation lastSourceLocation() const
1812     { return semicolonToken; }
1813
1814     // attributes
1815     ExpressionNode *expression;
1816     SourceLocation throwToken;
1817     SourceLocation semicolonToken;
1818 };
1819
1820 class QML_PARSER_EXPORT Catch: public Node
1821 {
1822 public:
1823     QDECLARATIVEJS_DECLARE_AST_NODE(Catch)
1824
1825     Catch(const QStringRef &n, Block *stmt):
1826         name (n), statement (stmt)
1827         { kind = K; }
1828
1829     virtual void accept0(Visitor *visitor);
1830
1831     virtual SourceLocation firstSourceLocation() const
1832     { return catchToken; }
1833
1834     virtual SourceLocation lastSourceLocation() const
1835     { return statement->lastSourceLocation(); }
1836
1837 // attributes
1838     QStringRef name;
1839     Block *statement;
1840     SourceLocation catchToken;
1841     SourceLocation lparenToken;
1842     SourceLocation identifierToken;
1843     SourceLocation rparenToken;
1844 };
1845
1846 class QML_PARSER_EXPORT Finally: public Node
1847 {
1848 public:
1849     QDECLARATIVEJS_DECLARE_AST_NODE(Finally)
1850
1851     Finally(Block *stmt):
1852         statement (stmt)
1853         { kind = K; }
1854
1855     virtual void accept0(Visitor *visitor);
1856
1857     virtual SourceLocation firstSourceLocation() const
1858     { return finallyToken; }
1859
1860     virtual SourceLocation lastSourceLocation() const
1861     { return statement ? statement->lastSourceLocation() : finallyToken; }
1862
1863 // attributes
1864     Block *statement;
1865     SourceLocation finallyToken;
1866 };
1867
1868 class QML_PARSER_EXPORT TryStatement: public Statement
1869 {
1870 public:
1871     QDECLARATIVEJS_DECLARE_AST_NODE(TryStatement)
1872
1873     TryStatement(Statement *stmt, Catch *c, Finally *f):
1874         statement (stmt), catchExpression (c), finallyExpression (f)
1875         { kind = K; }
1876
1877     TryStatement(Statement *stmt, Finally *f):
1878         statement (stmt), catchExpression (0), finallyExpression (f)
1879         { kind = K; }
1880
1881     TryStatement(Statement *stmt, Catch *c):
1882         statement (stmt), catchExpression (c), finallyExpression (0)
1883         { kind = K; }
1884
1885     virtual void accept0(Visitor *visitor);
1886
1887     virtual SourceLocation firstSourceLocation() const
1888     { return tryToken; }
1889
1890     virtual SourceLocation lastSourceLocation() const
1891     {
1892         if (finallyExpression)
1893             return finallyExpression->statement->rbraceToken;
1894         else if (catchExpression)
1895             return catchExpression->statement->rbraceToken;
1896
1897         return statement->lastSourceLocation();
1898     }
1899
1900 // attributes
1901     Statement *statement;
1902     Catch *catchExpression;
1903     Finally *finallyExpression;
1904     SourceLocation tryToken;
1905 };
1906
1907 class QML_PARSER_EXPORT FunctionExpression: public ExpressionNode
1908 {
1909 public:
1910     QDECLARATIVEJS_DECLARE_AST_NODE(FunctionExpression)
1911
1912     FunctionExpression(const QStringRef &n, FormalParameterList *f, FunctionBody *b):
1913         name (n), formals (f), body (b)
1914         { kind = K; }
1915
1916     virtual void accept0(Visitor *visitor);
1917
1918     virtual SourceLocation firstSourceLocation() const
1919     { return functionToken; }
1920
1921     virtual SourceLocation lastSourceLocation() const
1922     { return rbraceToken; }
1923
1924 // attributes
1925     QStringRef name;
1926     FormalParameterList *formals;
1927     FunctionBody *body;
1928     SourceLocation functionToken;
1929     SourceLocation identifierToken;
1930     SourceLocation lparenToken;
1931     SourceLocation rparenToken;
1932     SourceLocation lbraceToken;
1933     SourceLocation rbraceToken;
1934 };
1935
1936 class QML_PARSER_EXPORT FunctionDeclaration: public FunctionExpression
1937 {
1938 public:
1939     QDECLARATIVEJS_DECLARE_AST_NODE(FunctionDeclaration)
1940
1941     FunctionDeclaration(const QStringRef &n, FormalParameterList *f, FunctionBody *b):
1942         FunctionExpression(n, f, b)
1943         { kind = K; }
1944
1945     virtual void accept0(Visitor *visitor);
1946 };
1947
1948 class QML_PARSER_EXPORT FormalParameterList: public Node
1949 {
1950 public:
1951     QDECLARATIVEJS_DECLARE_AST_NODE(FormalParameterList)
1952
1953     FormalParameterList(const QStringRef &n):
1954         name (n), next (this)
1955         { kind = K; }
1956
1957     FormalParameterList(FormalParameterList *previous, const QStringRef &n):
1958         name (n)
1959     {
1960         kind = K;
1961         next = previous->next;
1962         previous->next = this;
1963     }
1964
1965     virtual void accept0(Visitor *visitor);
1966
1967     virtual SourceLocation firstSourceLocation() const
1968     { return identifierToken; }
1969
1970     virtual SourceLocation lastSourceLocation() const
1971     { return next ? next->lastSourceLocation() : identifierToken; }
1972
1973     inline FormalParameterList *finish ()
1974     {
1975         FormalParameterList *front = next;
1976         next = 0;
1977         return front;
1978     }
1979
1980 // attributes
1981     QStringRef name;
1982     FormalParameterList *next;
1983     SourceLocation commaToken;
1984     SourceLocation identifierToken;
1985 };
1986
1987 class QML_PARSER_EXPORT SourceElement: public Node
1988 {
1989 public:
1990     QDECLARATIVEJS_DECLARE_AST_NODE(SourceElement)
1991
1992     inline SourceElement()
1993         { kind = K; }
1994 };
1995
1996 class QML_PARSER_EXPORT SourceElements: public Node
1997 {
1998 public:
1999     QDECLARATIVEJS_DECLARE_AST_NODE(SourceElements)
2000
2001     SourceElements(SourceElement *elt):
2002         element (elt), next (this)
2003         { kind = K; }
2004
2005     SourceElements(SourceElements *previous, SourceElement *elt):
2006         element (elt)
2007     {
2008         kind = K;
2009         next = previous->next;
2010         previous->next = this;
2011     }
2012
2013     virtual void accept0(Visitor *visitor);
2014
2015     virtual SourceLocation firstSourceLocation() const
2016     { return element->firstSourceLocation(); }
2017
2018     virtual SourceLocation lastSourceLocation() const
2019     { return next ? next->lastSourceLocation() : element->lastSourceLocation(); }
2020
2021     inline SourceElements *finish ()
2022     {
2023         SourceElements *front = next;
2024         next = 0;
2025         return front;
2026     }
2027
2028 // attributes
2029     SourceElement *element;
2030     SourceElements *next;
2031 };
2032
2033 class QML_PARSER_EXPORT FunctionBody: public Node
2034 {
2035 public:
2036     QDECLARATIVEJS_DECLARE_AST_NODE(FunctionBody)
2037
2038     FunctionBody(SourceElements *elts):
2039         elements (elts)
2040         { kind = K; }
2041
2042     virtual void accept0(Visitor *visitor);
2043
2044     virtual SourceLocation firstSourceLocation() const
2045     { return elements ? elements->firstSourceLocation() : SourceLocation(); }
2046
2047     virtual SourceLocation lastSourceLocation() const
2048     { return elements ? elements->lastSourceLocation() : SourceLocation(); }
2049
2050 // attributes
2051     SourceElements *elements;
2052 };
2053
2054 class QML_PARSER_EXPORT Program: public Node
2055 {
2056 public:
2057     QDECLARATIVEJS_DECLARE_AST_NODE(Program)
2058
2059     Program(SourceElements *elts):
2060         elements (elts)
2061         { kind = K; }
2062
2063     virtual void accept0(Visitor *visitor);
2064
2065     virtual SourceLocation firstSourceLocation() const
2066     { return elements ? elements->firstSourceLocation() : SourceLocation(); }
2067
2068     virtual SourceLocation lastSourceLocation() const
2069     { return elements ? elements->lastSourceLocation() : SourceLocation(); }
2070
2071 // attributes
2072     SourceElements *elements;
2073 };
2074
2075 class QML_PARSER_EXPORT FunctionSourceElement: public SourceElement
2076 {
2077 public:
2078     QDECLARATIVEJS_DECLARE_AST_NODE(FunctionSourceElement)
2079
2080     FunctionSourceElement(FunctionDeclaration *f):
2081         declaration (f)
2082         { kind = K; }
2083
2084     virtual void accept0(Visitor *visitor);
2085
2086     virtual SourceLocation firstSourceLocation() const
2087     { return declaration->firstSourceLocation(); }
2088
2089     virtual SourceLocation lastSourceLocation() const
2090     { return declaration->lastSourceLocation(); }
2091
2092 // attributes
2093     FunctionDeclaration *declaration;
2094 };
2095
2096 class QML_PARSER_EXPORT StatementSourceElement: public SourceElement
2097 {
2098 public:
2099     QDECLARATIVEJS_DECLARE_AST_NODE(StatementSourceElement)
2100
2101     StatementSourceElement(Statement *stmt):
2102         statement (stmt)
2103         { kind = K; }
2104
2105     virtual void accept0(Visitor *visitor);
2106
2107     virtual SourceLocation firstSourceLocation() const
2108     { return statement->firstSourceLocation(); }
2109
2110     virtual SourceLocation lastSourceLocation() const
2111     { return statement->lastSourceLocation(); }
2112
2113 // attributes
2114     Statement *statement;
2115 };
2116
2117 class QML_PARSER_EXPORT DebuggerStatement: public Statement
2118 {
2119 public:
2120     QDECLARATIVEJS_DECLARE_AST_NODE(DebuggerStatement)
2121
2122     DebuggerStatement()
2123         { kind = K; }
2124
2125     virtual void accept0(Visitor *visitor);
2126
2127     virtual SourceLocation firstSourceLocation() const
2128     { return debuggerToken; }
2129
2130     virtual SourceLocation lastSourceLocation() const
2131     { return semicolonToken; }
2132
2133 // attributes
2134     SourceLocation debuggerToken;
2135     SourceLocation semicolonToken;
2136 };
2137
2138 class QML_PARSER_EXPORT UiQualifiedId: public Node
2139 {
2140 public:
2141     QDECLARATIVEJS_DECLARE_AST_NODE(UiQualifiedId)
2142
2143     UiQualifiedId(const QStringRef &name)
2144         : next(this), name(name)
2145     { kind = K; }
2146
2147     UiQualifiedId(UiQualifiedId *previous, const QStringRef &name)
2148         : name(name)
2149     {
2150         kind = K;
2151         next = previous->next;
2152         previous->next = this;
2153     }
2154
2155     UiQualifiedId *finish()
2156     {
2157         UiQualifiedId *head = next;
2158         next = 0;
2159         return head;
2160     }
2161
2162     virtual void accept0(Visitor *visitor);
2163
2164     virtual SourceLocation firstSourceLocation() const
2165     { return identifierToken; }
2166
2167     virtual SourceLocation lastSourceLocation() const
2168     { return next ? next->lastSourceLocation() : identifierToken; }
2169
2170 // attributes
2171     UiQualifiedId *next;
2172     QStringRef name;
2173     SourceLocation identifierToken;
2174 };
2175
2176 class QML_PARSER_EXPORT UiImport: public Node
2177 {
2178 public:
2179     QDECLARATIVEJS_DECLARE_AST_NODE(UiImport)
2180
2181     UiImport(const QStringRef &fileName)
2182         : fileName(fileName), importUri(0)
2183     { kind = K; }
2184
2185     UiImport(UiQualifiedId *uri)
2186         : importUri(uri)
2187     { kind = K; }
2188
2189     virtual void accept0(Visitor *visitor);
2190
2191     virtual SourceLocation firstSourceLocation() const
2192     { return importToken; }
2193
2194     virtual SourceLocation lastSourceLocation() const
2195     { return semicolonToken; }
2196
2197 // attributes
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;
2207 };
2208
2209 class QML_PARSER_EXPORT UiImportList: public Node
2210 {
2211 public:
2212     QDECLARATIVEJS_DECLARE_AST_NODE(UiImportList)
2213
2214     UiImportList(UiImport *import)
2215         : import(import),
2216           next(this)
2217     { kind = K; }
2218
2219     UiImportList(UiImportList *previous, UiImport *import)
2220         : import(import)
2221     {
2222         kind = K;
2223         next = previous->next;
2224         previous->next = this;
2225     }
2226
2227     UiImportList *finish()
2228     {
2229         UiImportList *head = next;
2230         next = 0;
2231         return head;
2232     }
2233
2234     virtual void accept0(Visitor *visitor);
2235
2236     virtual SourceLocation firstSourceLocation() const
2237     { return import->firstSourceLocation(); }
2238
2239     virtual SourceLocation lastSourceLocation() const
2240     { return next ? next->lastSourceLocation() : import->lastSourceLocation(); }
2241
2242 // attributes
2243     UiImport *import;
2244     UiImportList *next;
2245 };
2246
2247 class QML_PARSER_EXPORT UiObjectMember: public Node
2248 {
2249 public:
2250     virtual SourceLocation firstSourceLocation() const = 0;
2251     virtual SourceLocation lastSourceLocation() const = 0;
2252
2253     virtual UiObjectMember *uiObjectMemberCast();
2254 };
2255
2256 class QML_PARSER_EXPORT UiObjectMemberList: public Node
2257 {
2258 public:
2259     QDECLARATIVEJS_DECLARE_AST_NODE(UiObjectMemberList)
2260
2261     UiObjectMemberList(UiObjectMember *member)
2262         : next(this), member(member)
2263     { kind = K; }
2264
2265     UiObjectMemberList(UiObjectMemberList *previous, UiObjectMember *member)
2266         : member(member)
2267     {
2268         kind = K;
2269         next = previous->next;
2270         previous->next = this;
2271     }
2272
2273     virtual void accept0(Visitor *visitor);
2274
2275     virtual SourceLocation firstSourceLocation() const
2276     { return member->firstSourceLocation(); }
2277
2278     virtual SourceLocation lastSourceLocation() const
2279     { return next ? next->lastSourceLocation() : member->lastSourceLocation(); }
2280
2281     UiObjectMemberList *finish()
2282     {
2283         UiObjectMemberList *head = next;
2284         next = 0;
2285         return head;
2286     }
2287
2288 // attributes
2289     UiObjectMemberList *next;
2290     UiObjectMember *member;
2291 };
2292
2293 class QML_PARSER_EXPORT UiProgram: public Node
2294 {
2295 public:
2296     QDECLARATIVEJS_DECLARE_AST_NODE(UiProgram)
2297
2298     UiProgram(UiImportList *imports, UiObjectMemberList *members)
2299         : imports(imports), members(members)
2300     { kind = K; }
2301
2302     virtual void accept0(Visitor *visitor);
2303
2304     virtual SourceLocation firstSourceLocation() const
2305     {
2306         if (imports)
2307             return imports->firstSourceLocation();
2308         else if (members)
2309             return members->firstSourceLocation();
2310         return SourceLocation();
2311     }
2312
2313     virtual SourceLocation lastSourceLocation() const
2314     {
2315         if (members)
2316             return members->lastSourceLocation();
2317         else if (imports)
2318             return imports->lastSourceLocation();
2319         return SourceLocation();
2320     }
2321
2322 // attributes
2323     UiImportList *imports;
2324     UiObjectMemberList *members;
2325 };
2326
2327 class QML_PARSER_EXPORT UiArrayMemberList: public Node
2328 {
2329 public:
2330     QDECLARATIVEJS_DECLARE_AST_NODE(UiArrayMemberList)
2331
2332     UiArrayMemberList(UiObjectMember *member)
2333         : next(this), member(member)
2334     { kind = K; }
2335
2336     UiArrayMemberList(UiArrayMemberList *previous, UiObjectMember *member)
2337         : member(member)
2338     {
2339         kind = K;
2340         next = previous->next;
2341         previous->next = this;
2342     }
2343
2344     virtual void accept0(Visitor *visitor);
2345
2346     virtual SourceLocation firstSourceLocation() const
2347     { return member->firstSourceLocation(); }
2348
2349     virtual SourceLocation lastSourceLocation() const
2350     { return next ? next->lastSourceLocation() : member->lastSourceLocation(); }
2351
2352     UiArrayMemberList *finish()
2353     {
2354         UiArrayMemberList *head = next;
2355         next = 0;
2356         return head;
2357     }
2358
2359 // attributes
2360     UiArrayMemberList *next;
2361     UiObjectMember *member;
2362     SourceLocation commaToken;
2363 };
2364
2365 class QML_PARSER_EXPORT UiObjectInitializer: public Node
2366 {
2367 public:
2368     QDECLARATIVEJS_DECLARE_AST_NODE(UiObjectInitializer)
2369
2370     UiObjectInitializer(UiObjectMemberList *members)
2371         : members(members)
2372     { kind = K; }
2373
2374     virtual void accept0(Visitor *visitor);
2375
2376     virtual SourceLocation firstSourceLocation() const
2377     { return lbraceToken; }
2378
2379     virtual SourceLocation lastSourceLocation() const
2380     { return rbraceToken; }
2381
2382 // attributes
2383     SourceLocation lbraceToken;
2384     UiObjectMemberList *members;
2385     SourceLocation rbraceToken;
2386 };
2387
2388 class QML_PARSER_EXPORT UiParameterList: public Node
2389 {
2390 public:
2391     QDECLARATIVEJS_DECLARE_AST_NODE(UiParameterList)
2392
2393     UiParameterList(const QStringRef &t, const QStringRef &n):
2394         type (t), name (n), next (this)
2395         { kind = K; }
2396
2397     UiParameterList(UiParameterList *previous, const QStringRef &t, const QStringRef &n):
2398         type (t), name (n)
2399     {
2400         kind = K;
2401         next = previous->next;
2402         previous->next = this;
2403     }
2404
2405     virtual void accept0(Visitor *) {}
2406
2407     virtual SourceLocation firstSourceLocation() const
2408     { return propertyTypeToken; }
2409
2410     virtual SourceLocation lastSourceLocation() const
2411     { return next ? next->lastSourceLocation() : identifierToken; }
2412
2413     inline UiParameterList *finish ()
2414     {
2415         UiParameterList *front = next;
2416         next = 0;
2417         return front;
2418     }
2419
2420 // attributes
2421     QStringRef type;
2422     QStringRef name;
2423     UiParameterList *next;
2424     SourceLocation commaToken;
2425     SourceLocation propertyTypeToken;
2426     SourceLocation identifierToken;
2427 };
2428
2429 class QML_PARSER_EXPORT UiPublicMember: public UiObjectMember
2430 {
2431 public:
2432     QDECLARATIVEJS_DECLARE_AST_NODE(UiPublicMember)
2433
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)
2437     { kind = K; }
2438
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)
2443     { kind = K; }
2444
2445     virtual void accept0(Visitor *visitor);
2446
2447     virtual SourceLocation firstSourceLocation() const
2448     {
2449       if (defaultToken.isValid())
2450         return defaultToken;
2451       else if (readonlyToken.isValid())
2452           return readonlyToken;
2453
2454       return propertyToken;
2455     }
2456
2457     virtual SourceLocation lastSourceLocation() const
2458     {
2459       if (binding)
2460           return binding->lastSourceLocation();
2461       if (statement)
2462           return statement->lastSourceLocation();
2463
2464       return semicolonToken;
2465     }
2466
2467 // attributes
2468     enum { Signal, Property } type;
2469     QStringRef typeModifier;
2470     QStringRef memberType;
2471     QStringRef name;
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;
2485 };
2486
2487 class QML_PARSER_EXPORT UiObjectDefinition: public UiObjectMember
2488 {
2489 public:
2490     QDECLARATIVEJS_DECLARE_AST_NODE(UiObjectDefinition)
2491
2492     UiObjectDefinition(UiQualifiedId *qualifiedTypeNameId,
2493                        UiObjectInitializer *initializer)
2494         : qualifiedTypeNameId(qualifiedTypeNameId), initializer(initializer)
2495     { kind = K; }
2496
2497     virtual void accept0(Visitor *visitor);
2498
2499     virtual SourceLocation firstSourceLocation() const
2500     { return qualifiedTypeNameId->identifierToken; }
2501
2502     virtual SourceLocation lastSourceLocation() const
2503     { return initializer->rbraceToken; }
2504
2505 // attributes
2506     UiQualifiedId *qualifiedTypeNameId;
2507     UiObjectInitializer *initializer;
2508 };
2509
2510 class QML_PARSER_EXPORT UiSourceElement: public UiObjectMember
2511 {
2512 public:
2513     QDECLARATIVEJS_DECLARE_AST_NODE(UiSourceElement)
2514
2515     UiSourceElement(Node *sourceElement)
2516         : sourceElement(sourceElement)
2517     { kind = K; }
2518
2519     virtual SourceLocation firstSourceLocation() const
2520     {
2521       if (FunctionDeclaration *funDecl = cast<FunctionDeclaration *>(sourceElement))
2522         return funDecl->firstSourceLocation();
2523       else if (VariableStatement *varStmt = cast<VariableStatement *>(sourceElement))
2524         return varStmt->firstSourceLocation();
2525
2526       return SourceLocation();
2527     }
2528
2529     virtual SourceLocation lastSourceLocation() const
2530     {
2531       if (FunctionDeclaration *funDecl = cast<FunctionDeclaration *>(sourceElement))
2532         return funDecl->lastSourceLocation();
2533       else if (VariableStatement *varStmt = cast<VariableStatement *>(sourceElement))
2534         return varStmt->lastSourceLocation();
2535
2536       return SourceLocation();
2537     }
2538
2539     virtual void accept0(Visitor *visitor);
2540
2541
2542 // attributes
2543     Node *sourceElement;
2544 };
2545
2546 class QML_PARSER_EXPORT UiObjectBinding: public UiObjectMember
2547 {
2548 public:
2549     QDECLARATIVEJS_DECLARE_AST_NODE(UiObjectBinding)
2550
2551     UiObjectBinding(UiQualifiedId *qualifiedId,
2552                     UiQualifiedId *qualifiedTypeNameId,
2553                     UiObjectInitializer *initializer)
2554         : qualifiedId(qualifiedId),
2555           qualifiedTypeNameId(qualifiedTypeNameId),
2556           initializer(initializer),
2557           hasOnToken(false)
2558     { kind = K; }
2559
2560     virtual SourceLocation firstSourceLocation() const
2561     {
2562         if (hasOnToken && qualifiedTypeNameId)
2563             return qualifiedTypeNameId->identifierToken;
2564
2565         return qualifiedId->identifierToken;
2566     }
2567
2568     virtual SourceLocation lastSourceLocation() const
2569     { return initializer->rbraceToken; }
2570
2571     virtual void accept0(Visitor *visitor);
2572
2573
2574 // attributes
2575     UiQualifiedId *qualifiedId;
2576     UiQualifiedId *qualifiedTypeNameId;
2577     UiObjectInitializer *initializer;
2578     SourceLocation colonToken;
2579     bool hasOnToken;
2580 };
2581
2582 class QML_PARSER_EXPORT UiScriptBinding: public UiObjectMember
2583 {
2584 public:
2585     QDECLARATIVEJS_DECLARE_AST_NODE(UiScriptBinding)
2586
2587     UiScriptBinding(UiQualifiedId *qualifiedId,
2588                     Statement *statement)
2589         : qualifiedId(qualifiedId),
2590           statement(statement)
2591     { kind = K; }
2592
2593     virtual SourceLocation firstSourceLocation() const
2594     { return qualifiedId->identifierToken; }
2595
2596     virtual SourceLocation lastSourceLocation() const
2597     { return statement->lastSourceLocation(); }
2598
2599     virtual void accept0(Visitor *visitor);
2600
2601 // attributes
2602     UiQualifiedId *qualifiedId;
2603     Statement *statement;
2604     SourceLocation colonToken;
2605 };
2606
2607 class QML_PARSER_EXPORT UiArrayBinding: public UiObjectMember
2608 {
2609 public:
2610     QDECLARATIVEJS_DECLARE_AST_NODE(UiArrayBinding)
2611
2612     UiArrayBinding(UiQualifiedId *qualifiedId,
2613                    UiArrayMemberList *members)
2614         : qualifiedId(qualifiedId),
2615           members(members)
2616     { kind = K; }
2617
2618     virtual SourceLocation firstSourceLocation() const
2619     { return qualifiedId->identifierToken; }
2620
2621     virtual SourceLocation lastSourceLocation() const
2622     { return rbracketToken; }
2623
2624     virtual void accept0(Visitor *visitor);
2625
2626 // attributes
2627     UiQualifiedId *qualifiedId;
2628     UiArrayMemberList *members;
2629     SourceLocation colonToken;
2630     SourceLocation lbracketToken;
2631     SourceLocation rbracketToken;
2632 };
2633
2634 } } // namespace AST
2635
2636
2637
2638 QT_QML_END_NAMESPACE
2639
2640 #endif