1 /****************************************************************************
2 **
3 ** Copyright (C) 2015 The Qt Company Ltd.
4 ** Contact: http://www.qt.io/licensing/
5 **
6 ** This file is part of the QtDeclarative module of the Qt Toolkit.
7 **
8 ** $QT_BEGIN_LICENSE:LGPL$
9 ** Commercial License Usage
10 ** Licensees holding valid commercial Qt licenses may use this file in
11 ** accordance with the commercial license agreement provided with the
12 ** Software or, alternatively, in accordance with the terms contained in
13 ** a written agreement between you and The Qt Company. For licensing terms
14 ** and conditions see http://www.qt.io/terms-conditions. For further
15 ** information use the contact form at http://www.qt.io/contact-us.
16 **
17 ** GNU Lesser General Public License Usage
18 ** Alternatively, this file may be used under the terms of the GNU Lesser
19 ** General Public License version 2.1 or version 3 as published by the Free
20 ** Software Foundation and appearing in the file LICENSE.LGPLv21 and
21 ** LICENSE.LGPLv3 included in the packaging of this file. Please review the
22 ** following information to ensure the GNU Lesser General Public License
23 ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and
24 ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
25 **
26 ** As a special exception, The Qt Company gives you certain additional
27 ** rights. These rights are described in The Qt Company LGPL Exception
28 ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
29 **
30 ** GNU General Public License Usage
31 ** Alternatively, this file may be used under the terms of the GNU
32 ** General Public License version 3.0 as published by the Free Software
33 ** Foundation and appearing in the file LICENSE.GPL included in the
34 ** packaging of this file.  Please review the following information to
35 ** ensure the GNU General Public License version 3.0 requirements will be
36 ** met: http://www.gnu.org/copyleft/gpl.html.
37 **
38 ** $QT_END_LICENSE$
39 **
40 ****************************************************************************/
41 
42 #ifndef QDECLARATIVEJSAST_P_H
43 #define QDECLARATIVEJSAST_P_H
44 
45 //
46 //  W A R N I N G
47 //  -------------
48 //
49 // This file is not part of the Qt API.  It exists purely as an
50 // implementation detail.  This header file may change from version to
51 // version without notice, or even be removed.
52 //
53 // We mean it.
54 //
55 
56 #include "qdeclarativejsastvisitor_p.h"
57 #include "qdeclarativejsglobal_p.h"
58 
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>
cast(_T2 * ast)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 
Node()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)
~Node()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 
acceptChild(Node * node,Visitor * visitor)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:
ExpressionNode()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:
Statement()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:
QDECLARATIVEJS_DECLARE_AST_NODE(UiFormal)274     QDECLARATIVEJS_DECLARE_AST_NODE(UiFormal)
275 
276     UiFormal(NameId *name, NameId *alias = 0)
277       : name(name), alias(alias)
278     { }
279 
firstSourceLocation()280     virtual SourceLocation firstSourceLocation() const
281     { return SourceLocation(); }
282 
lastSourceLocation()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:
QDECLARATIVEJS_DECLARE_AST_NODE(UiFormalList)299     QDECLARATIVEJS_DECLARE_AST_NODE(UiFormalList)
300 
301     UiFormalList(UiFormal *formal)
302             : formal(formal), next(this) {}
303 
UiFormalList(UiFormalList * previous,UiFormal * formal)304     UiFormalList(UiFormalList *previous, UiFormal *formal)
305             : formal(formal)
306     {
307         next = previous->next;
308         previous->next = this;
309     }
310 
finish()311     UiFormalList *finish()
312     {
313         UiFormalList *head = next;
314         next = 0;
315         return head;
316     }
317 
firstSourceLocation()318     virtual SourceLocation firstSourceLocation() const
319     { return SourceLocation(); }
320 
lastSourceLocation()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:
QDECLARATIVEJS_DECLARE_AST_NODE(UiSignature)334     QDECLARATIVEJS_DECLARE_AST_NODE(UiSignature)
335 
336     UiSignature(UiFormalList *formals = 0)
337         : formals(formals)
338     { }
339 
firstSourceLocation()340     virtual SourceLocation firstSourceLocation() const
341     { return SourceLocation(); }
342 
lastSourceLocation()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:
QDECLARATIVEJS_DECLARE_AST_NODE(NestedExpression)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 
firstSourceLocation()365     virtual SourceLocation firstSourceLocation() const
366     { return lparenToken; }
367 
lastSourceLocation()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:
QDECLARATIVEJS_DECLARE_AST_NODE(ThisExpression)380     QDECLARATIVEJS_DECLARE_AST_NODE(ThisExpression)
381 
382     ThisExpression() { kind = K; }
383 
384     virtual void accept0(Visitor *visitor);
385 
firstSourceLocation()386     virtual SourceLocation firstSourceLocation() const
387     { return thisToken; }
388 
lastSourceLocation()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:
QDECLARATIVEJS_DECLARE_AST_NODE(IdentifierExpression)399     QDECLARATIVEJS_DECLARE_AST_NODE(IdentifierExpression)
400 
401     IdentifierExpression(NameId *n):
402         name (n) { kind = K; }
403 
404     virtual void accept0(Visitor *visitor);
405 
firstSourceLocation()406     virtual SourceLocation firstSourceLocation() const
407     { return identifierToken; }
408 
lastSourceLocation()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:
QDECLARATIVEJS_DECLARE_AST_NODE(NullExpression)420     QDECLARATIVEJS_DECLARE_AST_NODE(NullExpression)
421 
422     NullExpression() { kind = K; }
423 
424     virtual void accept0(Visitor *visitor);
425 
firstSourceLocation()426     virtual SourceLocation firstSourceLocation() const
427     { return nullToken; }
428 
lastSourceLocation()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:
QDECLARATIVEJS_DECLARE_AST_NODE(TrueLiteral)439     QDECLARATIVEJS_DECLARE_AST_NODE(TrueLiteral)
440 
441     TrueLiteral() { kind = K; }
442 
443     virtual void accept0(Visitor *visitor);
444 
firstSourceLocation()445     virtual SourceLocation firstSourceLocation() const
446     { return trueToken; }
447 
lastSourceLocation()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:
QDECLARATIVEJS_DECLARE_AST_NODE(FalseLiteral)458     QDECLARATIVEJS_DECLARE_AST_NODE(FalseLiteral)
459 
460     FalseLiteral() { kind = K; }
461 
462     virtual void accept0(Visitor *visitor);
463 
firstSourceLocation()464     virtual SourceLocation firstSourceLocation() const
465     { return falseToken; }
466 
lastSourceLocation()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:
QDECLARATIVEJS_DECLARE_AST_NODE(NumericLiteral)477     QDECLARATIVEJS_DECLARE_AST_NODE(NumericLiteral)
478 
479     NumericLiteral(double v):
480         value(v) { kind = K; }
481 
482     virtual void accept0(Visitor *visitor);
483 
firstSourceLocation()484     virtual SourceLocation firstSourceLocation() const
485     { return literalToken; }
486 
lastSourceLocation()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:
QDECLARATIVEJS_DECLARE_AST_NODE(StringLiteral)498     QDECLARATIVEJS_DECLARE_AST_NODE(StringLiteral)
499 
500     StringLiteral(NameId *v):
501         value (v) { kind = K; }
502 
503     virtual void accept0(Visitor *visitor);
504 
firstSourceLocation()505     virtual SourceLocation firstSourceLocation() const
506     { return literalToken; }
507 
lastSourceLocation()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:
QDECLARATIVEJS_DECLARE_AST_NODE(RegExpLiteral)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 
firstSourceLocation()526     virtual SourceLocation firstSourceLocation() const
527     { return literalToken; }
528 
lastSourceLocation()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:
QDECLARATIVEJS_DECLARE_AST_NODE(ArrayLiteral)541     QDECLARATIVEJS_DECLARE_AST_NODE(ArrayLiteral)
542 
543     ArrayLiteral(Elision *e):
544         elements (0), elision (e)
545         { kind = K; }
546 
ArrayLiteral(ElementList * elts)547     ArrayLiteral(ElementList *elts):
548         elements (elts), elision (0)
549         { kind = K; }
550 
ArrayLiteral(ElementList * elts,Elision * e)551     ArrayLiteral(ElementList *elts, Elision *e):
552         elements (elts), elision (e)
553         { kind = K; }
554 
555     virtual void accept0(Visitor *visitor);
556 
firstSourceLocation()557     virtual SourceLocation firstSourceLocation() const
558     { return lbracketToken; }
559 
lastSourceLocation()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:
QDECLARATIVEJS_DECLARE_AST_NODE(ObjectLiteral)574     QDECLARATIVEJS_DECLARE_AST_NODE(ObjectLiteral)
575 
576     ObjectLiteral():
577         properties (0) { kind = K; }
578 
ObjectLiteral(PropertyNameAndValueList * plist)579     ObjectLiteral(PropertyNameAndValueList *plist):
580         properties (plist) { kind = K; }
581 
582     virtual void accept0(Visitor *visitor);
583 
firstSourceLocation()584     virtual SourceLocation firstSourceLocation() const
585     { return lbraceToken; }
586 
lastSourceLocation()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:
QDECLARATIVEJS_DECLARE_AST_NODE(ElementList)599     QDECLARATIVEJS_DECLARE_AST_NODE(ElementList)
600 
601     ElementList(Elision *e, ExpressionNode *expr):
602         elision (e), expression (expr), next (this)
603     { kind = K; }
604 
ElementList(ElementList * previous,Elision * e,ExpressionNode * expr)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 
finish()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:
QDECLARATIVEJS_DECLARE_AST_NODE(Elision)632     QDECLARATIVEJS_DECLARE_AST_NODE(Elision)
633 
634     Elision():
635         next (this) { kind = K; }
636 
Elision(Elision * previous)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 
finish()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:
QDECLARATIVEJS_DECLARE_AST_NODE(PropertyNameAndValueList)661     QDECLARATIVEJS_DECLARE_AST_NODE(PropertyNameAndValueList)
662 
663     PropertyNameAndValueList(PropertyName *n, ExpressionNode *v):
664         name (n), value (v), next (this)
665         { kind = K; }
666 
PropertyNameAndValueList(PropertyNameAndValueList * previous,PropertyName * n,ExpressionNode * v)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 
finish()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:
QDECLARATIVEJS_DECLARE_AST_NODE(PropertyName)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:
QDECLARATIVEJS_DECLARE_AST_NODE(IdentifierPropertyName)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:
QDECLARATIVEJS_DECLARE_AST_NODE(StringLiteralPropertyName)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:
QDECLARATIVEJS_DECLARE_AST_NODE(NumericLiteralPropertyName)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:
QDECLARATIVEJS_DECLARE_AST_NODE(ArrayMemberExpression)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 
firstSourceLocation()756     virtual SourceLocation firstSourceLocation() const
757     { return base->firstSourceLocation(); }
758 
lastSourceLocation()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:
QDECLARATIVEJS_DECLARE_AST_NODE(FieldMemberExpression)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 
firstSourceLocation()780     virtual SourceLocation firstSourceLocation() const
781     { return base->firstSourceLocation(); }
782 
lastSourceLocation()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:
QDECLARATIVEJS_DECLARE_AST_NODE(NewMemberExpression)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 
firstSourceLocation()804     virtual SourceLocation firstSourceLocation() const
805     { return newToken; }
806 
lastSourceLocation()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:
QDECLARATIVEJS_DECLARE_AST_NODE(NewExpression)821     QDECLARATIVEJS_DECLARE_AST_NODE(NewExpression)
822 
823     NewExpression(ExpressionNode *e):
824         expression (e) { kind = K; }
825 
826     virtual void accept0(Visitor *visitor);
827 
firstSourceLocation()828     virtual SourceLocation firstSourceLocation() const
829     { return newToken; }
830 
lastSourceLocation()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:
QDECLARATIVEJS_DECLARE_AST_NODE(CallExpression)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 
firstSourceLocation()850     virtual SourceLocation firstSourceLocation() const
851     { return base->firstSourceLocation(); }
852 
lastSourceLocation()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:
QDECLARATIVEJS_DECLARE_AST_NODE(ArgumentList)866     QDECLARATIVEJS_DECLARE_AST_NODE(ArgumentList)
867 
868     ArgumentList(ExpressionNode *e):
869         expression (e), next (this)
870         { kind = K; }
871 
ArgumentList(ArgumentList * previous,ExpressionNode * e)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 
finish()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:
QDECLARATIVEJS_DECLARE_AST_NODE(PostIncrementExpression)898     QDECLARATIVEJS_DECLARE_AST_NODE(PostIncrementExpression)
899 
900     PostIncrementExpression(ExpressionNode *b):
901         base (b) { kind = K; }
902 
903     virtual void accept0(Visitor *visitor);
904 
firstSourceLocation()905     virtual SourceLocation firstSourceLocation() const
906     { return base->firstSourceLocation(); }
907 
lastSourceLocation()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:
QDECLARATIVEJS_DECLARE_AST_NODE(PostDecrementExpression)919     QDECLARATIVEJS_DECLARE_AST_NODE(PostDecrementExpression)
920 
921     PostDecrementExpression(ExpressionNode *b):
922         base (b) { kind = K; }
923 
924     virtual void accept0(Visitor *visitor);
925 
firstSourceLocation()926     virtual SourceLocation firstSourceLocation() const
927     { return base->firstSourceLocation(); }
928 
lastSourceLocation()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:
QDECLARATIVEJS_DECLARE_AST_NODE(DeleteExpression)940     QDECLARATIVEJS_DECLARE_AST_NODE(DeleteExpression)
941 
942     DeleteExpression(ExpressionNode *e):
943         expression (e) { kind = K; }
944 
945     virtual void accept0(Visitor *visitor);
946 
firstSourceLocation()947     virtual SourceLocation firstSourceLocation() const
948     { return deleteToken; }
949 
lastSourceLocation()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:
QDECLARATIVEJS_DECLARE_AST_NODE(VoidExpression)961     QDECLARATIVEJS_DECLARE_AST_NODE(VoidExpression)
962 
963     VoidExpression(ExpressionNode *e):
964         expression (e) { kind = K; }
965 
966     virtual void accept0(Visitor *visitor);
967 
firstSourceLocation()968     virtual SourceLocation firstSourceLocation() const
969     { return voidToken; }
970 
lastSourceLocation()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:
QDECLARATIVEJS_DECLARE_AST_NODE(TypeOfExpression)982     QDECLARATIVEJS_DECLARE_AST_NODE(TypeOfExpression)
983 
984     TypeOfExpression(ExpressionNode *e):
985         expression (e) { kind = K; }
986 
987     virtual void accept0(Visitor *visitor);
988 
firstSourceLocation()989     virtual SourceLocation firstSourceLocation() const
990     { return typeofToken; }
991 
lastSourceLocation()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:
QDECLARATIVEJS_DECLARE_AST_NODE(PreIncrementExpression)1003     QDECLARATIVEJS_DECLARE_AST_NODE(PreIncrementExpression)
1004 
1005     PreIncrementExpression(ExpressionNode *e):
1006         expression (e) { kind = K; }
1007 
1008     virtual void accept0(Visitor *visitor);
1009 
firstSourceLocation()1010     virtual SourceLocation firstSourceLocation() const
1011     { return incrementToken; }
1012 
lastSourceLocation()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:
QDECLARATIVEJS_DECLARE_AST_NODE(PreDecrementExpression)1024     QDECLARATIVEJS_DECLARE_AST_NODE(PreDecrementExpression)
1025 
1026     PreDecrementExpression(ExpressionNode *e):
1027         expression (e) { kind = K; }
1028 
1029     virtual void accept0(Visitor *visitor);
1030 
firstSourceLocation()1031     virtual SourceLocation firstSourceLocation() const
1032     { return decrementToken; }
1033 
lastSourceLocation()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:
QDECLARATIVEJS_DECLARE_AST_NODE(UnaryPlusExpression)1045     QDECLARATIVEJS_DECLARE_AST_NODE(UnaryPlusExpression)
1046 
1047     UnaryPlusExpression(ExpressionNode *e):
1048         expression (e) { kind = K; }
1049 
1050     virtual void accept0(Visitor *visitor);
1051 
firstSourceLocation()1052     virtual SourceLocation firstSourceLocation() const
1053     { return plusToken; }
1054 
lastSourceLocation()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:
QDECLARATIVEJS_DECLARE_AST_NODE(UnaryMinusExpression)1066     QDECLARATIVEJS_DECLARE_AST_NODE(UnaryMinusExpression)
1067 
1068     UnaryMinusExpression(ExpressionNode *e):
1069         expression (e) { kind = K; }
1070 
1071     virtual void accept0(Visitor *visitor);
1072 
firstSourceLocation()1073     virtual SourceLocation firstSourceLocation() const
1074     { return minusToken; }
1075 
lastSourceLocation()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:
QDECLARATIVEJS_DECLARE_AST_NODE(TildeExpression)1087     QDECLARATIVEJS_DECLARE_AST_NODE(TildeExpression)
1088 
1089     TildeExpression(ExpressionNode *e):
1090         expression (e) { kind = K; }
1091 
1092     virtual void accept0(Visitor *visitor);
1093 
firstSourceLocation()1094     virtual SourceLocation firstSourceLocation() const
1095     { return tildeToken; }
1096 
lastSourceLocation()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:
QDECLARATIVEJS_DECLARE_AST_NODE(NotExpression)1108     QDECLARATIVEJS_DECLARE_AST_NODE(NotExpression)
1109 
1110     NotExpression(ExpressionNode *e):
1111         expression (e) { kind = K; }
1112 
1113     virtual void accept0(Visitor *visitor);
1114 
firstSourceLocation()1115     virtual SourceLocation firstSourceLocation() const
1116     { return notToken; }
1117 
lastSourceLocation()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:
QDECLARATIVEJS_DECLARE_AST_NODE(BinaryExpression)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 
firstSourceLocation()1139     virtual SourceLocation firstSourceLocation() const
1140     { return left->firstSourceLocation(); }
1141 
lastSourceLocation()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:
QDECLARATIVEJS_DECLARE_AST_NODE(ConditionalExpression)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 
firstSourceLocation()1163     virtual SourceLocation firstSourceLocation() const
1164     { return expression->firstSourceLocation(); }
1165 
lastSourceLocation()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:
QDECLARATIVEJS_DECLARE_AST_NODE(Expression)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 
firstSourceLocation()1187     virtual SourceLocation firstSourceLocation() const
1188     { return left->firstSourceLocation(); }
1189 
lastSourceLocation()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:
QDECLARATIVEJS_DECLARE_AST_NODE(Block)1202     QDECLARATIVEJS_DECLARE_AST_NODE(Block)
1203 
1204     Block(StatementList *slist):
1205         statements (slist) { kind = K; }
1206 
1207     virtual void accept0(Visitor *visitor);
1208 
firstSourceLocation()1209     virtual SourceLocation firstSourceLocation() const
1210     { return lbraceToken; }
1211 
lastSourceLocation()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:
QDECLARATIVEJS_DECLARE_AST_NODE(StatementList)1224     QDECLARATIVEJS_DECLARE_AST_NODE(StatementList)
1225 
1226     StatementList(Statement *stmt):
1227         statement (stmt), next (this)
1228         { kind = K; }
1229 
StatementList(StatementList * previous,Statement * stmt)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 
finish()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:
QDECLARATIVEJS_DECLARE_AST_NODE(VariableStatement)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 
firstSourceLocation()1263     virtual SourceLocation firstSourceLocation() const
1264     { return declarationKindToken; }
1265 
lastSourceLocation()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:
QDECLARATIVEJS_DECLARE_AST_NODE(VariableDeclaration)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:
QDECLARATIVEJS_DECLARE_AST_NODE(VariableDeclarationList)1296     QDECLARATIVEJS_DECLARE_AST_NODE(VariableDeclarationList)
1297 
1298     VariableDeclarationList(VariableDeclaration *decl):
1299         declaration (decl), next (this)
1300         { kind = K; }
1301 
VariableDeclarationList(VariableDeclarationList * previous,VariableDeclaration * decl)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 
finish(bool readOnly)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:
QDECLARATIVEJS_DECLARE_AST_NODE(EmptyStatement)1333     QDECLARATIVEJS_DECLARE_AST_NODE(EmptyStatement)
1334 
1335     EmptyStatement() { kind = K; }
1336 
1337     virtual void accept0(Visitor *visitor);
1338 
firstSourceLocation()1339     virtual SourceLocation firstSourceLocation() const
1340     { return semicolonToken; }
1341 
lastSourceLocation()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:
QDECLARATIVEJS_DECLARE_AST_NODE(ExpressionStatement)1352     QDECLARATIVEJS_DECLARE_AST_NODE(ExpressionStatement)
1353 
1354     ExpressionStatement(ExpressionNode *e):
1355         expression (e) { kind = K; }
1356 
1357     virtual void accept0(Visitor *visitor);
1358 
firstSourceLocation()1359     virtual SourceLocation firstSourceLocation() const
1360     { return expression->firstSourceLocation(); }
1361 
lastSourceLocation()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:
QDECLARATIVEJS_DECLARE_AST_NODE(IfStatement)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 
firstSourceLocation()1381     virtual SourceLocation firstSourceLocation() const
1382     { return ifToken; }
1383 
lastSourceLocation()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:
QDECLARATIVEJS_DECLARE_AST_NODE(DoWhileStatement)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 
firstSourceLocation()1413     virtual SourceLocation firstSourceLocation() const
1414     { return doToken; }
1415 
lastSourceLocation()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:
QDECLARATIVEJS_DECLARE_AST_NODE(WhileStatement)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 
firstSourceLocation()1440     virtual SourceLocation firstSourceLocation() const
1441     { return whileToken; }
1442 
lastSourceLocation()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:
QDECLARATIVEJS_DECLARE_AST_NODE(ForStatement)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 
firstSourceLocation()1465     virtual SourceLocation firstSourceLocation() const
1466     { return forToken; }
1467 
lastSourceLocation()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:
QDECLARATIVEJS_DECLARE_AST_NODE(LocalForStatement)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 
firstSourceLocation()1494     virtual SourceLocation firstSourceLocation() const
1495     { return forToken; }
1496 
lastSourceLocation()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:
QDECLARATIVEJS_DECLARE_AST_NODE(ForEachStatement)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 
firstSourceLocation()1524     virtual SourceLocation firstSourceLocation() const
1525     { return forToken; }
1526 
lastSourceLocation()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:
QDECLARATIVEJS_DECLARE_AST_NODE(LocalForEachStatement)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 
firstSourceLocation()1551     virtual SourceLocation firstSourceLocation() const
1552     { return forToken; }
1553 
lastSourceLocation()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:
QDECLARATIVEJS_DECLARE_AST_NODE(ContinueStatement)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 
firstSourceLocation()1578     virtual SourceLocation firstSourceLocation() const
1579     { return continueToken; }
1580 
lastSourceLocation()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:
QDECLARATIVEJS_DECLARE_AST_NODE(BreakStatement)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 
firstSourceLocation()1601     virtual SourceLocation firstSourceLocation() const
1602     { return breakToken; }
1603 
lastSourceLocation()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:
QDECLARATIVEJS_DECLARE_AST_NODE(ReturnStatement)1617     QDECLARATIVEJS_DECLARE_AST_NODE(ReturnStatement)
1618 
1619     ReturnStatement(ExpressionNode *e):
1620         expression (e) { kind = K; }
1621 
1622     virtual void accept0(Visitor *visitor);
1623 
firstSourceLocation()1624     virtual SourceLocation firstSourceLocation() const
1625     { return returnToken; }
1626 
lastSourceLocation()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:
QDECLARATIVEJS_DECLARE_AST_NODE(WithStatement)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 
firstSourceLocation()1647     virtual SourceLocation firstSourceLocation() const
1648     { return withToken; }
1649 
lastSourceLocation()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:
QDECLARATIVEJS_DECLARE_AST_NODE(CaseBlock)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:
QDECLARATIVEJS_DECLARE_AST_NODE(SwitchStatement)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 
firstSourceLocation()1691     virtual SourceLocation firstSourceLocation() const
1692     { return switchToken; }
1693 
lastSourceLocation()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:
QDECLARATIVEJS_DECLARE_AST_NODE(CaseClauses)1708     QDECLARATIVEJS_DECLARE_AST_NODE(CaseClauses)
1709 
1710     CaseClauses(CaseClause *c):
1711         clause (c), next (this)
1712         { kind = K; }
1713 
CaseClauses(CaseClauses * previous,CaseClause * c)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 
finish()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:
QDECLARATIVEJS_DECLARE_AST_NODE(CaseClause)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:
QDECLARATIVEJS_DECLARE_AST_NODE(DefaultClause)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:
QDECLARATIVEJS_DECLARE_AST_NODE(LabelledStatement)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 
firstSourceLocation()1782     virtual SourceLocation firstSourceLocation() const
1783     { return identifierToken; }
1784 
lastSourceLocation()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:
QDECLARATIVEJS_DECLARE_AST_NODE(ThrowStatement)1798     QDECLARATIVEJS_DECLARE_AST_NODE(ThrowStatement)
1799 
1800     ThrowStatement(ExpressionNode *e):
1801         expression (e) { kind = K; }
1802 
1803     virtual void accept0(Visitor *visitor);
1804 
firstSourceLocation()1805     virtual SourceLocation firstSourceLocation() const
1806     { return throwToken; }
1807 
lastSourceLocation()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:
QDECLARATIVEJS_DECLARE_AST_NODE(Catch)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:
QDECLARATIVEJS_DECLARE_AST_NODE(Finally)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:
QDECLARATIVEJS_DECLARE_AST_NODE(TryStatement)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 
TryStatement(Statement * stmt,Finally * f)1862     TryStatement(Statement *stmt, Finally *f):
1863         statement (stmt), catchExpression (0), finallyExpression (f)
1864         { kind = K; }
1865 
TryStatement(Statement * stmt,Catch * c)1866     TryStatement(Statement *stmt, Catch *c):
1867         statement (stmt), catchExpression (c), finallyExpression (0)
1868         { kind = K; }
1869 
1870     virtual void accept0(Visitor *visitor);
1871 
firstSourceLocation()1872     virtual SourceLocation firstSourceLocation() const
1873     { return tryToken; }
1874 
lastSourceLocation()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:
QDECLARATIVEJS_DECLARE_AST_NODE(FunctionExpression)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 
firstSourceLocation()1903     virtual SourceLocation firstSourceLocation() const
1904     { return functionToken; }
1905 
lastSourceLocation()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:
QDECLARATIVEJS_DECLARE_AST_NODE(FunctionDeclaration)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:
QDECLARATIVEJS_DECLARE_AST_NODE(FormalParameterList)1936     QDECLARATIVEJS_DECLARE_AST_NODE(FormalParameterList)
1937 
1938     FormalParameterList(NameId *n):
1939         name (n), next (this)
1940         { kind = K; }
1941 
FormalParameterList(FormalParameterList * previous,NameId * n)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 
finish()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:
QDECLARATIVEJS_DECLARE_AST_NODE(FunctionBody)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:
QDECLARATIVEJS_DECLARE_AST_NODE(Program)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:
QDECLARATIVEJS_DECLARE_AST_NODE(SourceElements)1999     QDECLARATIVEJS_DECLARE_AST_NODE(SourceElements)
2000 
2001     SourceElements(SourceElement *elt):
2002         element (elt), next (this)
2003         { kind = K; }
2004 
SourceElements(SourceElements * previous,SourceElement * elt)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 
finish()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:
QDECLARATIVEJS_DECLARE_AST_NODE(SourceElement)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:
QDECLARATIVEJS_DECLARE_AST_NODE(FunctionSourceElement)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:
QDECLARATIVEJS_DECLARE_AST_NODE(StatementSourceElement)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:
QDECLARATIVEJS_DECLARE_AST_NODE(DebuggerStatement)2069     QDECLARATIVEJS_DECLARE_AST_NODE(DebuggerStatement)
2070 
2071     DebuggerStatement()
2072         { kind = K; }
2073 
2074     virtual void accept0(Visitor *visitor);
2075 
firstSourceLocation()2076     virtual SourceLocation firstSourceLocation() const
2077     { return debuggerToken; }
2078 
lastSourceLocation()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:
QDECLARATIVEJS_DECLARE_AST_NODE(UiProgram)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:
QDECLARATIVEJS_DECLARE_AST_NODE(UiQualifiedId)2106     QDECLARATIVEJS_DECLARE_AST_NODE(UiQualifiedId)
2107 
2108     UiQualifiedId(NameId *name)
2109         : next(this), name(name)
2110     { kind = K; }
2111 
UiQualifiedId(UiQualifiedId * previous,NameId * name)2112     UiQualifiedId(UiQualifiedId *previous, NameId *name)
2113         : name(name)
2114     {
2115         kind = K;
2116         next = previous->next;
2117         previous->next = this;
2118     }
2119 
finish()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:
QDECLARATIVEJS_DECLARE_AST_NODE(UiImport)2138     QDECLARATIVEJS_DECLARE_AST_NODE(UiImport)
2139 
2140     UiImport(NameId *fileName)
2141         : fileName(fileName), importUri(0), importId(0)
2142     { kind = K; }
2143 
UiImport(UiQualifiedId * uri)2144     UiImport(UiQualifiedId *uri)
2145         : fileName(0), importUri(uri), importId(0)
2146     { kind = K; }
2147 
firstSourceLocation()2148     virtual SourceLocation firstSourceLocation() const
2149     { return importToken; }
2150 
lastSourceLocation()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:
QDECLARATIVEJS_DECLARE_AST_NODE(UiImportList)2171     QDECLARATIVEJS_DECLARE_AST_NODE(UiImportList)
2172 
2173     UiImportList(UiImport *import)
2174         : import(import),
2175           next(this)
2176     { kind = K; }
2177 
UiImportList(UiImportList * previous,UiImport * import)2178     UiImportList(UiImportList *previous, UiImport *import)
2179         : import(import)
2180     {
2181         kind = K;
2182         next = previous->next;
2183         previous->next = this;
2184     }
2185 
firstSourceLocation()2186     virtual SourceLocation firstSourceLocation() const
2187     {
2188         if (import) return import->firstSourceLocation();
2189         else return SourceLocation();
2190     }
2191 
lastSourceLocation()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 
finish()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:
QDECLARATIVEJS_DECLARE_AST_NODE(UiObjectMemberList)2227     QDECLARATIVEJS_DECLARE_AST_NODE(UiObjectMemberList)
2228 
2229     UiObjectMemberList(UiObjectMember *member)
2230         : next(this), member(member)
2231     { kind = K; }
2232 
UiObjectMemberList(UiObjectMemberList * previous,UiObjectMember * member)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 
finish()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:
QDECLARATIVEJS_DECLARE_AST_NODE(UiArrayMemberList)2258     QDECLARATIVEJS_DECLARE_AST_NODE(UiArrayMemberList)
2259 
2260     UiArrayMemberList(UiObjectMember *member)
2261         : next(this), member(member)
2262     { kind = K; }
2263 
UiArrayMemberList(UiArrayMemberList * previous,UiObjectMember * member)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 
finish()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:
QDECLARATIVEJS_DECLARE_AST_NODE(UiObjectInitializer)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:
QDECLARATIVEJS_DECLARE_AST_NODE(UiParameterList)2307     QDECLARATIVEJS_DECLARE_AST_NODE(UiParameterList)
2308 
2309     UiParameterList(NameId *t, NameId *n):
2310         type (t), name (n), next (this)
2311         { kind = K; }
2312 
UiParameterList(UiParameterList * previous,NameId * t,NameId * n)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 
accept0(Visitor *)2321     virtual void accept0(Visitor *) {}
2322 
finish()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:
QDECLARATIVEJS_DECLARE_AST_NODE(UiPublicMember)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 
UiPublicMember(NameId * memberType,NameId * name,ExpressionNode * expression)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 
firstSourceLocation()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 
lastSourceLocation()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:
QDECLARATIVEJS_DECLARE_AST_NODE(UiObjectDefinition)2397     QDECLARATIVEJS_DECLARE_AST_NODE(UiObjectDefinition)
2398 
2399     UiObjectDefinition(UiQualifiedId *qualifiedTypeNameId,
2400                        UiObjectInitializer *initializer)
2401         : qualifiedTypeNameId(qualifiedTypeNameId), initializer(initializer)
2402     { kind = K; }
2403 
firstSourceLocation()2404     virtual SourceLocation firstSourceLocation() const
2405     { return qualifiedTypeNameId->identifierToken; }
2406 
lastSourceLocation()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:
QDECLARATIVEJS_DECLARE_AST_NODE(UiSourceElement)2420     QDECLARATIVEJS_DECLARE_AST_NODE(UiSourceElement)
2421 
2422     UiSourceElement(Node *sourceElement)
2423         : sourceElement(sourceElement)
2424     { kind = K; }
2425 
firstSourceLocation()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 
lastSourceLocation()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:
QDECLARATIVEJS_DECLARE_AST_NODE(UiObjectBinding)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 
firstSourceLocation()2467     virtual SourceLocation firstSourceLocation() const
2468     {
2469         if (hasOnToken && qualifiedTypeNameId)
2470             return qualifiedTypeNameId->identifierToken;
2471 
2472         return qualifiedId->identifierToken;
2473     }
2474 
lastSourceLocation()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:
QDECLARATIVEJS_DECLARE_AST_NODE(UiScriptBinding)2491     QDECLARATIVEJS_DECLARE_AST_NODE(UiScriptBinding)
2492 
2493     UiScriptBinding(UiQualifiedId *qualifiedId,
2494                     Statement *statement)
2495         : qualifiedId(qualifiedId),
2496           statement(statement)
2497     { kind = K; }
2498 
firstSourceLocation()2499     virtual SourceLocation firstSourceLocation() const
2500     { return qualifiedId->identifierToken; }
2501 
lastSourceLocation()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:
QDECLARATIVEJS_DECLARE_AST_NODE(UiArrayBinding)2516     QDECLARATIVEJS_DECLARE_AST_NODE(UiArrayBinding)
2517 
2518     UiArrayBinding(UiQualifiedId *qualifiedId,
2519                    UiArrayMemberList *members)
2520         : qualifiedId(qualifiedId),
2521           members(members)
2522     { kind = K; }
2523 
firstSourceLocation()2524     virtual SourceLocation firstSourceLocation() const
2525     { return qualifiedId->identifierToken; }
2526 
lastSourceLocation()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
2547