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