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