OSDN Git Service

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