Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(64)

Side by Side Diff: runtime/vm/dil.h

Issue 2411823003: VM support for running Kernel binaries. (Closed)
Patch Set: Address initial review comments Created 4 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
1 // Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file.
4
5 #ifndef VM_DIL_H_
6 #define VM_DIL_H_
7
8 #include <stdint.h>
rmacnak 2016/10/13 00:56:39 Remove. Provided by globals.h
Vyacheslav Egorov (Google) 2016/10/13 14:37:57 Done.
9
10 #include "platform/assert.h"
11 #include "vm/globals.h"
12
13 #define DIL_NODES_DO(M) \
14 M(Name) \
15 M(InferredValue) \
16 M(DartType) \
17 M(InvalidType) \
18 M(DynamicType) \
19 M(VoidType) \
20 M(InterfaceType) \
21 M(FunctionType) \
22 M(TypeParameterType)
23
24 #define DIL_TREE_NODES_DO(M) \
25 M(Library) \
26 M(Class) \
27 M(NormalClass) \
28 M(MixinClass) \
29 M(Member) \
30 M(Field) \
31 M(Constructor) \
32 M(Procedure) \
33 M(Initializer) \
34 M(InvalidInitializer) \
35 M(FieldInitializer) \
36 M(SuperInitializer) \
37 M(RedirectingInitializer) \
38 M(LocalInitializer) \
39 M(FunctionNode) \
40 M(Expression) \
41 M(InvalidExpression) \
42 M(VariableGet) \
43 M(VariableSet) \
44 M(PropertyGet) \
45 M(PropertySet) \
46 M(DirectPropertyGet) \
47 M(DirectPropertySet) \
48 M(StaticGet) \
49 M(StaticSet) \
50 M(Arguments) \
51 M(NamedExpression) \
52 M(MethodInvocation) \
53 M(DirectMethodInvocation) \
54 M(StaticInvocation) \
55 M(ConstructorInvocation) \
56 M(Not) \
57 M(LogicalExpression) \
58 M(ConditionalExpression) \
59 M(StringConcatenation) \
60 M(IsExpression) \
61 M(AsExpression) \
62 M(BasicLiteral) \
63 M(StringLiteral) \
64 M(BigintLiteral) \
65 M(IntLiteral) \
66 M(DoubleLiteral) \
67 M(BoolLiteral) \
68 M(NullLiteral) \
69 M(SymbolLiteral) \
70 M(TypeLiteral) \
71 M(ThisExpression) \
72 M(Rethrow) \
73 M(Throw) \
74 M(ListLiteral) \
75 M(MapLiteral) \
76 M(MapEntry) \
77 M(AwaitExpression) \
78 M(FunctionExpression) \
79 M(Let) \
80 M(BlockExpression) \
81 M(Statement) \
82 M(InvalidStatement) \
83 M(ExpressionStatement) \
84 M(Block) \
85 M(EmptyStatement) \
86 M(AssertStatement) \
87 M(LabeledStatement) \
88 M(BreakStatement) \
89 M(WhileStatement) \
90 M(DoStatement) \
91 M(ForStatement) \
92 M(ForInStatement) \
93 M(SwitchStatement) \
94 M(SwitchCase) \
95 M(ContinueSwitchStatement) \
96 M(IfStatement) \
97 M(ReturnStatement) \
98 M(TryCatch) \
99 M(Catch) \
100 M(TryFinally) \
101 M(YieldStatement) \
102 M(VariableDeclaration) \
103 M(FunctionDeclaration) \
104 M(TypeParameter) \
105 M(Program)
106
107 #define DIL_ALL_NODES_DO(M) \
108 M(Node) \
109 DIL_NODES_DO(M) \
110 M(TreeNode) \
111 DIL_TREE_NODES_DO(M)
112
113 #define DIL_VISITORS_DO(M) \
114 M(ExpressionVisitor) \
115 M(StatementVisitor) \
116 M(MemberVisitor) \
117 M(ClassVisitor) \
118 M(InitializerVisitor) \
119 M(DartTypeVisitor) \
120 M(ClassReferenceVisitor) \
121 M(MemberReferenceVisitor) \
122 M(TreeVisitor) \
123 M(Visitor)
124
125 namespace dart {
126
127 namespace dil {
128
129
130 class Reader;
131 class TreeNode;
132 class TypeParameter;
133 class Writer;
134
135 // Boxes a value of type `T*` and `delete`s it on destruction.
136 template <typename T>
137 class Child {
138 public:
139 Child() : pointer_(NULL) {}
140 explicit Child(T* value) : pointer_(value) {}
141
142 ~Child() { delete pointer_; }
143
144 // Support `Child<T> box = T* obj`.
145 T*& operator=(T* value) {
146 ASSERT(pointer_ == NULL);
147 return pointer_ = value;
148 }
149
150 // Implicitly convert `Child<T>` to `T*`.
151 operator T*&() { return pointer_; }
152
153 T* operator->() { return pointer_; }
154
155 private:
156 T* pointer_;
157 };
158
159 // Boxes a value of type `T*` (only used to mark a member as a weak reference).
160 template <typename T>
161 class Ref {
162 public:
163 Ref() : pointer_(NULL) {}
164 explicit Ref(T* value) : pointer_(value) {}
165
166 // Support `Ref<T> box = T* obj`.
167 T*& operator=(T* value) {
168 ASSERT(pointer_ == NULL);
169 return pointer_ = value;
170 }
171
172 // Implicitly convert `Ref<T>` to `T*`.
173 operator T*&() { return pointer_; }
174
175 T* operator->() { return pointer_; }
176
177 private:
178 T* pointer_;
179 };
180
181
182 template <typename T>
183 class List {
184 public:
185 List() : array_(NULL), length_(0) {}
186 ~List();
187
188 template <typename IT>
189 void ReadFrom(Reader* reader);
190
191 template <typename IT>
192 void ReadFrom(Reader* reader, TreeNode* parent);
193
194 template <typename IT>
195 void ReadFromStatic(Reader* reader);
196
197 void WriteTo(Writer* writer);
198
199 template <typename IT>
200 void WriteToStatic(Writer* writer);
201
202 // Extends the array to at least be able to hold [length] elements.
203 //
204 // Free places will be filled with `NULL` values.
205 void EnsureInitialized(int length);
206
207 // Returns element at [index].
208 //
209 // If the array is not big enough, it will be grown via `EnsureInitialized`.
210 // If the element doesn't exist, it will be created via `new IT()`.
211 template <typename IT>
212 IT* GetOrCreate(int index);
213
214 template <typename IT, typename PT>
215 IT* GetOrCreate(int index, PT* parent);
216
217 // Returns element at [index].
218 T*& operator[](int index) {
219 ASSERT(index < length_);
220 return array_[index];
221 }
222
223 int length() { return length_; }
224
225 T** raw_array() { return array_; }
226
227 private:
228 T** array_;
229 int length_;
230
231 DISALLOW_COPY_AND_ASSIGN(List);
232 };
233
234
235 class TypeParameterList : public List<TypeParameter> {
236 public:
237 void ReadFrom(Reader* reader);
238 void WriteTo(Writer* writer);
239 };
240
241
242 template <typename A, typename B>
243 class Tuple {
244 public:
245 static Tuple<A, B>* ReadFrom(Reader* reader);
246 void WriteTo(Writer* writer);
247
248 Tuple(A* a, B* b) : first_(a), second_(b) {}
249
250 A* first() { return first_; }
251 B* second() { return second_; }
252
253 private:
254 Tuple() {}
255
256 Ref<A> first_;
257 Child<B> second_;
258
259 DISALLOW_COPY_AND_ASSIGN(Tuple);
260 };
261
262
263 class String {
264 public:
265 static String* ReadFrom(Reader* reader);
266 static String* ReadFromImpl(Reader* reader);
267 void WriteTo(Writer* writer);
268 void WriteToImpl(Writer* writer);
269
270 String(const uint8_t* utf8, int length) {
271 buffer_ = new uint8_t[length];
272 size_ = length;
273 memcpy(buffer_, utf8, length); // NOLINT
rmacnak 2016/10/13 00:56:39 memmove, lint
Vyacheslav Egorov (Google) 2016/10/13 14:37:57 Done.
274 }
275 ~String() { delete[] buffer_; }
276
277 uint8_t* buffer() { return buffer_; }
278 int size() { return size_; }
279
280 bool is_empty() { return size_ == 0; }
281
282 private:
283 uint8_t* buffer_;
284 int size_;
285
286 DISALLOW_COPY_AND_ASSIGN(String);
287 };
288
289
290 class StringTable {
291 public:
292 void ReadFrom(Reader* reader);
293 void WriteTo(Writer* writer);
294
295 List<String>& strings() { return strings_; }
296
297 private:
298 StringTable() {}
299
300 friend class Program;
301
302 List<String> strings_;
303
304 DISALLOW_COPY_AND_ASSIGN(StringTable);
305 };
306
307
308 class LineStartingTable {
309 public:
310 void ReadFrom(Reader* reader, intptr_t length);
311 void WriteTo(Writer* writer);
312 ~LineStartingTable() {
313 for (intptr_t i = 0; i < size_; ++i) {
314 delete[] values_[i];
315 }
316 delete[] values_;
317 }
318
319 intptr_t size() { return size_; }
320 intptr_t* valuesFor(int i) { return values_[i]; }
321
322 private:
323 LineStartingTable() : values_(NULL), size_(0) {}
324
325 friend class Program;
326
327 intptr_t** values_;
328 intptr_t size_;
329
330 DISALLOW_COPY_AND_ASSIGN(LineStartingTable);
331 };
332
333 // Forward declare all classes.
334 #define DO(name) class name;
335 DIL_ALL_NODES_DO(DO)
336 DIL_VISITORS_DO(DO)
337 #undef DO
338
339
340 #define DEFINE_CASTING_OPERATIONS(klass) \
341 virtual bool Is##klass() { return true; } \
342 \
343 static klass* Cast(Node* node) { \
344 ASSERT(node == NULL || node->Is##klass()); \
345 return static_cast<klass*>(node); \
346 } \
347 \
348 virtual Node::NodeType Type() { return Node::kType##klass; }
349
350 #define DEFINE_IS_OPERATION(klass) \
351 virtual bool Is##klass() { return false; }
352
353 #define DEFINE_ALL_IS_OPERATIONS() \
354 DIL_NODES_DO(DEFINE_IS_OPERATION) \
355 DEFINE_IS_OPERATION(TreeNode) \
356 DIL_TREE_NODES_DO(DEFINE_IS_OPERATION)
357
358
359 class Node {
360 public:
361 virtual ~Node();
362
363 enum NodeType {
364 #define DO(name) kType##name,
365 DIL_ALL_NODES_DO(DO)
366 #undef DO
367
368 kNumTypes
369 };
370
371 DEFINE_ALL_IS_OPERATIONS();
372 DEFINE_CASTING_OPERATIONS(Node);
373
374 virtual void AcceptVisitor(Visitor* visitor) = 0;
375 virtual void VisitChildren(Visitor* visitor) = 0;
376 };
377
378
379 class TreeNode : public Node {
380 public:
381 TreeNode() {}
382 virtual ~TreeNode();
383
384 DEFINE_CASTING_OPERATIONS(TreeNode);
385
386 virtual void AcceptVisitor(Visitor* visitor);
387 virtual void AcceptTreeVisitor(TreeVisitor* visitor) = 0;
388 };
389
390
391 class Library : public TreeNode {
392 public:
393 Library* ReadFrom(Reader* reader);
394 void WriteTo(Writer* writer);
395
396 virtual ~Library();
397
398 DEFINE_CASTING_OPERATIONS(Library);
399
400 virtual void AcceptTreeVisitor(TreeVisitor* visitor);
401 virtual void VisitChildren(Visitor* visitor);
402
403 String* import_uri() { return import_uri_; }
404 String* name() { return name_; }
405 List<Class>& classes() { return classes_; }
406 List<Field>& fields() { return fields_; }
407 List<Procedure>& procedures() { return procedures_; }
408
409 bool IsCorelibrary() {
410 static const char* dart_library = "dart:";
411 static intptr_t dart_library_length = strlen(dart_library);
412 static const char* patch_library = "dart:_patch";
413 static intptr_t patch_library_length = strlen(patch_library);
414
415 if (name_->size() < 5) return false;
416
417 // Check for dart: prefix.
418 char* buffer = reinterpret_cast<char*>(import_uri_->buffer());
419 if (strncmp(buffer, dart_library, dart_library_length) != 0) {
420 return false;
421 }
422
423 // Rasta emits dart:_patch and we should treat it as a user library.
424 if (name_->size() == patch_library_length &&
425 strncmp(buffer, patch_library, patch_library_length) == 0) {
426 return false;
427 }
428 return true;
429 }
430
431 private:
432 Library() : name_(NULL) {}
433
434 template <typename T>
435 friend class List;
436
437 Ref<String> name_;
438 Ref<String> import_uri_;
439 List<Class> classes_;
440 List<Field> fields_;
441 List<Procedure> procedures_;
442
443 DISALLOW_COPY_AND_ASSIGN(Library);
444 };
445
446
447 class Class : public TreeNode {
448 public:
449 Class* ReadFrom(Reader* reader);
450 void WriteTo(Writer* writer);
451
452 virtual ~Class();
453
454 DEFINE_CASTING_OPERATIONS(Class);
455
456 virtual void AcceptTreeVisitor(TreeVisitor* visitor);
457 virtual void AcceptClassVisitor(ClassVisitor* visitor) = 0;
458 virtual void AcceptReferenceVisitor(ClassReferenceVisitor* visitor) = 0;
459
460 Library* parent() { return parent_; }
461 String* name() { return name_; }
462 bool is_abstract() { return is_abstract_; }
463 List<Expression>& annotations() { return annotations_; }
464
465 virtual List<TypeParameter>& type_parameters() = 0;
466 virtual List<InterfaceType>& implemented_classes() = 0;
467 virtual List<Field>& fields() = 0;
468 virtual List<Constructor>& constructors() = 0;
469 virtual List<Procedure>& procedures() = 0;
470
471 protected:
472 Class() : is_abstract_(false) {}
473
474 private:
475 template <typename T>
476 friend class List;
477
478 Ref<Library> parent_;
479 Ref<String> name_;
480 bool is_abstract_;
481 List<Expression> annotations_;
482
483 DISALLOW_COPY_AND_ASSIGN(Class);
484 };
485
486
487 class NormalClass : public Class {
488 public:
489 NormalClass* ReadFrom(Reader* reader);
490 void WriteTo(Writer* writer);
491
492 virtual ~NormalClass();
493
494 DEFINE_CASTING_OPERATIONS(NormalClass);
495
496 virtual void AcceptClassVisitor(ClassVisitor* visitor);
497 virtual void AcceptReferenceVisitor(ClassReferenceVisitor* visitor);
498 virtual void VisitChildren(Visitor* visitor);
499
500 virtual TypeParameterList& type_parameters() { return type_parameters_; }
501 InterfaceType* super_class() { return super_class_; }
502 virtual List<InterfaceType>& implemented_classes() {
503 return implemented_classes_;
504 }
505 virtual List<Constructor>& constructors() { return constructors_; }
506 virtual List<Procedure>& procedures() { return procedures_; }
507 virtual List<Field>& fields() { return fields_; }
508
509 private:
510 NormalClass() {}
511
512 template <typename T>
513 friend class List;
514
515 TypeParameterList type_parameters_;
516 Child<InterfaceType> super_class_;
517 List<InterfaceType> implemented_classes_;
518 List<Constructor> constructors_;
519 List<Procedure> procedures_;
520 List<Field> fields_;
521
522 DISALLOW_COPY_AND_ASSIGN(NormalClass);
523 };
524
525
526 class MixinClass : public Class {
527 public:
528 MixinClass* ReadFrom(Reader* reader);
529 void WriteTo(Writer* writer);
530
531 virtual ~MixinClass();
532
533 DEFINE_CASTING_OPERATIONS(MixinClass);
534
535 virtual void AcceptClassVisitor(ClassVisitor* visitor);
536 virtual void AcceptReferenceVisitor(ClassReferenceVisitor* visitor);
537 virtual void VisitChildren(Visitor* visitor);
538
539 virtual TypeParameterList& type_parameters() { return type_parameters_; }
540 InterfaceType* first() { return first_; }
541 InterfaceType* second() { return second_; }
542 virtual List<InterfaceType>& implemented_classes() {
543 return implemented_classes_;
544 }
545 virtual List<Constructor>& constructors() { return constructors_; }
546 virtual List<Field>& fields() { return fields_; }
547 virtual List<Procedure>& procedures() { return procedures_; }
548
549 private:
550 MixinClass() {}
551
552 template <typename T>
553 friend class List;
554
555 TypeParameterList type_parameters_;
556 Child<InterfaceType> first_;
557 Child<InterfaceType> second_;
558 List<InterfaceType> implemented_classes_;
559 List<Constructor> constructors_;
560
561 // Dummy instances which are empty lists.
562 List<Field> fields_;
563 List<Procedure> procedures_;
564
565 DISALLOW_COPY_AND_ASSIGN(MixinClass);
566 };
567
568
569 class Member : public TreeNode {
570 public:
571 virtual ~Member();
572
573 DEFINE_CASTING_OPERATIONS(Member);
574
575 virtual void AcceptTreeVisitor(TreeVisitor* visitor);
576 virtual void AcceptMemberVisitor(MemberVisitor* visitor) = 0;
577 virtual void AcceptReferenceVisitor(MemberReferenceVisitor* visitor) = 0;
578
579 TreeNode* parent() { return parent_; }
580 Name* name() { return name_; }
581 List<Expression>& annotations() { return annotations_; }
582
583 protected:
584 template <typename T>
585 friend class List;
586
587 Ref<TreeNode> parent_;
588 Child<Name> name_;
589 List<Expression> annotations_;
590 };
591
592
593 class Field : public Member {
594 public:
595 enum Flags {
596 kFlagFinal = 1 << 0,
597 kFlagConst = 1 << 1,
598 kFlagStatic = 1 << 2,
599 };
600
601 Field* ReadFrom(Reader* reader);
602 void WriteTo(Writer* writer);
603
604 virtual ~Field();
605
606 DEFINE_CASTING_OPERATIONS(Field);
607
608 virtual void AcceptMemberVisitor(MemberVisitor* visitor);
609 virtual void AcceptReferenceVisitor(MemberReferenceVisitor* visitor);
610 virtual void VisitChildren(Visitor* visitor);
611
612 bool IsConst() { return (flags_ & kFlagConst) == kFlagConst; }
613 bool IsFinal() { return (flags_ & kFlagFinal) == kFlagFinal; }
614 bool IsStatic() { return (flags_ & kFlagStatic) == kFlagStatic; }
615
616 DartType* type() { return type_; }
617 InferredValue* inferred_value() { return inferred_value_; }
618 Expression* initializer() { return initializer_; }
619
620 private:
621 Field() {}
622
623 template <typename T>
624 friend class List;
625
626 word flags_;
627 Child<DartType> type_;
628 Child<InferredValue> inferred_value_;
629 Child<Expression> initializer_;
630
631 DISALLOW_COPY_AND_ASSIGN(Field);
632 };
633
634
635 class Constructor : public Member {
636 public:
637 enum Flags {
638 kFlagConst = 1 << 0,
639 kFlagExternal = 1 << 1,
640 };
641
642 Constructor* ReadFrom(Reader* reader);
643 void WriteTo(Writer* writer);
644
645 virtual ~Constructor();
646
647 DEFINE_CASTING_OPERATIONS(Constructor);
648
649 virtual void AcceptMemberVisitor(MemberVisitor* visitor);
650 virtual void AcceptReferenceVisitor(MemberReferenceVisitor* visitor);
651 virtual void VisitChildren(Visitor* visitor);
652
653 bool IsExternal() { return (flags_ & kFlagExternal) == kFlagExternal; }
654 bool IsConst() { return (flags_ & kFlagConst) == kFlagConst; }
655
656 FunctionNode* function() { return function_; }
657 List<Initializer>& initializers() { return initializers_; }
658
659 private:
660 template <typename T>
661 friend class List;
662
663 Constructor() {}
664
665 uint8_t flags_;
666 Child<FunctionNode> function_;
667 List<Initializer> initializers_;
668
669 DISALLOW_COPY_AND_ASSIGN(Constructor);
670 };
671
672
673 class Procedure : public Member {
674 public:
675 enum Flags {
676 kFlagStatic = 1 << 0,
677 kFlagAbstract = 1 << 1,
678 kFlagExternal = 1 << 2,
679 kFlagConst = 1 << 3, // Only for external const factories.
680 };
681
682 // Keep in sync with package:dynamo/lib/ast.dart:ProcedureKind
683 enum ProcedureKind {
684 kMethod,
685 kGetter,
686 kSetter,
687 kOperator,
688 kFactory,
689
690 kIncompleteProcedure = 255
691 };
692
693 Procedure* ReadFrom(Reader* reader);
694 void WriteTo(Writer* writer);
695
696 virtual ~Procedure();
697
698 DEFINE_CASTING_OPERATIONS(Procedure);
699
700 virtual void AcceptMemberVisitor(MemberVisitor* visitor);
701 virtual void AcceptReferenceVisitor(MemberReferenceVisitor* visitor);
702 virtual void VisitChildren(Visitor* visitor);
703
704 ProcedureKind kind() { return kind_; }
705 FunctionNode* function() { return function_; }
706
707 bool IsStatic() { return (flags_ & kFlagStatic) == kFlagStatic; }
708 bool IsAbstract() { return (flags_ & kFlagAbstract) == kFlagAbstract; }
709 bool IsExternal() { return (flags_ & kFlagExternal) == kFlagExternal; }
710 bool IsConst() { return (flags_ & kFlagConst) == kFlagConst; }
711
712 private:
713 Procedure() : kind_(kIncompleteProcedure), flags_(0), function_(NULL) {}
714
715 template <typename T>
716 friend class List;
717
718 ProcedureKind kind_;
719 word flags_;
720 Child<FunctionNode> function_;
721
722 DISALLOW_COPY_AND_ASSIGN(Procedure);
723 };
724
725
726 class Initializer : public TreeNode {
727 public:
728 static Initializer* ReadFrom(Reader* reader);
729 virtual void WriteTo(Writer* writer) = 0;
730
731 virtual ~Initializer();
732
733 DEFINE_CASTING_OPERATIONS(Initializer);
734
735 virtual void AcceptTreeVisitor(TreeVisitor* visitor);
736 virtual void AcceptInitializerVisitor(InitializerVisitor* visitor) = 0;
737 };
738
739
740 class InvalidInitializer : public Initializer {
741 public:
742 static InvalidInitializer* ReadFromImpl(Reader* reader);
743 virtual void WriteTo(Writer* writer);
744
745 virtual ~InvalidInitializer();
746
747 DEFINE_CASTING_OPERATIONS(InvalidInitializer);
748 virtual void AcceptInitializerVisitor(InitializerVisitor* visitor);
749 virtual void VisitChildren(Visitor* visitor);
750 };
751
752
753 class FieldInitializer : public Initializer {
754 public:
755 static FieldInitializer* ReadFromImpl(Reader* reader);
756 virtual void WriteTo(Writer* writer);
757
758 virtual ~FieldInitializer();
759
760 DEFINE_CASTING_OPERATIONS(FieldInitializer);
761
762 virtual void AcceptInitializerVisitor(InitializerVisitor* visitor);
763 virtual void VisitChildren(Visitor* visitor);
764
765 Field* field() { return field_; }
766 Expression* value() { return value_; }
767
768 private:
769 FieldInitializer() {}
770
771 Ref<Field> field_;
772 Child<Expression> value_;
773
774 DISALLOW_COPY_AND_ASSIGN(FieldInitializer);
775 };
776
777
778 class SuperInitializer : public Initializer {
779 public:
780 static SuperInitializer* ReadFromImpl(Reader* reader);
781 virtual void WriteTo(Writer* writer);
782
783 virtual ~SuperInitializer();
784
785 DEFINE_CASTING_OPERATIONS(SuperInitializer);
786
787 virtual void AcceptInitializerVisitor(InitializerVisitor* visitor);
788 virtual void VisitChildren(Visitor* visitor);
789
790 Constructor* target() { return target_; }
791 Arguments* arguments() { return arguments_; }
792
793 private:
794 SuperInitializer() {}
795
796 Ref<Constructor> target_;
797 Child<Arguments> arguments_;
798
799 DISALLOW_COPY_AND_ASSIGN(SuperInitializer);
800 };
801
802
803 class RedirectingInitializer : public Initializer {
804 public:
805 static RedirectingInitializer* ReadFromImpl(Reader* reader);
806 virtual void WriteTo(Writer* writer);
807
808 virtual ~RedirectingInitializer();
809
810 DEFINE_CASTING_OPERATIONS(RedirectingInitializer);
811
812 virtual void AcceptInitializerVisitor(InitializerVisitor* visitor);
813 virtual void VisitChildren(Visitor* visitor);
814
815 Constructor* target() { return target_; }
816 Arguments* arguments() { return arguments_; }
817
818 private:
819 RedirectingInitializer() {}
820
821 Ref<Constructor> target_;
822 Child<Arguments> arguments_;
823
824 DISALLOW_COPY_AND_ASSIGN(RedirectingInitializer);
825 };
826
827
828 class LocalInitializer : public Initializer {
829 public:
830 static LocalInitializer* ReadFromImpl(Reader* reader);
831 virtual void WriteTo(Writer* writer);
832
833 virtual ~LocalInitializer();
834
835 DEFINE_CASTING_OPERATIONS(LocalInitializer);
836
837 virtual void AcceptInitializerVisitor(InitializerVisitor* visitor);
838 virtual void VisitChildren(Visitor* visitor);
839
840 VariableDeclaration* variable() { return variable_; }
841
842 private:
843 LocalInitializer() {}
844
845 Child<VariableDeclaration> variable_;
846
847 DISALLOW_COPY_AND_ASSIGN(LocalInitializer);
848 };
849
850
851 class FunctionNode : public TreeNode {
852 public:
853 enum AsyncMarker {
854 kSync = 0,
855 kSyncStar = 1,
856 kAsync = 2,
857 kAsyncStar = 3,
858 kSyncYielding = 4,
859 };
860
861 static FunctionNode* ReadFrom(Reader* reader);
862 void WriteTo(Writer* writer);
863
864 virtual ~FunctionNode();
865
866 DEFINE_CASTING_OPERATIONS(FunctionNode);
867
868 virtual void AcceptTreeVisitor(TreeVisitor* visitor);
869 virtual void VisitChildren(Visitor* visitor);
870
871 AsyncMarker async_marker() { return async_marker_; }
872 TypeParameterList& type_parameters() { return type_parameters_; }
873 int required_parameter_count() { return required_parameter_count_; }
874 List<VariableDeclaration>& positional_parameters() {
875 return positional_parameters_;
876 }
877 List<VariableDeclaration>& named_parameters() { return named_parameters_; }
878 DartType* return_type() { return return_type_; }
879 InferredValue* inferred_return_value() { return inferred_return_value_; }
880 Statement* body() { return body_; }
881
882 private:
883 FunctionNode() {}
884
885 AsyncMarker async_marker_;
886 TypeParameterList type_parameters_;
887 int required_parameter_count_;
888 List<VariableDeclaration> positional_parameters_;
889 List<VariableDeclaration> named_parameters_;
890 Child<DartType> return_type_;
891 Child<InferredValue> inferred_return_value_;
892 Child<Statement> body_;
893
894 DISALLOW_COPY_AND_ASSIGN(FunctionNode);
895 };
896
897
898 class Expression : public TreeNode {
899 public:
900 static Expression* ReadFrom(Reader* reader);
901 virtual void WriteTo(Writer* writer) = 0;
902
903 virtual ~Expression();
904
905 DEFINE_CASTING_OPERATIONS(Expression);
906
907 virtual void AcceptTreeVisitor(TreeVisitor* visitor);
908 virtual void AcceptExpressionVisitor(ExpressionVisitor* visitor) = 0;
909 };
910
911
912 class InvalidExpression : public Expression {
913 public:
914 static InvalidExpression* ReadFrom(Reader* reader);
915 virtual void WriteTo(Writer* writer);
916
917 virtual ~InvalidExpression();
918 virtual void VisitChildren(Visitor* visitor);
919
920 DEFINE_CASTING_OPERATIONS(InvalidExpression);
921
922 virtual void AcceptExpressionVisitor(ExpressionVisitor* visitor);
923 };
924
925
926 class VariableGet : public Expression {
927 public:
928 static VariableGet* ReadFrom(Reader* reader);
929 static VariableGet* ReadFrom(Reader* reader, uint8_t payload);
930 virtual void WriteTo(Writer* writer);
931
932 virtual ~VariableGet();
933
934 DEFINE_CASTING_OPERATIONS(VariableGet);
935
936 virtual void AcceptExpressionVisitor(ExpressionVisitor* visitor);
937 virtual void VisitChildren(Visitor* visitor);
938
939 VariableDeclaration* variable() { return variable_; }
940
941 private:
942 VariableGet() {}
943
944 Ref<VariableDeclaration> variable_;
945
946 DISALLOW_COPY_AND_ASSIGN(VariableGet);
947 };
948
949
950 class VariableSet : public Expression {
951 public:
952 static VariableSet* ReadFrom(Reader* reader);
953 static VariableSet* ReadFrom(Reader* reader, uint8_t payload);
954 virtual void WriteTo(Writer* writer);
955
956 virtual ~VariableSet();
957
958 DEFINE_CASTING_OPERATIONS(VariableSet);
959
960 virtual void AcceptExpressionVisitor(ExpressionVisitor* visitor);
961 virtual void VisitChildren(Visitor* visitor);
962
963 VariableDeclaration* variable() { return variable_; }
964 Expression* expression() { return expression_; }
965
966 private:
967 VariableSet() {}
968
969 Ref<VariableDeclaration> variable_;
970 Child<Expression> expression_;
971
972 DISALLOW_COPY_AND_ASSIGN(VariableSet);
973 };
974
975
976 class PropertyGet : public Expression {
977 public:
978 static PropertyGet* ReadFrom(Reader* reader);
979 virtual void WriteTo(Writer* writer);
980
981 virtual ~PropertyGet();
982
983 DEFINE_CASTING_OPERATIONS(PropertyGet);
984
985 virtual void AcceptExpressionVisitor(ExpressionVisitor* visitor);
986 virtual void VisitChildren(Visitor* visitor);
987
988 Expression* receiver() { return receiver_; }
989 Name* name() { return name_; }
990
991 private:
992 PropertyGet() {}
993
994 Child<Expression> receiver_;
995 Child<Name> name_;
996 Ref<Member> interfaceTarget_;
997
998 DISALLOW_COPY_AND_ASSIGN(PropertyGet);
999 };
1000
1001
1002 class PropertySet : public Expression {
1003 public:
1004 static PropertySet* ReadFrom(Reader* reader);
1005 virtual void WriteTo(Writer* writer);
1006
1007 virtual ~PropertySet();
1008
1009 DEFINE_CASTING_OPERATIONS(PropertySet);
1010
1011 virtual void AcceptExpressionVisitor(ExpressionVisitor* visitor);
1012 virtual void VisitChildren(Visitor* visitor);
1013
1014 Expression* receiver() { return receiver_; }
1015 Name* name() { return name_; }
1016 Expression* value() { return value_; }
1017
1018 private:
1019 PropertySet() {}
1020
1021 Child<Expression> receiver_;
1022 Child<Name> name_;
1023 Child<Expression> value_;
1024 Ref<Member> interfaceTarget_;
1025
1026 DISALLOW_COPY_AND_ASSIGN(PropertySet);
1027 };
1028
1029
1030 class DirectPropertyGet : public Expression {
1031 public:
1032 static DirectPropertyGet* ReadFrom(Reader* reader);
1033 virtual void WriteTo(Writer* writer);
1034
1035 virtual ~DirectPropertyGet();
1036
1037 DEFINE_CASTING_OPERATIONS(DirectPropertyGet);
1038
1039 virtual void AcceptExpressionVisitor(ExpressionVisitor* visitor);
1040 virtual void VisitChildren(Visitor* visitor);
1041
1042 Expression* receiver() { return receiver_; }
1043 Member* target() { return target_; }
1044
1045 private:
1046 DirectPropertyGet() {}
1047
1048 Child<Expression> receiver_;
1049 Ref<Member> target_;
1050
1051 DISALLOW_COPY_AND_ASSIGN(DirectPropertyGet);
1052 };
1053
1054
1055 class DirectPropertySet : public Expression {
1056 public:
1057 static DirectPropertySet* ReadFrom(Reader* reader);
1058 virtual void WriteTo(Writer* writer);
1059
1060 virtual ~DirectPropertySet();
1061
1062 DEFINE_CASTING_OPERATIONS(DirectPropertySet);
1063
1064 virtual void AcceptExpressionVisitor(ExpressionVisitor* visitor);
1065 virtual void VisitChildren(Visitor* visitor);
1066
1067 Expression* receiver() { return receiver_; }
1068 Member* target() { return target_; }
1069 Expression* value() { return value_; }
1070
1071 private:
1072 DirectPropertySet() {}
1073
1074 Child<Expression> receiver_;
1075 Ref<Member> target_;
1076 Child<Expression> value_;
1077
1078 DISALLOW_COPY_AND_ASSIGN(DirectPropertySet);
1079 };
1080
1081
1082 class StaticGet : public Expression {
1083 public:
1084 static StaticGet* ReadFrom(Reader* reader);
1085 virtual void WriteTo(Writer* writer);
1086
1087 virtual ~StaticGet();
1088
1089 DEFINE_CASTING_OPERATIONS(StaticGet);
1090
1091 virtual void AcceptExpressionVisitor(ExpressionVisitor* visitor);
1092 virtual void VisitChildren(Visitor* visitor);
1093
1094 Member* target() { return target_; }
1095
1096 private:
1097 StaticGet() {}
1098
1099 Ref<Member> target_;
1100
1101 DISALLOW_COPY_AND_ASSIGN(StaticGet);
1102 };
1103
1104
1105 class StaticSet : public Expression {
1106 public:
1107 static StaticSet* ReadFrom(Reader* reader);
1108 virtual void WriteTo(Writer* writer);
1109
1110 virtual ~StaticSet();
1111
1112 DEFINE_CASTING_OPERATIONS(StaticSet);
1113
1114 virtual void AcceptExpressionVisitor(ExpressionVisitor* visitor);
1115 virtual void VisitChildren(Visitor* visitor);
1116
1117 Member* target() { return target_; }
1118 Expression* expression() { return expression_; }
1119
1120 private:
1121 StaticSet() {}
1122
1123 Ref<Member> target_;
1124 Child<Expression> expression_;
1125
1126 DISALLOW_COPY_AND_ASSIGN(StaticSet);
1127 };
1128
1129
1130 class Arguments : public TreeNode {
1131 public:
1132 static Arguments* ReadFrom(Reader* reader);
1133 virtual void WriteTo(Writer* writer);
1134
1135 virtual ~Arguments();
1136
1137 DEFINE_CASTING_OPERATIONS(Arguments);
1138
1139 virtual void AcceptTreeVisitor(TreeVisitor* visitor);
1140 virtual void VisitChildren(Visitor* visitor);
1141
1142 List<DartType>& types() { return types_; }
1143 List<Expression>& positional() { return positional_; }
1144 List<NamedExpression>& named() { return named_; }
1145
1146 int count() { return positional_.length() + named_.length(); }
1147
1148 private:
1149 Arguments() {}
1150
1151 List<DartType> types_;
1152 List<Expression> positional_;
1153 List<NamedExpression> named_;
1154
1155 DISALLOW_COPY_AND_ASSIGN(Arguments);
1156 };
1157
1158
1159 class NamedExpression : public TreeNode {
1160 public:
1161 static NamedExpression* ReadFrom(Reader* reader);
1162 virtual void WriteTo(Writer* writer);
1163
1164 NamedExpression(String* name, Expression* expr)
1165 : name_(name), expression_(expr) {}
1166 virtual ~NamedExpression();
1167
1168 DEFINE_CASTING_OPERATIONS(NamedExpression);
1169
1170 virtual void AcceptTreeVisitor(TreeVisitor* visitor);
1171 virtual void VisitChildren(Visitor* visitor);
1172
1173 String* name() { return name_; }
1174 Expression* expression() { return expression_; }
1175
1176 private:
1177 NamedExpression() {}
1178
1179 Ref<String> name_;
1180 Child<Expression> expression_;
1181
1182 DISALLOW_COPY_AND_ASSIGN(NamedExpression);
1183 };
1184
1185
1186 class MethodInvocation : public Expression {
1187 public:
1188 static MethodInvocation* ReadFrom(Reader* reader);
1189 virtual void WriteTo(Writer* writer);
1190
1191 virtual ~MethodInvocation();
1192
1193 DEFINE_CASTING_OPERATIONS(MethodInvocation);
1194
1195 virtual void AcceptExpressionVisitor(ExpressionVisitor* visitor);
1196 virtual void VisitChildren(Visitor* visitor);
1197
1198 Expression* receiver() { return receiver_; }
1199 Name* name() { return name_; }
1200 Arguments* arguments() { return arguments_; }
1201
1202 private:
1203 MethodInvocation() {}
1204
1205 Child<Expression> receiver_;
1206 Child<Name> name_;
1207 Child<Arguments> arguments_;
1208 Ref<Member> interfaceTarget_;
1209
1210 DISALLOW_COPY_AND_ASSIGN(MethodInvocation);
1211 };
1212
1213
1214 class DirectMethodInvocation : public Expression {
1215 public:
1216 static DirectMethodInvocation* ReadFrom(Reader* reader);
1217 virtual void WriteTo(Writer* writer);
1218
1219 virtual ~DirectMethodInvocation();
1220
1221 DEFINE_CASTING_OPERATIONS(DirectMethodInvocation);
1222
1223 virtual void AcceptExpressionVisitor(ExpressionVisitor* visitor);
1224 virtual void VisitChildren(Visitor* visitor);
1225
1226 Expression* receiver() { return receiver_; }
1227 Procedure* target() { return target_; }
1228 Arguments* arguments() { return arguments_; }
1229
1230 private:
1231 DirectMethodInvocation() {}
1232
1233 Child<Expression> receiver_;
1234 Ref<Procedure> target_;
1235 Child<Arguments> arguments_;
1236
1237 DISALLOW_COPY_AND_ASSIGN(DirectMethodInvocation);
1238 };
1239
1240
1241 class StaticInvocation : public Expression {
1242 public:
1243 static StaticInvocation* ReadFrom(Reader* reader, bool is_const);
1244 virtual void WriteTo(Writer* writer);
1245
1246 explicit StaticInvocation(Procedure* procedure, Arguments* args,
1247 bool is_const)
1248 : procedure_(procedure), arguments_(args), is_const_(is_const) {}
1249 ~StaticInvocation();
1250
1251 virtual void AcceptExpressionVisitor(ExpressionVisitor* visitor);
1252 virtual void VisitChildren(Visitor* visitor);
1253
1254 Procedure* procedure() { return procedure_; }
1255 Arguments* arguments() { return arguments_; }
1256 bool is_const() { return is_const_; }
1257
1258 private:
1259 StaticInvocation() {}
1260
1261 Ref<Procedure> procedure_;
1262 Child<Arguments> arguments_;
1263 bool is_const_;
1264
1265 DISALLOW_COPY_AND_ASSIGN(StaticInvocation);
1266 };
1267
1268
1269 class ConstructorInvocation : public Expression {
1270 public:
1271 static ConstructorInvocation* ReadFrom(Reader* reader, bool is_const);
1272 virtual void WriteTo(Writer* writer);
1273
1274 virtual ~ConstructorInvocation();
1275
1276 DEFINE_CASTING_OPERATIONS(ConstructorInvocation);
1277
1278 virtual void AcceptExpressionVisitor(ExpressionVisitor* visitor);
1279 virtual void VisitChildren(Visitor* visitor);
1280
1281 bool is_const() { return is_const_; }
1282 Constructor* target() { return target_; }
1283 Arguments* arguments() { return arguments_; }
1284
1285 private:
1286 ConstructorInvocation() {}
1287
1288 bool is_const_;
1289 Ref<Constructor> target_;
1290 Child<Arguments> arguments_;
1291
1292 DISALLOW_COPY_AND_ASSIGN(ConstructorInvocation);
1293 };
1294
1295
1296 class Not : public Expression {
1297 public:
1298 static Not* ReadFrom(Reader* reader);
1299 virtual void WriteTo(Writer* writer);
1300
1301 virtual ~Not();
1302
1303 DEFINE_CASTING_OPERATIONS(Not);
1304
1305 virtual void AcceptExpressionVisitor(ExpressionVisitor* visitor);
1306 virtual void VisitChildren(Visitor* visitor);
1307
1308 Expression* expression() { return expression_; }
1309
1310 private:
1311 Not() {}
1312
1313 Child<Expression> expression_;
1314
1315 DISALLOW_COPY_AND_ASSIGN(Not);
1316 };
1317
1318
1319 class LogicalExpression : public Expression {
1320 public:
1321 enum Operator { kAnd, kOr };
1322
1323 static LogicalExpression* ReadFrom(Reader* reader);
1324 virtual void WriteTo(Writer* writer);
1325
1326 virtual ~LogicalExpression();
1327
1328 DEFINE_CASTING_OPERATIONS(LogicalExpression);
1329
1330 virtual void AcceptExpressionVisitor(ExpressionVisitor* visitor);
1331 virtual void VisitChildren(Visitor* visitor);
1332
1333 Expression* left() { return left_; }
1334 Operator op() { return operator_; }
1335 Expression* right() { return right_; }
1336
1337 private:
1338 LogicalExpression() {}
1339
1340 Child<Expression> left_;
1341 Operator operator_;
1342 Child<Expression> right_;
1343
1344 DISALLOW_COPY_AND_ASSIGN(LogicalExpression);
1345 };
1346
1347
1348 class ConditionalExpression : public Expression {
1349 public:
1350 static ConditionalExpression* ReadFrom(Reader* reader);
1351 virtual void WriteTo(Writer* writer);
1352
1353 virtual ~ConditionalExpression();
1354
1355 DEFINE_CASTING_OPERATIONS(ConditionalExpression);
1356
1357 virtual void AcceptExpressionVisitor(ExpressionVisitor* visitor);
1358 virtual void VisitChildren(Visitor* visitor);
1359
1360 Expression* condition() { return condition_; }
1361 Expression* then() { return then_; }
1362 Expression* otherwise() { return otherwise_; }
1363
1364 private:
1365 ConditionalExpression() {}
1366
1367 Child<Expression> condition_;
1368 Child<Expression> then_;
1369 Child<Expression> otherwise_;
1370
1371 DISALLOW_COPY_AND_ASSIGN(ConditionalExpression);
1372 };
1373
1374
1375 class StringConcatenation : public Expression {
1376 public:
1377 static StringConcatenation* ReadFrom(Reader* reader);
1378 virtual void WriteTo(Writer* writer);
1379
1380 virtual ~StringConcatenation();
1381
1382 DEFINE_CASTING_OPERATIONS(StringConcatenation);
1383
1384 virtual void AcceptExpressionVisitor(ExpressionVisitor* visitor);
1385 virtual void VisitChildren(Visitor* visitor);
1386
1387 List<Expression>& expressions() { return expressions_; }
1388
1389 private:
1390 StringConcatenation() {}
1391
1392 List<Expression> expressions_;
1393
1394 DISALLOW_COPY_AND_ASSIGN(StringConcatenation);
1395 };
1396
1397
1398 class IsExpression : public Expression {
1399 public:
1400 static IsExpression* ReadFrom(Reader* reader);
1401 virtual void WriteTo(Writer* writer);
1402
1403 virtual ~IsExpression();
1404
1405 DEFINE_CASTING_OPERATIONS(IsExpression);
1406
1407 virtual void AcceptExpressionVisitor(ExpressionVisitor* visitor);
1408 virtual void VisitChildren(Visitor* visitor);
1409
1410 Expression* operand() { return operand_; }
1411 DartType* type() { return type_; }
1412
1413 private:
1414 IsExpression() {}
1415
1416 Child<Expression> operand_;
1417 Child<DartType> type_;
1418
1419 DISALLOW_COPY_AND_ASSIGN(IsExpression);
1420 };
1421
1422
1423 class AsExpression : public Expression {
1424 public:
1425 static AsExpression* ReadFrom(Reader* reader);
1426 virtual void WriteTo(Writer* writer);
1427
1428 virtual ~AsExpression();
1429
1430 DEFINE_CASTING_OPERATIONS(AsExpression);
1431
1432 virtual void AcceptExpressionVisitor(ExpressionVisitor* visitor);
1433 virtual void VisitChildren(Visitor* visitor);
1434
1435 Expression* operand() { return operand_; }
1436 DartType* type() { return type_; }
1437
1438 private:
1439 AsExpression() {}
1440
1441 Child<Expression> operand_;
1442 Child<DartType> type_;
1443
1444 DISALLOW_COPY_AND_ASSIGN(AsExpression);
1445 };
1446
1447
1448 class BasicLiteral : public Expression {
1449 public:
1450 virtual ~BasicLiteral();
1451
1452 DEFINE_CASTING_OPERATIONS(BasicLiteral);
1453
1454 virtual void VisitChildren(Visitor* visitor);
1455 };
1456
1457
1458 class StringLiteral : public BasicLiteral {
1459 public:
1460 static StringLiteral* ReadFrom(Reader* reader);
1461 virtual void WriteTo(Writer* writer);
1462
1463 virtual void AcceptExpressionVisitor(ExpressionVisitor* visitor);
1464
1465 explicit StringLiteral(String* string) : value_(string) {}
1466 virtual ~StringLiteral();
1467
1468 DEFINE_CASTING_OPERATIONS(StringLiteral);
1469
1470 String* value() { return value_; }
1471
1472 protected:
1473 StringLiteral() {}
1474
1475 Ref<String> value_;
1476
1477 private:
1478 DISALLOW_COPY_AND_ASSIGN(StringLiteral);
1479 };
1480
1481
1482 class BigintLiteral : public StringLiteral {
1483 public:
1484 static BigintLiteral* ReadFrom(Reader* reader);
1485 virtual void WriteTo(Writer* writer);
1486
1487 virtual void AcceptExpressionVisitor(ExpressionVisitor* visitor);
1488
1489 explicit BigintLiteral(String* string) : StringLiteral(string) {}
1490 virtual ~BigintLiteral();
1491
1492 DEFINE_CASTING_OPERATIONS(BigintLiteral);
1493
1494 private:
1495 BigintLiteral() {}
1496
1497 DISALLOW_COPY_AND_ASSIGN(BigintLiteral);
1498 };
1499
1500
1501 class IntLiteral : public BasicLiteral {
1502 public:
1503 static IntLiteral* ReadFrom(Reader* reader, bool is_negative);
1504 static IntLiteral* ReadFrom(Reader* reader, uint8_t payload);
1505 virtual void WriteTo(Writer* writer);
1506
1507 virtual ~IntLiteral();
1508
1509 DEFINE_CASTING_OPERATIONS(IntLiteral);
1510
1511 virtual void AcceptExpressionVisitor(ExpressionVisitor* visitor);
1512
1513 int64_t value() { return value_; }
1514
1515 private:
1516 IntLiteral() {}
1517
1518 int64_t value_;
1519
1520 DISALLOW_COPY_AND_ASSIGN(IntLiteral);
1521 };
1522
1523
1524 class DoubleLiteral : public BasicLiteral {
1525 public:
1526 static DoubleLiteral* ReadFrom(Reader* reader);
1527 virtual void WriteTo(Writer* writer);
1528
1529 virtual ~DoubleLiteral();
1530
1531 DEFINE_CASTING_OPERATIONS(DoubleLiteral);
1532
1533 virtual void AcceptExpressionVisitor(ExpressionVisitor* visitor);
1534
1535 String* value() { return value_; }
1536
1537 private:
1538 DoubleLiteral() {}
1539
1540 Ref<String> value_;
1541
1542 DISALLOW_COPY_AND_ASSIGN(DoubleLiteral);
1543 };
1544
1545
1546 class BoolLiteral : public BasicLiteral {
1547 public:
1548 static BoolLiteral* ReadFrom(Reader* reader, bool value);
1549 virtual void WriteTo(Writer* writer);
1550
1551 virtual ~BoolLiteral();
1552
1553 DEFINE_CASTING_OPERATIONS(BoolLiteral);
1554
1555 virtual void AcceptExpressionVisitor(ExpressionVisitor* visitor);
1556
1557 bool value() { return value_; }
1558
1559 private:
1560 BoolLiteral() {}
1561
1562 bool value_;
1563
1564 DISALLOW_COPY_AND_ASSIGN(BoolLiteral);
1565 };
1566
1567
1568 class NullLiteral : public BasicLiteral {
1569 public:
1570 static NullLiteral* ReadFrom(Reader* reader);
1571 virtual void WriteTo(Writer* writer);
1572
1573 virtual ~NullLiteral();
1574
1575 DEFINE_CASTING_OPERATIONS(NullLiteral);
1576
1577 virtual void AcceptExpressionVisitor(ExpressionVisitor* visitor);
1578 };
1579
1580
1581 class SymbolLiteral : public Expression {
1582 public:
1583 static SymbolLiteral* ReadFrom(Reader* reader);
1584 virtual void WriteTo(Writer* writer);
1585
1586 virtual ~SymbolLiteral();
1587
1588 DEFINE_CASTING_OPERATIONS(SymbolLiteral);
1589
1590 virtual void AcceptExpressionVisitor(ExpressionVisitor* visitor);
1591 virtual void VisitChildren(Visitor* visitor);
1592
1593 String* value() { return value_; }
1594
1595 private:
1596 SymbolLiteral() {}
1597
1598 Ref<String> value_;
1599
1600 DISALLOW_COPY_AND_ASSIGN(SymbolLiteral);
1601 };
1602
1603
1604 class TypeLiteral : public Expression {
1605 public:
1606 static TypeLiteral* ReadFrom(Reader* reader);
1607 virtual void WriteTo(Writer* writer);
1608
1609 virtual ~TypeLiteral();
1610
1611 DEFINE_CASTING_OPERATIONS(TypeLiteral);
1612
1613 virtual void AcceptExpressionVisitor(ExpressionVisitor* visitor);
1614 virtual void VisitChildren(Visitor* visitor);
1615
1616 DartType* type() { return type_; }
1617
1618 private:
1619 TypeLiteral() {}
1620
1621 Child<DartType> type_;
1622
1623 DISALLOW_COPY_AND_ASSIGN(TypeLiteral);
1624 };
1625
1626
1627 class ThisExpression : public Expression {
1628 public:
1629 static ThisExpression* ReadFrom(Reader* reader);
1630 virtual void WriteTo(Writer* writer);
1631
1632 virtual ~ThisExpression();
1633
1634 DEFINE_CASTING_OPERATIONS(ThisExpression);
1635
1636 virtual void AcceptExpressionVisitor(ExpressionVisitor* visitor);
1637 virtual void VisitChildren(Visitor* visitor);
1638 };
1639
1640
1641 class Rethrow : public Expression {
1642 public:
1643 static Rethrow* ReadFrom(Reader* reader);
1644 virtual void WriteTo(Writer* writer);
1645
1646 virtual ~Rethrow();
1647
1648 DEFINE_CASTING_OPERATIONS(Rethrow);
1649
1650 virtual void AcceptExpressionVisitor(ExpressionVisitor* visitor);
1651 virtual void VisitChildren(Visitor* visitor);
1652 };
1653
1654
1655 class Throw : public Expression {
1656 public:
1657 static Throw* ReadFrom(Reader* reader);
1658 virtual void WriteTo(Writer* writer);
1659
1660 virtual ~Throw();
1661
1662 DEFINE_CASTING_OPERATIONS(Throw);
1663
1664 virtual void AcceptExpressionVisitor(ExpressionVisitor* visitor);
1665 virtual void VisitChildren(Visitor* visitor);
1666
1667 Expression* expression() { return expression_; }
1668
1669 private:
1670 Throw() {}
1671
1672 Child<Expression> expression_;
1673
1674 DISALLOW_COPY_AND_ASSIGN(Throw);
1675 };
1676
1677
1678 class ListLiteral : public Expression {
1679 public:
1680 static ListLiteral* ReadFrom(Reader* reader, bool is_const);
1681 virtual void WriteTo(Writer* writer);
1682
1683 virtual ~ListLiteral();
1684
1685 DEFINE_CASTING_OPERATIONS(ListLiteral);
1686
1687 virtual void AcceptExpressionVisitor(ExpressionVisitor* visitor);
1688 virtual void VisitChildren(Visitor* visitor);
1689
1690 bool is_const() { return is_const_; }
1691 DartType* type() { return type_; }
1692 List<Expression>& expressions() { return expressions_; }
1693
1694 private:
1695 ListLiteral() {}
1696
1697 bool is_const_;
1698 Child<DartType> type_;
1699 List<Expression> expressions_;
1700
1701 DISALLOW_COPY_AND_ASSIGN(ListLiteral);
1702 };
1703
1704
1705 class MapLiteral : public Expression {
1706 public:
1707 static MapLiteral* ReadFrom(Reader* reader, bool is_const);
1708 virtual void WriteTo(Writer* writer);
1709
1710 virtual ~MapLiteral();
1711
1712 DEFINE_CASTING_OPERATIONS(MapLiteral);
1713
1714 virtual void AcceptExpressionVisitor(ExpressionVisitor* visitor);
1715 virtual void VisitChildren(Visitor* visitor);
1716
1717 bool is_const() { return is_const_; }
1718 DartType* key_type() { return key_type_; }
1719 DartType* value_type() { return value_type_; }
1720 List<MapEntry>& entries() { return entries_; }
1721
1722 private:
1723 MapLiteral() {}
1724
1725 bool is_const_;
1726 Child<DartType> key_type_;
1727 Child<DartType> value_type_;
1728 List<MapEntry> entries_;
1729
1730 DISALLOW_COPY_AND_ASSIGN(MapLiteral);
1731 };
1732
1733
1734 class MapEntry : public TreeNode {
1735 public:
1736 static MapEntry* ReadFrom(Reader* reader);
1737 virtual void WriteTo(Writer* writer);
1738
1739 virtual ~MapEntry();
1740
1741 DEFINE_CASTING_OPERATIONS(MapEntry);
1742
1743 virtual void AcceptTreeVisitor(TreeVisitor* visitor);
1744 virtual void VisitChildren(Visitor* visitor);
1745
1746 Expression* key() { return key_; }
1747 Expression* value() { return value_; }
1748
1749 private:
1750 MapEntry() {}
1751
1752 template <typename T>
1753 friend class List;
1754
1755 Child<Expression> key_;
1756 Child<Expression> value_;
1757
1758 DISALLOW_COPY_AND_ASSIGN(MapEntry);
1759 };
1760
1761
1762 class AwaitExpression : public Expression {
1763 public:
1764 static AwaitExpression* ReadFrom(Reader* reader);
1765 virtual void WriteTo(Writer* writer);
1766
1767 virtual ~AwaitExpression();
1768
1769 DEFINE_CASTING_OPERATIONS(AwaitExpression);
1770
1771 virtual void AcceptExpressionVisitor(ExpressionVisitor* visitor);
1772 virtual void VisitChildren(Visitor* visitor);
1773
1774 Expression* operand() { return operand_; }
1775
1776 private:
1777 AwaitExpression() {}
1778
1779 Child<Expression> operand_;
1780
1781 DISALLOW_COPY_AND_ASSIGN(AwaitExpression);
1782 };
1783
1784
1785 class FunctionExpression : public Expression {
1786 public:
1787 static FunctionExpression* ReadFrom(Reader* reader);
1788 virtual void WriteTo(Writer* writer);
1789
1790 virtual ~FunctionExpression();
1791
1792 DEFINE_CASTING_OPERATIONS(FunctionExpression);
1793
1794 virtual void AcceptExpressionVisitor(ExpressionVisitor* visitor);
1795 virtual void VisitChildren(Visitor* visitor);
1796
1797 FunctionNode* function() { return function_; }
1798
1799 private:
1800 FunctionExpression() {}
1801
1802 Child<FunctionNode> function_;
1803
1804 DISALLOW_COPY_AND_ASSIGN(FunctionExpression);
1805 };
1806
1807
1808 class Let : public Expression {
1809 public:
1810 static Let* ReadFrom(Reader* reader);
1811 virtual void WriteTo(Writer* writer);
1812
1813 virtual ~Let();
1814
1815 DEFINE_CASTING_OPERATIONS(Let);
1816
1817 virtual void AcceptExpressionVisitor(ExpressionVisitor* visitor);
1818 virtual void VisitChildren(Visitor* visitor);
1819
1820 VariableDeclaration* variable() { return variable_; }
1821 Expression* body() { return body_; }
1822
1823 private:
1824 Let() {}
1825
1826 Child<VariableDeclaration> variable_;
1827 Child<Expression> body_;
1828
1829 DISALLOW_COPY_AND_ASSIGN(Let);
1830 };
1831
1832
1833 class BlockExpression : public Expression {
1834 public:
1835 static BlockExpression* ReadFrom(Reader* reader);
1836 virtual void WriteTo(Writer* writer);
1837
1838 virtual ~BlockExpression();
1839
1840 DEFINE_CASTING_OPERATIONS(BlockExpression);
1841
1842 virtual void AcceptExpressionVisitor(ExpressionVisitor* visitor);
1843 virtual void VisitChildren(Visitor* visitor);
1844
1845 Block* body() { return body_; }
1846 Expression* value() { return value_; }
1847
1848 private:
1849 BlockExpression() {}
1850
1851 Child<Block> body_;
1852 Child<Expression> value_;
1853
1854 DISALLOW_COPY_AND_ASSIGN(BlockExpression);
1855 };
1856
1857
1858 class Statement : public TreeNode {
1859 public:
1860 static Statement* ReadFrom(Reader* reader);
1861 virtual void WriteTo(Writer* writer) = 0;
1862
1863 virtual ~Statement();
1864
1865 DEFINE_CASTING_OPERATIONS(Statement);
1866
1867 virtual void AcceptTreeVisitor(TreeVisitor* visitor);
1868 virtual void AcceptStatementVisitor(StatementVisitor* visitor) = 0;
1869 };
1870
1871
1872 class InvalidStatement : public Statement {
1873 public:
1874 static InvalidStatement* ReadFrom(Reader* reader);
1875 virtual void WriteTo(Writer* writer);
1876
1877 virtual ~InvalidStatement();
1878
1879 DEFINE_CASTING_OPERATIONS(InvalidStatement);
1880
1881 virtual void AcceptStatementVisitor(StatementVisitor* visitor);
1882 virtual void VisitChildren(Visitor* visitor);
1883 };
1884
1885
1886 class ExpressionStatement : public Statement {
1887 public:
1888 static ExpressionStatement* ReadFrom(Reader* reader);
1889 virtual void WriteTo(Writer* writer);
1890
1891 explicit ExpressionStatement(Expression* exp) : expression_(exp) {}
1892 virtual ~ExpressionStatement();
1893
1894 DEFINE_CASTING_OPERATIONS(ExpressionStatement);
1895
1896 virtual void AcceptStatementVisitor(StatementVisitor* visitor);
1897 virtual void VisitChildren(Visitor* visitor);
1898
1899 Expression* expression() { return expression_; }
1900
1901 private:
1902 ExpressionStatement() {}
1903
1904 Child<Expression> expression_;
1905
1906 DISALLOW_COPY_AND_ASSIGN(ExpressionStatement);
1907 };
1908
1909
1910 class Block : public Statement {
1911 public:
1912 static Block* ReadFromImpl(Reader* reader);
1913 virtual void WriteTo(Writer* writer);
1914 void WriteToImpl(Writer* writer);
1915
1916 virtual ~Block();
1917
1918 DEFINE_CASTING_OPERATIONS(Block);
1919
1920 virtual void AcceptStatementVisitor(StatementVisitor* visitor);
1921 virtual void VisitChildren(Visitor* visitor);
1922
1923 List<Statement>& statements() { return statements_; }
1924
1925 private:
1926 Block() {}
1927
1928 List<Statement> statements_;
1929
1930 DISALLOW_COPY_AND_ASSIGN(Block);
1931 };
1932
1933
1934 class EmptyStatement : public Statement {
1935 public:
1936 static EmptyStatement* ReadFrom(Reader* reader);
1937 virtual void WriteTo(Writer* writer);
1938
1939 virtual ~EmptyStatement();
1940
1941 DEFINE_CASTING_OPERATIONS(EmptyStatement);
1942
1943 virtual void AcceptStatementVisitor(StatementVisitor* visitor);
1944 virtual void VisitChildren(Visitor* visitor);
1945 };
1946
1947
1948 class AssertStatement : public Statement {
1949 public:
1950 static AssertStatement* ReadFrom(Reader* reader);
1951 virtual void WriteTo(Writer* writer);
1952
1953 virtual ~AssertStatement();
1954
1955 DEFINE_CASTING_OPERATIONS(AssertStatement);
1956
1957 virtual void AcceptStatementVisitor(StatementVisitor* visitor);
1958 virtual void VisitChildren(Visitor* visitor);
1959
1960 Expression* condition() { return condition_; }
1961 Expression* message() { return message_; }
1962
1963 private:
1964 AssertStatement() {}
1965
1966 Child<Expression> condition_;
1967 Child<Expression> message_;
1968
1969 DISALLOW_COPY_AND_ASSIGN(AssertStatement);
1970 };
1971
1972
1973 class LabeledStatement : public Statement {
1974 public:
1975 static LabeledStatement* ReadFrom(Reader* reader);
1976 virtual void WriteTo(Writer* writer);
1977
1978 virtual ~LabeledStatement();
1979
1980 DEFINE_CASTING_OPERATIONS(LabeledStatement);
1981
1982 virtual void AcceptStatementVisitor(StatementVisitor* visitor);
1983 virtual void VisitChildren(Visitor* visitor);
1984
1985 Statement* body() { return body_; }
1986
1987 private:
1988 LabeledStatement() {}
1989
1990 Child<Statement> body_;
1991
1992 DISALLOW_COPY_AND_ASSIGN(LabeledStatement);
1993 };
1994
1995
1996 class BreakStatement : public Statement {
1997 public:
1998 static BreakStatement* ReadFrom(Reader* reader);
1999 virtual void WriteTo(Writer* writer);
2000
2001 virtual ~BreakStatement();
2002
2003 DEFINE_CASTING_OPERATIONS(BreakStatement);
2004
2005 virtual void AcceptStatementVisitor(StatementVisitor* visitor);
2006 virtual void VisitChildren(Visitor* visitor);
2007
2008 LabeledStatement* target() { return target_; }
2009
2010 private:
2011 BreakStatement() {}
2012
2013 Ref<LabeledStatement> target_;
2014
2015 DISALLOW_COPY_AND_ASSIGN(BreakStatement);
2016 };
2017
2018
2019 class WhileStatement : public Statement {
2020 public:
2021 static WhileStatement* ReadFrom(Reader* reader);
2022 virtual void WriteTo(Writer* writer);
2023
2024 virtual ~WhileStatement();
2025
2026 DEFINE_CASTING_OPERATIONS(WhileStatement);
2027
2028 virtual void AcceptStatementVisitor(StatementVisitor* visitor);
2029 virtual void VisitChildren(Visitor* visitor);
2030
2031 Expression* condition() { return condition_; }
2032 Statement* body() { return body_; }
2033
2034 private:
2035 WhileStatement() {}
2036
2037 Child<Expression> condition_;
2038 Child<Statement> body_;
2039
2040 DISALLOW_COPY_AND_ASSIGN(WhileStatement);
2041 };
2042
2043
2044 class DoStatement : public Statement {
2045 public:
2046 static DoStatement* ReadFrom(Reader* reader);
2047 virtual void WriteTo(Writer* writer);
2048
2049 virtual ~DoStatement();
2050
2051 DEFINE_CASTING_OPERATIONS(DoStatement);
2052
2053 virtual void AcceptStatementVisitor(StatementVisitor* visitor);
2054 virtual void VisitChildren(Visitor* visitor);
2055
2056 Expression* condition() { return condition_; }
2057 Statement* body() { return body_; }
2058
2059 private:
2060 DoStatement() {}
2061
2062 Child<Expression> condition_;
2063 Child<Statement> body_;
2064
2065 DISALLOW_COPY_AND_ASSIGN(DoStatement);
2066 };
2067
2068
2069 class ForStatement : public Statement {
2070 public:
2071 static ForStatement* ReadFrom(Reader* reader);
2072 virtual void WriteTo(Writer* writer);
2073
2074 virtual ~ForStatement();
2075
2076 DEFINE_CASTING_OPERATIONS(ForStatement);
2077
2078 virtual void AcceptStatementVisitor(StatementVisitor* visitor);
2079 virtual void VisitChildren(Visitor* visitor);
2080
2081 List<VariableDeclaration>& variables() { return variables_; }
2082 Expression* condition() { return condition_; }
2083 List<Expression>& updates() { return updates_; }
2084 Statement* body() { return body_; }
2085
2086 private:
2087 ForStatement() {}
2088
2089 List<VariableDeclaration> variables_;
2090 Child<Expression> condition_;
2091 List<Expression> updates_;
2092 Child<Statement> body_;
2093
2094 DISALLOW_COPY_AND_ASSIGN(ForStatement);
2095 };
2096
2097
2098 class ForInStatement : public Statement {
2099 public:
2100 static ForInStatement* ReadFrom(Reader* reader, bool is_async);
2101 virtual void WriteTo(Writer* writer);
2102
2103 virtual ~ForInStatement();
2104
2105 DEFINE_CASTING_OPERATIONS(ForInStatement);
2106
2107 virtual void AcceptStatementVisitor(StatementVisitor* visitor);
2108 virtual void VisitChildren(Visitor* visitor);
2109
2110 VariableDeclaration* variable() { return variable_; }
2111 Expression* iterable() { return iterable_; }
2112 Statement* body() { return body_; }
2113 bool is_async() { return is_async_; }
2114
2115 private:
2116 ForInStatement() {}
2117
2118 Child<VariableDeclaration> variable_;
2119 Child<Expression> iterable_;
2120 Child<Statement> body_;
2121 bool is_async_;
2122
2123 DISALLOW_COPY_AND_ASSIGN(ForInStatement);
2124 };
2125
2126
2127 class SwitchStatement : public Statement {
2128 public:
2129 static SwitchStatement* ReadFrom(Reader* reader);
2130 virtual void WriteTo(Writer* writer);
2131
2132 virtual ~SwitchStatement();
2133
2134 DEFINE_CASTING_OPERATIONS(SwitchStatement);
2135
2136 virtual void AcceptStatementVisitor(StatementVisitor* visitor);
2137 virtual void VisitChildren(Visitor* visitor);
2138
2139 Expression* condition() { return condition_; }
2140 List<SwitchCase>& cases() { return cases_; }
2141
2142 private:
2143 SwitchStatement() {}
2144
2145 Child<Expression> condition_;
2146 List<SwitchCase> cases_;
2147
2148 DISALLOW_COPY_AND_ASSIGN(SwitchStatement);
2149 };
2150
2151
2152 class SwitchCase : public TreeNode {
2153 public:
2154 SwitchCase* ReadFrom(Reader* reader);
2155 void WriteTo(Writer* writer);
2156
2157 virtual ~SwitchCase();
2158
2159 DEFINE_CASTING_OPERATIONS(SwitchCase);
2160
2161 virtual void AcceptTreeVisitor(TreeVisitor* visitor);
2162 virtual void VisitChildren(Visitor* visitor);
2163
2164 List<Expression>& expressions() { return expressions_; }
2165 bool is_default() { return is_default_; }
2166 Statement* body() { return body_; }
2167
2168 private:
2169 SwitchCase() {}
2170
2171 template <typename T>
2172 friend class List;
2173
2174 List<Expression> expressions_;
2175 bool is_default_;
2176 Child<Statement> body_;
2177
2178 DISALLOW_COPY_AND_ASSIGN(SwitchCase);
2179 };
2180
2181
2182 class ContinueSwitchStatement : public Statement {
2183 public:
2184 static ContinueSwitchStatement* ReadFrom(Reader* reader);
2185 virtual void WriteTo(Writer* writer);
2186
2187 virtual ~ContinueSwitchStatement();
2188
2189 DEFINE_CASTING_OPERATIONS(ContinueSwitchStatement);
2190
2191 virtual void AcceptStatementVisitor(StatementVisitor* visitor);
2192 virtual void VisitChildren(Visitor* visitor);
2193
2194 SwitchCase* target() { return target_; }
2195
2196 private:
2197 ContinueSwitchStatement() {}
2198
2199 Ref<SwitchCase> target_;
2200
2201 DISALLOW_COPY_AND_ASSIGN(ContinueSwitchStatement);
2202 };
2203
2204
2205 class IfStatement : public Statement {
2206 public:
2207 static IfStatement* ReadFrom(Reader* reader);
2208 virtual void WriteTo(Writer* writer);
2209
2210 virtual ~IfStatement();
2211
2212 DEFINE_CASTING_OPERATIONS(IfStatement);
2213
2214 virtual void AcceptStatementVisitor(StatementVisitor* visitor);
2215 virtual void VisitChildren(Visitor* visitor);
2216
2217 Expression* condition() { return condition_; }
2218 Statement* then() { return then_; }
2219 Statement* otherwise() { return otherwise_; }
2220
2221 private:
2222 IfStatement() {}
2223
2224 Child<Expression> condition_;
2225 Child<Statement> then_;
2226 Child<Statement> otherwise_;
2227
2228 DISALLOW_COPY_AND_ASSIGN(IfStatement);
2229 };
2230
2231
2232 class ReturnStatement : public Statement {
2233 public:
2234 static ReturnStatement* ReadFrom(Reader* reader);
2235 virtual void WriteTo(Writer* writer);
2236
2237 virtual ~ReturnStatement();
2238
2239 DEFINE_CASTING_OPERATIONS(ReturnStatement);
2240
2241 virtual void AcceptStatementVisitor(StatementVisitor* visitor);
2242 virtual void VisitChildren(Visitor* visitor);
2243
2244 Expression* expression() { return expression_; }
2245
2246 private:
2247 ReturnStatement() {}
2248
2249 Child<Expression> expression_;
2250
2251 DISALLOW_COPY_AND_ASSIGN(ReturnStatement);
2252 };
2253
2254
2255 class TryCatch : public Statement {
2256 public:
2257 static TryCatch* ReadFrom(Reader* reader);
2258 virtual void WriteTo(Writer* writer);
2259
2260 virtual ~TryCatch();
2261
2262 DEFINE_CASTING_OPERATIONS(TryCatch);
2263
2264 virtual void AcceptStatementVisitor(StatementVisitor* visitor);
2265 virtual void VisitChildren(Visitor* visitor);
2266
2267 Statement* body() { return body_; }
2268 List<Catch>& catches() { return catches_; }
2269
2270 private:
2271 TryCatch() {}
2272
2273 Child<Statement> body_;
2274 List<Catch> catches_;
2275
2276 DISALLOW_COPY_AND_ASSIGN(TryCatch);
2277 };
2278
2279
2280 class Catch : public TreeNode {
2281 public:
2282 static Catch* ReadFrom(Reader* reader);
2283 void WriteTo(Writer* writer);
2284
2285 virtual ~Catch();
2286
2287 DEFINE_CASTING_OPERATIONS(Catch);
2288
2289 virtual void AcceptTreeVisitor(TreeVisitor* visitor);
2290 virtual void VisitChildren(Visitor* visitor);
2291
2292 DartType* guard() { return guard_; }
2293 VariableDeclaration* exception() { return exception_; }
2294 VariableDeclaration* stack_trace() { return stack_trace_; }
2295 Statement* body() { return body_; }
2296
2297 private:
2298 Catch() {}
2299
2300 template <typename T>
2301 friend class List;
2302
2303 Child<DartType> guard_;
2304 Child<VariableDeclaration> exception_;
2305 Child<VariableDeclaration> stack_trace_;
2306 Child<Statement> body_;
2307
2308 DISALLOW_COPY_AND_ASSIGN(Catch);
2309 };
2310
2311
2312 class TryFinally : public Statement {
2313 public:
2314 static TryFinally* ReadFrom(Reader* reader);
2315 virtual void WriteTo(Writer* writer);
2316
2317 virtual ~TryFinally();
2318
2319 DEFINE_CASTING_OPERATIONS(TryFinally);
2320
2321 virtual void AcceptStatementVisitor(StatementVisitor* visitor);
2322 virtual void VisitChildren(Visitor* visitor);
2323
2324 Statement* body() { return body_; }
2325 Statement* finalizer() { return finalizer_; }
2326
2327 private:
2328 TryFinally() {}
2329
2330 Child<Statement> body_;
2331 Child<Statement> finalizer_;
2332
2333 DISALLOW_COPY_AND_ASSIGN(TryFinally);
2334 };
2335
2336
2337 class YieldStatement : public Statement {
2338 public:
2339 enum {
2340 kFlagYieldStar = 1 << 0,
2341 kFlagNative = 1 << 1,
2342 };
2343 static YieldStatement* ReadFrom(Reader* reader);
2344 virtual void WriteTo(Writer* writer);
2345
2346 virtual ~YieldStatement();
2347
2348 DEFINE_CASTING_OPERATIONS(YieldStatement);
2349
2350 virtual void AcceptStatementVisitor(StatementVisitor* visitor);
2351 virtual void VisitChildren(Visitor* visitor);
2352
2353 bool is_yield_start() { return (flags_ & kFlagYieldStar) == kFlagYieldStar; }
2354 bool is_native() { return (flags_ & kFlagNative) == kFlagNative; }
2355 Expression* expression() { return expression_; }
2356
2357 private:
2358 YieldStatement() {}
2359
2360 word flags_;
2361 Child<Expression> expression_;
2362
2363 DISALLOW_COPY_AND_ASSIGN(YieldStatement);
2364 };
2365
2366
2367 class VariableDeclaration : public Statement {
2368 public:
2369 enum Flags {
2370 kFlagFinal = 1 << 0,
2371 kFlagConst = 1 << 1,
2372 };
2373
2374 static VariableDeclaration* ReadFrom(Reader* reader);
2375 static VariableDeclaration* ReadFromImpl(Reader* reader);
2376 virtual void WriteTo(Writer* writer);
2377 void WriteToImpl(Writer* writer);
2378
2379 virtual ~VariableDeclaration();
2380
2381 DEFINE_CASTING_OPERATIONS(VariableDeclaration);
2382
2383 virtual void AcceptStatementVisitor(StatementVisitor* visitor);
2384 virtual void VisitChildren(Visitor* visitor);
2385
2386 bool IsConst() { return (flags_ & kFlagConst) == kFlagConst; }
2387 bool IsFinal() { return (flags_ & kFlagFinal) == kFlagFinal; }
2388
2389 String* name() { return name_; }
2390 DartType* type() { return type_; }
2391 InferredValue* inferred_value() { return inferred_value_; }
2392 Expression* initializer() { return initializer_; }
2393
2394 private:
2395 VariableDeclaration() {}
2396
2397 template <typename T>
2398 friend class List;
2399
2400 word flags_;
2401 Ref<String> name_;
2402 Child<DartType> type_;
2403 Child<InferredValue> inferred_value_;
2404 Child<Expression> initializer_;
2405
2406 DISALLOW_COPY_AND_ASSIGN(VariableDeclaration);
2407 };
2408
2409
2410 class FunctionDeclaration : public Statement {
2411 public:
2412 static FunctionDeclaration* ReadFrom(Reader* reader);
2413 virtual void WriteTo(Writer* writer);
2414
2415 virtual ~FunctionDeclaration();
2416
2417 DEFINE_CASTING_OPERATIONS(FunctionDeclaration);
2418
2419 virtual void AcceptStatementVisitor(StatementVisitor* visitor);
2420 virtual void VisitChildren(Visitor* visitor);
2421
2422 VariableDeclaration* variable() { return variable_; }
2423 FunctionNode* function() { return function_; }
2424
2425 private:
2426 FunctionDeclaration() {}
2427
2428 Child<VariableDeclaration> variable_;
2429 Child<FunctionNode> function_;
2430
2431 DISALLOW_COPY_AND_ASSIGN(FunctionDeclaration);
2432 };
2433
2434
2435 class Name : public Node {
2436 public:
2437 static Name* ReadFrom(Reader* reader);
2438 void WriteTo(Writer* writer);
2439
2440 virtual ~Name();
2441
2442 DEFINE_CASTING_OPERATIONS(Name);
2443
2444 virtual void AcceptVisitor(Visitor* visitor);
2445 virtual void VisitChildren(Visitor* visitor);
2446
2447 String* string() { return string_; }
2448 Library* library() { return library_; }
2449
2450 private:
2451 Name(String* string, Library* library) : string_(string), library_(library) {}
2452
2453 Ref<String> string_;
2454 Ref<Library> library_;
2455 };
2456
2457 // TODO(kunstermann): _PrivateName/_PublicName : Name
2458
2459
2460 class InferredValue : public Node {
2461 public:
2462 static const uint8_t kNull = 1 << 0;
2463 static const uint8_t kInteger = 1 << 1;
2464 static const uint8_t kDouble = 1 << 2;
2465 static const uint8_t kString = 1 << 3;
2466 static const uint8_t kOther = 1 << 4;
2467
2468 enum BaseClassKind {
2469 kNone,
2470 kExact,
2471 kSubclass,
2472 kSubtype,
2473 };
2474
2475 static InferredValue* ReadFrom(Reader* reader);
2476 void WriteTo(Writer* writer);
2477
2478 virtual ~InferredValue();
2479
2480 DEFINE_CASTING_OPERATIONS(InferredValue);
2481
2482 virtual void AcceptVisitor(Visitor* visitor);
2483 virtual void VisitChildren(Visitor* visitor);
2484
2485 bool IsInterfaceType() { return kind_ == kSubtype; }
2486 bool IsExactClass() { return kind_ == kExact; }
2487 bool IsSubclass() { return kind_ == kSubclass; }
2488
2489 bool CanBeNull() { return (value_bits_ & kNull) != 0; }
2490 bool CanBeInteger() { return (value_bits_ & kInteger) != 0; }
2491 bool CanBeDouble() { return (value_bits_ & kDouble) != 0; }
2492 bool CanBeString() { return (value_bits_ & kString) != 0; }
2493
2494 bool IsAlwaysNull() { return value_bits_ == kNull; }
2495 bool IsAlwaysInteger() { return value_bits_ == kInteger; }
2496 bool IsAlwaysDouble() { return value_bits_ == kDouble; }
2497 bool IsAlwaysString() { return value_bits_ == kString; }
2498
2499 Class* klass() { return klass_; }
2500 BaseClassKind kind() { return kind_; }
2501 uint8_t value_bits() { return value_bits_; }
2502
2503 private:
2504 Ref<Class> klass_;
2505 BaseClassKind kind_;
2506 uint8_t value_bits_;
2507 };
2508
2509
2510 class DartType : public Node {
2511 public:
2512 static DartType* ReadFrom(Reader* reader);
2513 virtual void WriteTo(Writer* writer) = 0;
2514
2515 virtual ~DartType();
2516
2517 DEFINE_CASTING_OPERATIONS(DartType);
2518
2519 virtual void AcceptVisitor(Visitor* visitor);
2520 virtual void AcceptDartTypeVisitor(DartTypeVisitor* visitor) = 0;
2521 };
2522
2523
2524 class InvalidType : public DartType {
2525 public:
2526 static InvalidType* ReadFrom(Reader* reader);
2527 void WriteTo(Writer* writer);
2528
2529 virtual ~InvalidType();
2530
2531 DEFINE_CASTING_OPERATIONS(InvalidType);
2532
2533 virtual void AcceptDartTypeVisitor(DartTypeVisitor* visitor);
2534 virtual void VisitChildren(Visitor* visitor);
2535 };
2536
2537
2538 class DynamicType : public DartType {
2539 public:
2540 static DynamicType* ReadFrom(Reader* reader);
2541 void WriteTo(Writer* writer);
2542
2543 virtual ~DynamicType();
2544
2545 DEFINE_CASTING_OPERATIONS(DynamicType);
2546
2547 virtual void AcceptDartTypeVisitor(DartTypeVisitor* visitor);
2548 virtual void VisitChildren(Visitor* visitor);
2549 };
2550
2551
2552 class VoidType : public DartType {
2553 public:
2554 static VoidType* ReadFrom(Reader* reader);
2555 void WriteTo(Writer* writer);
2556
2557 virtual ~VoidType();
2558
2559 DEFINE_CASTING_OPERATIONS(VoidType);
2560
2561 virtual void AcceptDartTypeVisitor(DartTypeVisitor* visitor);
2562 virtual void VisitChildren(Visitor* visitor);
2563 };
2564
2565
2566 class InterfaceType : public DartType {
2567 public:
2568 static InterfaceType* ReadFrom(Reader* reader);
2569 static InterfaceType* ReadFrom(Reader* reader, bool _without_type_arguments_);
2570 void WriteTo(Writer* writer);
2571
2572 explicit InterfaceType(Class* klass) : klass_(klass) {}
2573 virtual ~InterfaceType();
2574
2575 DEFINE_CASTING_OPERATIONS(InterfaceType);
2576
2577 virtual void AcceptDartTypeVisitor(DartTypeVisitor* visitor);
2578 virtual void VisitChildren(Visitor* visitor);
2579
2580 Class* klass() { return klass_; }
2581 List<DartType>& type_arguments() { return type_arguments_; }
2582
2583 private:
2584 InterfaceType() {}
2585
2586 Ref<Class> klass_;
2587 List<DartType> type_arguments_;
2588
2589 DISALLOW_COPY_AND_ASSIGN(InterfaceType);
2590 };
2591
2592
2593 class FunctionType : public DartType {
2594 public:
2595 static FunctionType* ReadFrom(Reader* reader);
2596 static FunctionType* ReadFrom(Reader* reader, bool _without_type_arguments_);
2597 void WriteTo(Writer* writer);
2598
2599 virtual ~FunctionType();
2600
2601 DEFINE_CASTING_OPERATIONS(FunctionType);
2602
2603 virtual void AcceptDartTypeVisitor(DartTypeVisitor* visitor);
2604 virtual void VisitChildren(Visitor* visitor);
2605
2606 TypeParameterList& type_parameters() { return type_parameters_; }
2607 int required_parameter_count() { return required_parameter_count_; }
2608 List<DartType>& positional_parameters() { return positional_parameters_; }
2609 List<Tuple<String, DartType> >& named_parameters() {
2610 return named_parameters_;
2611 }
2612 DartType* return_type() { return return_type_; }
2613
2614 private:
2615 FunctionType() {}
2616
2617 TypeParameterList type_parameters_;
2618 int required_parameter_count_;
2619 List<DartType> positional_parameters_;
2620 List<Tuple<String, DartType> > named_parameters_;
2621 Child<DartType> return_type_;
2622
2623 DISALLOW_COPY_AND_ASSIGN(FunctionType);
2624 };
2625
2626
2627 class TypeParameterType : public DartType {
2628 public:
2629 static TypeParameterType* ReadFrom(Reader* reader);
2630 void WriteTo(Writer* writer);
2631
2632 virtual ~TypeParameterType();
2633
2634 DEFINE_CASTING_OPERATIONS(TypeParameterType);
2635
2636 virtual void AcceptDartTypeVisitor(DartTypeVisitor* visitor);
2637 virtual void VisitChildren(Visitor* visitor);
2638
2639 TypeParameter* parameter() { return parameter_; }
2640
2641 private:
2642 TypeParameterType() {}
2643
2644 Ref<TypeParameter> parameter_;
2645
2646 DISALLOW_COPY_AND_ASSIGN(TypeParameterType);
2647 };
2648
2649
2650 class TypeParameter : public TreeNode {
2651 public:
2652 TypeParameter* ReadFrom(Reader* reader);
2653 void WriteTo(Writer* writer);
2654
2655 virtual ~TypeParameter();
2656
2657 DEFINE_CASTING_OPERATIONS(TypeParameter);
2658
2659 virtual void AcceptTreeVisitor(TreeVisitor* visitor);
2660 virtual void VisitChildren(Visitor* visitor);
2661
2662 String* name() { return name_; }
2663 DartType* bound() { return bound_; }
2664
2665 private:
2666 TypeParameter() {}
2667
2668 template <typename T>
2669 friend class List;
2670 friend class TypeParameterList;
2671
2672 Ref<String> name_;
2673 Child<DartType> bound_;
2674
2675 DISALLOW_COPY_AND_ASSIGN(TypeParameter);
2676 };
2677
2678
2679 class Program : public TreeNode {
2680 public:
2681 static Program* ReadFrom(Reader* reader);
2682 void WriteTo(Writer* writer);
2683
2684 virtual ~Program();
2685
2686 DEFINE_CASTING_OPERATIONS(Program);
2687
2688 virtual void AcceptTreeVisitor(TreeVisitor* visitor);
2689 virtual void VisitChildren(Visitor* visitor);
2690
2691 StringTable& string_table() { return string_table_; }
2692 List<Library>& libraries() { return libraries_; }
2693 Procedure* main_method() { return main_method_; }
2694
2695 private:
2696 Program() {}
2697
2698 List<Library> libraries_;
2699 Ref<Procedure> main_method_;
2700 StringTable string_table_;
2701
2702 DISALLOW_COPY_AND_ASSIGN(Program);
2703 };
2704
2705
2706 class Reference {
2707 public:
2708 static Member* ReadMemberFrom(Reader* reader, bool allow_null = false);
2709 static void WriteMemberTo(Writer* writer, Member* member,
2710 bool allow_null = false);
2711
2712 static Class* ReadClassFrom(Reader* reader, bool allow_null = false);
2713 static void WriteClassTo(Writer* writer, Class* klass,
2714 bool allow_null = false);
2715
2716 static String* ReadStringFrom(Reader* reader);
2717 static void WriteStringTo(Writer* writer, String* string); // NOLINT
2718 };
2719
2720
2721 class ExpressionVisitor {
2722 public:
2723 virtual ~ExpressionVisitor() {}
2724
2725 virtual void VisitDefaultExpression(Expression* node) = 0;
2726 virtual void VisitDefaultBasicLiteral(BasicLiteral* node) {
2727 VisitDefaultExpression(node);
2728 }
2729 virtual void VisitInvalidExpression(InvalidExpression* node) {
2730 VisitDefaultExpression(node);
2731 }
2732 virtual void VisitVariableGet(VariableGet* node) {
2733 VisitDefaultExpression(node);
2734 }
2735 virtual void VisitVariableSet(VariableSet* node) {
2736 VisitDefaultExpression(node);
2737 }
2738 virtual void VisitPropertyGet(PropertyGet* node) {
2739 VisitDefaultExpression(node);
2740 }
2741 virtual void VisitPropertySet(PropertySet* node) {
2742 VisitDefaultExpression(node);
2743 }
2744 virtual void VisitDirectPropertyGet(DirectPropertyGet* node) {
2745 VisitDefaultExpression(node);
2746 }
2747 virtual void VisitDirectPropertySet(DirectPropertySet* node) {
2748 VisitDefaultExpression(node);
2749 }
2750 virtual void VisitStaticGet(StaticGet* node) { VisitDefaultExpression(node); }
2751 virtual void VisitStaticSet(StaticSet* node) { VisitDefaultExpression(node); }
2752 virtual void VisitMethodInvocation(MethodInvocation* node) {
2753 VisitDefaultExpression(node);
2754 }
2755 virtual void VisitDirectMethodInvocation(DirectMethodInvocation* node) {
2756 VisitDefaultExpression(node);
2757 }
2758 virtual void VisitStaticInvocation(StaticInvocation* node) {
2759 VisitDefaultExpression(node);
2760 }
2761 virtual void VisitConstructorInvocation(ConstructorInvocation* node) {
2762 VisitDefaultExpression(node);
2763 }
2764 virtual void VisitNot(Not* node) { VisitDefaultExpression(node); }
2765 virtual void VisitLogicalExpression(LogicalExpression* node) {
2766 VisitDefaultExpression(node);
2767 }
2768 virtual void VisitConditionalExpression(ConditionalExpression* node) {
2769 VisitDefaultExpression(node);
2770 }
2771 virtual void VisitStringConcatenation(StringConcatenation* node) {
2772 VisitDefaultExpression(node);
2773 }
2774 virtual void VisitIsExpression(IsExpression* node) {
2775 VisitDefaultExpression(node);
2776 }
2777 virtual void VisitAsExpression(AsExpression* node) {
2778 VisitDefaultExpression(node);
2779 }
2780 virtual void VisitSymbolLiteral(SymbolLiteral* node) {
2781 VisitDefaultExpression(node);
2782 }
2783 virtual void VisitTypeLiteral(TypeLiteral* node) {
2784 VisitDefaultExpression(node);
2785 }
2786 virtual void VisitThisExpression(ThisExpression* node) {
2787 VisitDefaultExpression(node);
2788 }
2789 virtual void VisitRethrow(Rethrow* node) { VisitDefaultExpression(node); }
2790 virtual void VisitThrow(Throw* node) { VisitDefaultExpression(node); }
2791 virtual void VisitListLiteral(ListLiteral* node) {
2792 VisitDefaultExpression(node);
2793 }
2794 virtual void VisitMapLiteral(MapLiteral* node) {
2795 VisitDefaultExpression(node);
2796 }
2797 virtual void VisitAwaitExpression(AwaitExpression* node) {
2798 VisitDefaultExpression(node);
2799 }
2800 virtual void VisitFunctionExpression(FunctionExpression* node) {
2801 VisitDefaultExpression(node);
2802 }
2803 virtual void VisitStringLiteral(StringLiteral* node) {
2804 VisitDefaultBasicLiteral(node);
2805 }
2806 virtual void VisitBigintLiteral(BigintLiteral* node) {
2807 VisitDefaultBasicLiteral(node);
2808 }
2809 virtual void VisitIntLiteral(IntLiteral* node) {
2810 VisitDefaultBasicLiteral(node);
2811 }
2812 virtual void VisitDoubleLiteral(DoubleLiteral* node) {
2813 VisitDefaultBasicLiteral(node);
2814 }
2815 virtual void VisitBoolLiteral(BoolLiteral* node) {
2816 VisitDefaultBasicLiteral(node);
2817 }
2818 virtual void VisitNullLiteral(NullLiteral* node) {
2819 VisitDefaultBasicLiteral(node);
2820 }
2821 virtual void VisitLet(Let* node) { VisitDefaultExpression(node); }
2822 virtual void VisitBlockExpression(BlockExpression* node) {
2823 VisitDefaultExpression(node);
2824 }
2825 };
2826
2827
2828 class StatementVisitor {
2829 public:
2830 virtual ~StatementVisitor() {}
2831
2832 virtual void VisitDefaultStatement(Statement* node) = 0;
2833 virtual void VisitInvalidStatement(InvalidStatement* node) {
2834 VisitDefaultStatement(node);
2835 }
2836 virtual void VisitExpressionStatement(ExpressionStatement* node) {
2837 VisitDefaultStatement(node);
2838 }
2839 virtual void VisitBlock(Block* node) { VisitDefaultStatement(node); }
2840 virtual void VisitEmptyStatement(EmptyStatement* node) {
2841 VisitDefaultStatement(node);
2842 }
2843 virtual void VisitAssertStatement(AssertStatement* node) {
2844 VisitDefaultStatement(node);
2845 }
2846 virtual void VisitLabeledStatement(LabeledStatement* node) {
2847 VisitDefaultStatement(node);
2848 }
2849 virtual void VisitBreakStatement(BreakStatement* node) {
2850 VisitDefaultStatement(node);
2851 }
2852 virtual void VisitWhileStatement(WhileStatement* node) {
2853 VisitDefaultStatement(node);
2854 }
2855 virtual void VisitDoStatement(DoStatement* node) {
2856 VisitDefaultStatement(node);
2857 }
2858 virtual void VisitForStatement(ForStatement* node) {
2859 VisitDefaultStatement(node);
2860 }
2861 virtual void VisitForInStatement(ForInStatement* node) {
2862 VisitDefaultStatement(node);
2863 }
2864 virtual void VisitSwitchStatement(SwitchStatement* node) {
2865 VisitDefaultStatement(node);
2866 }
2867 virtual void VisitContinueSwitchStatement(ContinueSwitchStatement* node) {
2868 VisitDefaultStatement(node);
2869 }
2870 virtual void VisitIfStatement(IfStatement* node) {
2871 VisitDefaultStatement(node);
2872 }
2873 virtual void VisitReturnStatement(ReturnStatement* node) {
2874 VisitDefaultStatement(node);
2875 }
2876 virtual void VisitTryCatch(TryCatch* node) { VisitDefaultStatement(node); }
2877 virtual void VisitTryFinally(TryFinally* node) {
2878 VisitDefaultStatement(node);
2879 }
2880 virtual void VisitYieldStatement(YieldStatement* node) {
2881 VisitDefaultStatement(node);
2882 }
2883 virtual void VisitVariableDeclaration(VariableDeclaration* node) {
2884 VisitDefaultStatement(node);
2885 }
2886 virtual void VisitFunctionDeclaration(FunctionDeclaration* node) {
2887 VisitDefaultStatement(node);
2888 }
2889 };
2890
2891
2892 class MemberVisitor {
2893 public:
2894 virtual ~MemberVisitor() {}
2895
2896 virtual void VisitDefaultMember(Member* node) = 0;
2897 virtual void VisitConstructor(Constructor* node) { VisitDefaultMember(node); }
2898 virtual void VisitProcedure(Procedure* node) { VisitDefaultMember(node); }
2899 virtual void VisitField(Field* node) { VisitDefaultMember(node); }
2900 };
2901
2902
2903 class ClassVisitor {
2904 public:
2905 virtual ~ClassVisitor() {}
2906
2907 virtual void VisitDefaultClass(Class* node) = 0;
2908 virtual void VisitNormalClass(NormalClass* node) { VisitDefaultClass(node); }
2909 virtual void VisitMixinClass(MixinClass* node) { VisitDefaultClass(node); }
2910 };
2911
2912
2913 class InitializerVisitor {
2914 public:
2915 virtual ~InitializerVisitor() {}
2916
2917 virtual void VisitDefaultInitializer(Initializer* node) = 0;
2918 virtual void VisitInvalidInitializer(InvalidInitializer* node) {
2919 VisitDefaultInitializer(node);
2920 }
2921 virtual void VisitFieldInitializer(FieldInitializer* node) {
2922 VisitDefaultInitializer(node);
2923 }
2924 virtual void VisitSuperInitializer(SuperInitializer* node) {
2925 VisitDefaultInitializer(node);
2926 }
2927 virtual void VisitRedirectingInitializer(RedirectingInitializer* node) {
2928 VisitDefaultInitializer(node);
2929 }
2930 virtual void VisitLocalInitializer(LocalInitializer* node) {
2931 VisitDefaultInitializer(node);
2932 }
2933 };
2934
2935
2936 class DartTypeVisitor {
2937 public:
2938 virtual ~DartTypeVisitor() {}
2939
2940 virtual void VisitDefaultDartType(DartType* node) = 0;
2941 virtual void VisitInvalidType(InvalidType* node) {
2942 VisitDefaultDartType(node);
2943 }
2944 virtual void VisitDynamicType(DynamicType* node) {
2945 VisitDefaultDartType(node);
2946 }
2947 virtual void VisitVoidType(VoidType* node) { VisitDefaultDartType(node); }
2948 virtual void VisitInterfaceType(InterfaceType* node) {
2949 VisitDefaultDartType(node);
2950 }
2951 virtual void VisitFunctionType(FunctionType* node) {
2952 VisitDefaultDartType(node);
2953 }
2954 virtual void VisitTypeParameterType(TypeParameterType* node) {
2955 VisitDefaultDartType(node);
2956 }
2957 };
2958
2959
2960 class ClassReferenceVisitor {
2961 public:
2962 virtual ~ClassReferenceVisitor() {}
2963
2964 virtual void VisitDefaultClassReference(Class* node) = 0;
2965 virtual void VisitNormalClassReference(NormalClass* node) {
2966 VisitDefaultClassReference(node);
2967 }
2968 virtual void VisitMixinClassReference(MixinClass* node) {
2969 VisitDefaultClassReference(node);
2970 }
2971 };
2972
2973
2974 class MemberReferenceVisitor {
2975 public:
2976 virtual ~MemberReferenceVisitor() {}
2977
2978 virtual void VisitDefaultMemberReference(Member* node) = 0;
2979 virtual void VisitFieldReference(Field* node) {
2980 VisitDefaultMemberReference(node);
2981 }
2982 virtual void VisitConstructorReference(Constructor* node) {
2983 VisitDefaultMemberReference(node);
2984 }
2985 virtual void VisitProcedureReference(Procedure* node) {
2986 VisitDefaultMemberReference(node);
2987 }
2988 };
2989
2990
2991 class TreeVisitor : public ExpressionVisitor,
2992 public StatementVisitor,
2993 public MemberVisitor,
2994 public ClassVisitor,
2995 public InitializerVisitor {
2996 public:
2997 virtual ~TreeVisitor() {}
2998
2999 virtual void VisitDefaultTreeNode(TreeNode* node) = 0;
3000 virtual void VisitDefaultStatement(Statement* node) {
3001 VisitDefaultTreeNode(node);
3002 }
3003 virtual void VisitDefaultExpression(Expression* node) {
3004 VisitDefaultTreeNode(node);
3005 }
3006 virtual void VisitDefaultMember(Member* node) { VisitDefaultTreeNode(node); }
3007 virtual void VisitDefaultClass(Class* node) { VisitDefaultTreeNode(node); }
3008 virtual void VisitDefaultInitializer(Initializer* node) {
3009 VisitDefaultTreeNode(node);
3010 }
3011
3012 virtual void VisitLibrary(Library* node) { VisitDefaultTreeNode(node); }
3013 virtual void VisitTypeParameter(TypeParameter* node) {
3014 VisitDefaultTreeNode(node);
3015 }
3016 virtual void VisitFunctionNode(FunctionNode* node) {
3017 VisitDefaultTreeNode(node);
3018 }
3019 virtual void VisitArguments(Arguments* node) { VisitDefaultTreeNode(node); }
3020 virtual void VisitNamedExpression(NamedExpression* node) {
3021 VisitDefaultTreeNode(node);
3022 }
3023 virtual void VisitSwitchCase(SwitchCase* node) { VisitDefaultTreeNode(node); }
3024 virtual void VisitCatch(Catch* node) { VisitDefaultTreeNode(node); }
3025 virtual void VisitMapEntry(MapEntry* node) { VisitDefaultTreeNode(node); }
3026 virtual void VisitProgram(Program* node) { VisitDefaultTreeNode(node); }
3027 };
3028
3029
3030 class Visitor : public TreeVisitor,
3031 public DartTypeVisitor,
3032 public ClassReferenceVisitor,
3033 public MemberReferenceVisitor {
3034 public:
3035 virtual ~Visitor() {}
3036
3037 virtual void VisitDefaultNode(Node* node) = 0;
3038 virtual void VisitInferredValue(InferredValue* node) {
3039 VisitDefaultNode(node);
3040 }
3041 virtual void VisitDefaultTreeNode(TreeNode* node) { VisitDefaultNode(node); }
3042 virtual void VisitDefaultDartType(DartType* node) { VisitDefaultNode(node); }
3043 virtual void VisitName(Name* node) { VisitDefaultNode(node); }
3044 virtual void VisitDefaultClassReference(Class* node) {
3045 VisitDefaultNode(node);
3046 }
3047 virtual void VisitDefaultMemberReference(Member* node) {
3048 VisitDefaultNode(node);
3049 }
3050 };
3051
3052
3053 class RecursiveVisitor : public Visitor {
3054 public:
3055 virtual ~RecursiveVisitor() {}
3056
3057 virtual void VisitDefaultNode(Node* node) { node->VisitChildren(this); }
3058
3059 virtual void VisitDefaultClassReference(Class* node) {}
3060 virtual void VisitDefaultMemberReference(Member* node) {}
3061 };
3062
3063
3064 template <typename T>
3065 List<T>::~List() {
3066 for (int i = 0; i < length_; i++) {
3067 delete array_[i];
3068 }
3069 delete[] array_;
3070 }
3071
3072
3073 template <typename T>
3074 void List<T>::EnsureInitialized(int length) {
3075 if (length < length_) return;
3076
3077 T** old_array = array_;
3078 int old_length = length_;
3079
3080 // TODO(kustermann) Mabe we should use double-growth instead to avoid running
3081 // into the quadratic case.
3082 length_ = length;
3083 array_ = new T*[length_];
3084
3085 // Move old elements at the start (if necessary).
3086 int offset = 0;
3087 if (old_array != NULL) {
3088 for (; offset < old_length; offset++) {
3089 array_[offset] = old_array[offset];
3090 }
3091 }
3092
3093 // Set the rest to NULL.
3094 for (; offset < length_; offset++) {
3095 array_[offset] = NULL;
3096 }
3097
3098 delete[] old_array;
3099 }
3100
3101
3102 template <typename T>
3103 template <typename IT>
3104 IT* List<T>::GetOrCreate(int index) {
3105 EnsureInitialized(index + 1);
3106
3107 T* member = array_[index];
3108 if (member == NULL) {
3109 member = array_[index] = new IT();
3110 }
3111 return IT::Cast(member);
3112 }
3113
3114
3115 template <typename T>
3116 template <typename IT, typename PT>
3117 IT* List<T>::GetOrCreate(int index, PT* parent) {
3118 EnsureInitialized(index + 1);
3119
3120 T* member = array_[index];
3121 if (member == NULL) {
3122 member = array_[index] = new IT();
3123 member->parent_ = parent;
3124 } else {
3125 ASSERT(member->parent_ == parent);
3126 }
3127 return IT::Cast(member);
3128 }
3129
3130 } // namespace dil
3131
3132 dil::Program* ReadPrecompiledDilFromBuffer(const uint8_t* buffer,
3133 intptr_t buffer_length);
3134 dil::Program* ReadPrecompiledDil(const char* filename);
3135 bool WritePrecompiledDil(const char* filename, dil::Program* program);
3136
3137 } // namespace dart
3138
3139 #endif // VM_DIL_H_
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698