OLD | NEW |
---|---|
(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_ | |
OLD | NEW |