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

Side by Side Diff: pkg/compiler/lib/src/resolution/send_structure.dart

Issue 929113002: Add SemanticVisitor to dart2js. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Rebased on r43912 Created 5 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
(Empty)
1 // Copyright (c) 2015, 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 library dart2js.send_structure;
6
7 import 'access_semantics.dart';
8 import 'operators.dart';
9 import 'semantic_visitor.dart';
10 import '../tree/tree.dart';
11 import '../dart_types.dart';
12 import '../universe/universe.dart';
13 import '../util/util.dart';
14
15 abstract class SendStructure<R, A> {
karlklose 2015/02/25 12:39:39 Please add documentation for this class hierarchy.
Johnni Winther 2015/03/04 11:59:39 Done.
16 R dispatch(SemanticSendVisitor<R, A> visitor, Send send, A arg);
17 }
18
19 class AssertStructure<R, A> implements SendStructure<R, A> {
20 const AssertStructure();
21
22 R dispatch(SemanticSendVisitor<R, A> visitor, Send node, A arg) {
23 return visitor.visitAssert(
24 node,
25 node.arguments.single,
26 arg);
27 }
28 }
29
30 class LazyAndStructure<R, A> implements SendStructure<R, A> {
31 const LazyAndStructure();
32
33 R dispatch(SemanticSendVisitor<R, A> visitor, Send node, A arg) {
34 return visitor.visitLazyAnd(
35 node,
36 node.receiver,
37 node.arguments.single,
38 arg);
39 }
40 }
41
42 class LazyOrStructure<R, A> implements SendStructure<R, A> {
43 const LazyOrStructure();
44
45 R dispatch(SemanticSendVisitor<R, A> visitor, Send node, A arg) {
46 return visitor.visitLazyOr(
47 node,
48 node.receiver,
49 node.arguments.single,
50 arg);
51 }
52 }
53
54 class IsStructure<R, A> implements SendStructure<R, A> {
55 final DartType type;
56
57 IsStructure(this.type);
58
59 R dispatch(SemanticSendVisitor<R, A> visitor, Send node, A arg) {
60 return visitor.visitIs(
61 node,
62 node.receiver,
63 type,
64 arg);
65 }
66 }
67
68 class IsNotStructure<R, A> implements SendStructure<R, A> {
69 final DartType type;
70
71 IsNotStructure(this.type);
72
73 R dispatch(SemanticSendVisitor<R, A> visitor, Send node, A arg) {
74 return visitor.visitIsNot(
75 node,
76 node.receiver,
77 type,
78 arg);
79 }
80 }
81
82 class AsStructure<R, A> implements SendStructure<R, A> {
83 final DartType type;
84
85 AsStructure(this.type);
86
87 R dispatch(SemanticSendVisitor<R, A> visitor, Send node, A arg) {
88 return visitor.visitAs(
89 node,
90 node.receiver,
91 type,
92 arg);
93 }
94 }
95
96 class InvokeStructure<R, A> implements SendStructure<R, A> {
97 final AccessSemantics semantics;
98 final Selector selector;
99
100 InvokeStructure(this.semantics, this.selector);
101
102 R dispatch(SemanticSendVisitor<R, A> visitor, Send node, A arg) {
103 switch (semantics.kind) {
104 case AccessKind.DYNAMIC_PROPERTY:
105 return visitor.visitDynamicPropertyInvoke(
106 node,
107 node.receiver,
108 node.argumentsNode,
109 selector,
110 arg);
111 case AccessKind.LOCAL_FUNCTION:
112 return visitor.visitLocalFunctionInvoke(
113 node,
114 semantics.element,
115 node.argumentsNode,
116 selector,
117 arg);
118 case AccessKind.LOCAL_VARIABLE:
119 return visitor.visitLocalVariableInvoke(
120 node,
121 semantics.element,
122 node.argumentsNode,
123 selector,
124 arg);
125 case AccessKind.PARAMETER:
126 return visitor.visitParameterInvoke(
127 node,
128 semantics.element,
129 node.argumentsNode,
130 selector,
131 arg);
132 case AccessKind.STATIC_FIELD:
133 return visitor.visitStaticFieldInvoke(
134 node,
135 semantics.element,
136 node.argumentsNode,
137 selector,
138 arg);
139 case AccessKind.STATIC_METHOD:
140 return visitor.visitStaticFunctionInvoke(
141 node,
142 semantics.element,
143 node.argumentsNode,
144 selector,
145 arg);
146 case AccessKind.STATIC_GETTER:
147 return visitor.visitStaticGetterInvoke(
148 node,
149 semantics.element,
150 node.argumentsNode,
151 selector,
152 arg);
153 case AccessKind.STATIC_SETTER:
154 return visitor.errorStaticSetterInvoke(
155 node,
156 semantics.element,
157 node.argumentsNode,
158 selector,
159 arg);
160 case AccessKind.TOPLEVEL_FIELD:
161 return visitor.visitTopLevelFieldInvoke(
162 node,
163 semantics.element,
164 node.argumentsNode,
165 selector,
166 arg);
167 case AccessKind.TOPLEVEL_METHOD:
168 return visitor.visitTopLevelFunctionInvoke(
169 node,
170 semantics.element,
171 node.argumentsNode,
172 selector,
173 arg);
174 case AccessKind.TOPLEVEL_GETTER:
175 return visitor.visitTopLevelGetterInvoke(
176 node,
177 semantics.element,
178 node.argumentsNode,
179 selector,
180 arg);
181 case AccessKind.TOPLEVEL_SETTER:
182 return visitor.errorTopLevelSetterInvoke(
183 node,
184 semantics.element,
185 node.argumentsNode,
186 selector,
187 arg);
188 case AccessKind.CLASS_TYPE_LITERAL:
189 return visitor.visitClassTypeLiteralInvoke(
190 node,
191 semantics.element,
192 node.argumentsNode,
193 selector,
194 arg);
195 case AccessKind.TYPEDEF_TYPE_LITERAL:
196 return visitor.visitTypedefTypeLiteralInvoke(
197 node,
198 semantics.element,
199 node.argumentsNode,
200 selector,
201 arg);
202 case AccessKind.DYNAMIC_TYPE_LITERAL:
203 return visitor.visitDynamicTypeLiteralInvoke(
204 node,
205 node.argumentsNode,
206 selector,
207 arg);
208 case AccessKind.TYPE_PARAMETER_TYPE_LITERAL:
209 return visitor.visitTypeVariableTypeLiteralInvoke(
210 node,
211 semantics.element,
212 node.argumentsNode,
213 selector,
214 arg);
215 case AccessKind.EXPRESSION:
216 return visitor.visitExpressionInvoke(
217 node,
218 node.selector,
219 node.argumentsNode,
220 selector,
221 arg);
222 case AccessKind.THIS:
223 return visitor.visitThisInvoke(
224 node,
225 node.argumentsNode,
226 selector,
227 arg);
228 case AccessKind.THIS_PROPERTY:
229 return visitor.visitThisPropertyInvoke(
230 node,
231 node.argumentsNode,
232 selector,
233 arg);
234 case AccessKind.SUPER_FIELD:
235 return visitor.visitSuperFieldInvoke(
236 node,
237 semantics.element,
238 node.argumentsNode,
239 selector,
240 arg);
241 case AccessKind.SUPER_METHOD:
242 return visitor.visitSuperMethodInvoke(
243 node,
244 semantics.element,
245 node.argumentsNode,
246 selector,
247 arg);
248 case AccessKind.SUPER_GETTER:
249 return visitor.visitSuperGetterInvoke(
250 node,
251 semantics.element,
252 node.argumentsNode,
253 selector,
254 arg);
255 case AccessKind.SUPER_SETTER:
256 return visitor.errorSuperSetterInvoke(
257 node,
258 semantics.element,
259 node.argumentsNode,
260 selector,
261 arg);
262 case AccessKind.COMPOUND:
263 // This is not a valid case.
karlklose 2015/02/25 12:39:39 Shouldn't these cases throw too?
Johnni Winther 2015/03/04 11:59:39 No. Compound means that we both a getter and sette
264 break;
265 }
266 throw new SpannableAssertionFailure(node, "Invalid invoke: ${semantics}");
267 }
268 }
269
270
271 class GetStructure<R, A> implements SendStructure<R, A> {
272 final AccessSemantics semantics;
273 final Selector selector;
274
275 GetStructure(this.semantics, this.selector);
276
277 R dispatch(SemanticSendVisitor<R, A> visitor, Send node, A arg) {
278 switch (semantics.kind) {
279 case AccessKind.DYNAMIC_PROPERTY:
280 return visitor.visitDynamicPropertyGet(
281 node,
282 node.receiver,
283 selector,
284 arg);
285 case AccessKind.LOCAL_FUNCTION:
286 return visitor.visitLocalFunctionGet(
287 node,
288 semantics.element,
289 arg);
290 case AccessKind.LOCAL_VARIABLE:
291 return visitor.visitLocalVariableGet(
292 node,
293 semantics.element,
294 arg);
295 case AccessKind.PARAMETER:
296 return visitor.visitParameterGet(
297 node,
298 semantics.element,
299 arg);
300 case AccessKind.STATIC_FIELD:
301 return visitor.visitStaticFieldGet(
302 node,
303 semantics.element,
304 arg);
305 case AccessKind.STATIC_METHOD:
306 return visitor.visitStaticFunctionGet(
307 node,
308 semantics.element,
309 arg);
310 case AccessKind.STATIC_GETTER:
311 return visitor.visitStaticGetterGet(
312 node,
313 semantics.element,
314 arg);
315 case AccessKind.STATIC_SETTER:
316 return visitor.errorStaticSetterGet(
317 node,
318 semantics.element,
319 arg);
320 case AccessKind.TOPLEVEL_FIELD:
321 return visitor.visitTopLevelFieldGet(
322 node,
323 semantics.element,
324 arg);
325 case AccessKind.TOPLEVEL_METHOD:
326 return visitor.visitTopLevelFunctionGet(
327 node,
328 semantics.element,
329 arg);
330 case AccessKind.TOPLEVEL_GETTER:
331 return visitor.visitTopLevelGetterGet(
332 node,
333 semantics.element,
334 arg);
335 case AccessKind.TOPLEVEL_SETTER:
336 return visitor.errorTopLevelSetterGet(
337 node,
338 semantics.element,
339 arg);
340 case AccessKind.CLASS_TYPE_LITERAL:
341 return visitor.visitClassTypeLiteralGet(
342 node,
343 semantics.element,
344 arg);
345 case AccessKind.TYPEDEF_TYPE_LITERAL:
346 return visitor.visitTypedefTypeLiteralGet(
347 node,
348 semantics.element,
349 arg);
350 case AccessKind.DYNAMIC_TYPE_LITERAL:
351 return visitor.visitDynamicTypeLiteralGet(
352 node,
353 arg);
354 case AccessKind.TYPE_PARAMETER_TYPE_LITERAL:
355 return visitor.visitTypeVariableTypeLiteralGet(
356 node,
357 semantics.element,
358 arg);
359 case AccessKind.EXPRESSION:
360 // This is not a valid case.
361 break;
362 case AccessKind.THIS:
363 // TODO(johnniwinther): Handle this when `this` is a [Send].
364 break;
365 case AccessKind.THIS_PROPERTY:
366 return visitor.visitThisPropertyGet(
367 node,
368 selector,
369 arg);
370 case AccessKind.SUPER_FIELD:
371 return visitor.visitSuperFieldGet(
372 node,
373 semantics.element,
374 arg);
375 case AccessKind.SUPER_METHOD:
376 return visitor.visitSuperMethodGet(
377 node,
378 semantics.element,
379 arg);
380 case AccessKind.SUPER_GETTER:
381 return visitor.visitSuperGetterGet(
382 node,
383 semantics.element,
384 arg);
385 case AccessKind.SUPER_SETTER:
386 return visitor.errorSuperSetterGet(
387 node,
388 semantics.element,
389 arg);
390 case AccessKind.COMPOUND:
391 // This is not a valid case.
392 break;
393 }
394 throw new SpannableAssertionFailure(node, "Invalid getter: ${semantics}");
395 }
396 }
397
398 class SetStructure<R, A> implements SendStructure<R, A> {
399 final AccessSemantics semantics;
400 final Selector selector;
401
402 SetStructure(this.semantics, this.selector);
403
404 R dispatch(SemanticSendVisitor<R, A> visitor, Send node, A arg) {
405 switch (semantics.kind) {
406 case AccessKind.DYNAMIC_PROPERTY:
407 return visitor.visitDynamicPropertySet(
408 node,
409 node.receiver,
410 selector,
411 node.arguments.single,
412 arg);
413 case AccessKind.LOCAL_FUNCTION:
414 return visitor.errorLocalFunctionSet(
415 node,
416 semantics.element,
417 node.arguments.single,
418 arg);
419 case AccessKind.LOCAL_VARIABLE:
420 return visitor.visitLocalVariableSet(
421 node,
422 semantics.element,
423 node.arguments.single,
424 arg);
425 case AccessKind.PARAMETER:
426 return visitor.visitParameterSet(
427 node,
428 semantics.element,
429 node.arguments.single,
430 arg);
431 case AccessKind.STATIC_FIELD:
432 return visitor.visitStaticFieldSet(
433 node,
434 semantics.element,
435 node.arguments.single,
436 arg);
437 case AccessKind.STATIC_METHOD:
438 return visitor.errorStaticFunctionSet(
439 node,
440 semantics.element,
441 node.arguments.single,
442 arg);
443 case AccessKind.STATIC_GETTER:
444 return visitor.errorStaticGetterSet(
445 node,
446 semantics.element,
447 node.arguments.single,
448 arg);
449 case AccessKind.STATIC_SETTER:
450 return visitor.visitStaticSetterSet(
451 node,
452 semantics.element,
453 node.arguments.single,
454 arg);
455 case AccessKind.TOPLEVEL_FIELD:
456 return visitor.visitTopLevelFieldSet(
457 node,
458 semantics.element,
459 node.arguments.single,
460 arg);
461 case AccessKind.TOPLEVEL_METHOD:
462 return visitor.errorTopLevelFunctionSet(
463 node,
464 semantics.element,
465 node.arguments.single,
466 arg);
467 case AccessKind.TOPLEVEL_GETTER:
468 return visitor.errorTopLevelGetterSet(
469 node,
470 semantics.element,
471 node.arguments.single,
472 arg);
473 case AccessKind.TOPLEVEL_SETTER:
474 return visitor.visitTopLevelSetterSet(
475 node,
476 semantics.element,
477 node.arguments.single,
478 arg);
479 case AccessKind.CLASS_TYPE_LITERAL:
480 return visitor.errorClassTypeLiteralSet(
481 node,
482 semantics.element,
483 node.arguments.single,
484 arg);
485 case AccessKind.TYPEDEF_TYPE_LITERAL:
486 return visitor.errorTypedefTypeLiteralSet(
487 node,
488 semantics.element,
489 node.arguments.single,
490 arg);
491 case AccessKind.DYNAMIC_TYPE_LITERAL:
492 return visitor.errorDynamicTypeLiteralSet(
493 node,
494 node.arguments.single,
495 arg);
496 case AccessKind.TYPE_PARAMETER_TYPE_LITERAL:
497 return visitor.errorTypeVariableTypeLiteralSet(
498 node,
499 semantics.element,
500 node.arguments.single,
501 arg);
502 case AccessKind.EXPRESSION:
503 // This is not a valid case.
504 break;
505 case AccessKind.THIS:
506 // This is not a valid case.
507 break;
508 case AccessKind.THIS_PROPERTY:
509 return visitor.visitThisPropertySet(
510 node,
511 selector,
512 node.arguments.single,
513 arg);
514 case AccessKind.SUPER_FIELD:
515 return visitor.visitSuperFieldSet(
516 node,
517 semantics.element,
518 node.arguments.single,
519 arg);
520 case AccessKind.SUPER_METHOD:
521 return visitor.errorSuperMethodSet(
522 node,
523 semantics.element,
524 node.arguments.single,
525 arg);
526 case AccessKind.SUPER_GETTER:
527 return visitor.errorSuperGetterSet(
528 node,
529 semantics.element,
530 node.arguments.single,
531 arg);
532 case AccessKind.SUPER_SETTER:
533 return visitor.visitSuperSetterSet(
534 node,
535 semantics.element,
536 node.arguments.single,
537 arg);
538 case AccessKind.COMPOUND:
539 // This is not a valid case.
540 break;
541 }
542 throw new SpannableAssertionFailure(node, "Invalid setter: ${semantics}");
543 }
544 }
545
546 class NotStructure<R, A> implements SendStructure<R, A> {
547 final AccessSemantics semantics;
548 // TODO(johnniwinther): Should we store this?
549 final Selector selector;
550
551 NotStructure(this.semantics, this.selector);
552
553 R dispatch(SemanticSendVisitor<R, A> visitor, Send node, A arg) {
554 switch (semantics.kind) {
555 case AccessKind.DYNAMIC_PROPERTY:
556 return visitor.visitNot(
557 node,
558 node.receiver,
559 arg);
560 default:
561 // This is not a valid case.
562 break;
563 }
564 throw new SpannableAssertionFailure(node, "Invalid setter: ${semantics}");
565 }
566 }
567
568 class UnaryStructure<R, A> implements SendStructure<R, A> {
569 final AccessSemantics semantics;
570 final UnaryOperator operator;
571 // TODO(johnniwinther): Should we store this?
572 final Selector selector;
573
574 UnaryStructure(this.semantics, this.operator, this.selector);
575
576 R dispatch(SemanticSendVisitor<R, A> visitor, Send node, A arg) {
577 switch (semantics.kind) {
578 case AccessKind.DYNAMIC_PROPERTY:
579 return visitor.visitUnary(
580 node,
581 operator,
582 node.receiver,
583 arg);
584 case AccessKind.SUPER_METHOD:
585 return visitor.visitSuperUnary(
586 node,
587 operator,
588 semantics.element,
589 arg);
590 default:
591 // This is not a valid case.
592 break;
593 }
594 throw new SpannableAssertionFailure(node, "Invalid setter: ${semantics}");
595 }
596 }
597
598 class EqualsStructure<R, A> implements SendStructure<R, A> {
599 final AccessSemantics semantics;
600 // TODO(johnniwinther): Should we store this?
601 final Selector selector;
602
603 EqualsStructure(this.semantics, this.selector);
604
605 R dispatch(SemanticSendVisitor<R, A> visitor, Send node, A arg) {
606 switch (semantics.kind) {
607 case AccessKind.DYNAMIC_PROPERTY:
608 return visitor.visitEquals(
609 node,
610 node.receiver,
611 node.arguments.single,
612 arg);
613 case AccessKind.SUPER_METHOD:
614 return visitor.visitSuperEquals(
615 node,
616 semantics.element,
617 node.arguments.single,
618 arg);
619 default:
620 // This is not a valid case.
621 break;
622 }
623 throw new SpannableAssertionFailure(node, "Invalid equals: ${semantics}");
624 }
625 }
626
627 class NotEqualsStructure<R, A> implements SendStructure<R, A> {
628 final AccessSemantics semantics;
629 // TODO(johnniwinther): Should we store this?
630 final Selector selector;
631
632 NotEqualsStructure(this.semantics, this.selector);
633
634 R dispatch(SemanticSendVisitor<R, A> visitor, Send node, A arg) {
635 switch (semantics.kind) {
636 case AccessKind.DYNAMIC_PROPERTY:
637 return visitor.visitNotEquals(
638 node,
639 node.receiver,
640 node.arguments.single,
641 arg);
642 case AccessKind.SUPER_METHOD:
643 return visitor.visitSuperNotEquals(
644 node,
645 semantics.element,
646 node.arguments.single,
647 arg);
648 default:
649 // This is not a valid case.
650 break;
651 }
652 throw new SpannableAssertionFailure(
653 node, "Invalid not equals: ${semantics}");
654 }
655 }
656
657 class BinaryStructure<R, A> implements SendStructure<R, A> {
658 final AccessSemantics semantics;
659 final BinaryOperator operator;
660 // TODO(johnniwinther): Should we store this?
661 final Selector selector;
662
663 BinaryStructure(this.semantics, this.operator, this.selector);
664
665 R dispatch(SemanticSendVisitor<R, A> visitor, Send node, A arg) {
666 switch (semantics.kind) {
667 case AccessKind.DYNAMIC_PROPERTY:
668 return visitor.visitBinary(
669 node,
670 node.receiver,
671 operator,
672 node.arguments.single,
673 arg);
674 case AccessKind.SUPER_METHOD:
675 return visitor.visitSuperBinary(
676 node,
677 semantics.element,
678 operator,
679 node.arguments.single,
680 arg);
681 default:
682 // This is not a valid case.
683 break;
684 }
685 throw new SpannableAssertionFailure(
686 node, "Invalid binary: ${semantics}");
687 }
688 }
689
690 class IndexSetStructure<R, A> implements SendStructure<R, A> {
691 final AccessSemantics semantics;
692 // TODO(johnniwinther): Should we store this?
693 final Selector selector;
694
695 IndexSetStructure(this.semantics, this.selector);
696
697 R dispatch(SemanticSendVisitor<R, A> visitor, Send node, A arg) {
698 switch (semantics.kind) {
699 case AccessKind.DYNAMIC_PROPERTY:
700 return visitor.visitIndexSet(
701 node,
702 node.receiver,
703 node.arguments.first,
704 node.arguments.tail.head,
705 arg);
706 case AccessKind.SUPER_METHOD:
707 return visitor.visitSuperIndexSet(
708 node,
709 semantics.element,
710 node.arguments.first,
711 node.arguments.tail.head,
712 arg);
713 default:
714 // This is not a valid case.
715 break;
716 }
717 throw new SpannableAssertionFailure(
718 node, "Invalid index set: ${semantics}");
719 }
720 }
721
722 class CompoundStructure<R, A> implements SendStructure<R, A> {
723 final AccessSemantics semantics;
724 final AssignmentOperator operator;
725 final Selector getterSelector;
726 final Selector setterSelector;
727
728 CompoundStructure(this.semantics,
729 this.operator,
730 this.getterSelector,
731 this.setterSelector);
732
733 R dispatch(SemanticSendVisitor<R, A> visitor, Send node, A arg) {
734 switch (semantics.kind) {
735 case AccessKind.DYNAMIC_PROPERTY:
736 return visitor.visitDynamicPropertyCompound(
737 node,
738 node.receiver,
739 operator,
740 node.arguments.single,
741 getterSelector,
742 setterSelector,
743 arg);
744 case AccessKind.LOCAL_FUNCTION:
745 return visitor.errorLocalFunctionCompound(
746 node,
747 semantics.element,
748 operator,
749 node.arguments.single,
750 arg);
751 case AccessKind.LOCAL_VARIABLE:
752 return visitor.visitLocalVariableCompound(
753 node,
754 semantics.element,
755 operator,
756 node.arguments.single,
757 arg);
758 case AccessKind.PARAMETER:
759 return visitor.visitParameterCompound(
760 node,
761 semantics.element,
762 operator,
763 node.arguments.single,
764 arg);
765 case AccessKind.STATIC_FIELD:
766 return visitor.visitStaticFieldCompound(
767 node,
768 semantics.element,
769 operator,
770 node.arguments.single,
771 arg);
772 case AccessKind.STATIC_METHOD:
773 // TODO(johnniwinther): Handle this.
774 break;
775 case AccessKind.STATIC_GETTER:
776 // This is not a valid case.
777 break;
778 case AccessKind.STATIC_SETTER:
779 // This is not a valid case.
780 break;
781 case AccessKind.TOPLEVEL_FIELD:
782 return visitor.visitTopLevelFieldCompound(
783 node,
784 semantics.element,
785 operator,
786 node.arguments.single,
787 arg);
788 case AccessKind.TOPLEVEL_METHOD:
789 // TODO(johnniwinther): Handle this.
790 break;
791 case AccessKind.TOPLEVEL_GETTER:
792 // This is not a valid case.
793 break;
794 case AccessKind.TOPLEVEL_SETTER:
795 // This is not a valid case.
796 break;
797 case AccessKind.CLASS_TYPE_LITERAL:
798 return visitor.visitClassTypeLiteralCompound(
799 node,
800 semantics.element,
801 operator,
802 node.arguments.single,
803 arg);
804 case AccessKind.TYPEDEF_TYPE_LITERAL:
805 return visitor.visitTypedefTypeLiteralCompound(
806 node,
807 semantics.element,
808 operator,
809 node.arguments.single,
810 arg);
811 case AccessKind.DYNAMIC_TYPE_LITERAL:
812 return visitor.visitDynamicTypeLiteralCompound(
813 node,
814 operator,
815 node.arguments.single,
816 arg);
817 case AccessKind.TYPE_PARAMETER_TYPE_LITERAL:
818 return visitor.visitTypeVariableTypeLiteralCompound(
819 node,
820 semantics.element,
821 operator,
822 node.arguments.single,
823 arg);
824 case AccessKind.EXPRESSION:
825 // This is not a valid case.
826 break;
827 case AccessKind.THIS:
828 // This is not a valid case.
829 break;
830 case AccessKind.THIS_PROPERTY:
831 return visitor.visitThisPropertyCompound(
832 node,
833 operator,
834 node.arguments.single,
835 getterSelector,
836 setterSelector,
837 arg);
838 case AccessKind.SUPER_FIELD:
839 return visitor.visitSuperFieldCompound(
840 node,
841 semantics.element,
842 operator,
843 node.arguments.single,
844 arg);
845 case AccessKind.SUPER_METHOD:
846 // TODO(johnniwinther): Handle this.
847 break;
848 case AccessKind.SUPER_GETTER:
849 // This is not a valid case.
850 break;
851 case AccessKind.SUPER_SETTER:
852 // This is not a valid case.
853 break;
854 case AccessKind.COMPOUND:
855 CompoundAccessSemantics compoundSemantics = semantics;
856 switch (compoundSemantics.compoundAccessKind) {
857 case CompoundAccessKind.STATIC_GETTER_SETTER:
858 return visitor.visitStaticGetterSetterCompound(
859 node,
860 compoundSemantics.getter,
861 compoundSemantics.setter,
862 operator,
863 node.arguments.single,
864 arg);
865 case CompoundAccessKind.STATIC_METHOD_SETTER:
866 return visitor.visitStaticMethodSetterCompound(
867 node,
868 compoundSemantics.getter,
869 compoundSemantics.setter,
870 operator,
871 node.arguments.single,
872 arg);
873 case CompoundAccessKind.TOPLEVEL_GETTER_SETTER:
874 return visitor.visitTopLevelGetterSetterCompound(
875 node,
876 compoundSemantics.getter,
877 compoundSemantics.setter,
878 operator,
879 node.arguments.single,
880 arg);
881 case CompoundAccessKind.TOPLEVEL_METHOD_SETTER:
882 return visitor.visitTopLevelMethodSetterCompound(
883 node,
884 compoundSemantics.getter,
885 compoundSemantics.setter,
886 operator,
887 node.arguments.single,
888 arg);
889 case CompoundAccessKind.SUPER_FIELD_FIELD:
890 // TODO(johnniwinther): Handle this.
891 break;
892 case CompoundAccessKind.SUPER_GETTER_SETTER:
893 return visitor.visitSuperGetterSetterCompound(
894 node,
895 compoundSemantics.getter,
896 compoundSemantics.setter,
897 operator,
898 node.arguments.single,
899 arg);
900 case CompoundAccessKind.SUPER_GETTER_FIELD:
901 return visitor.visitSuperGetterFieldCompound(
902 node,
903 compoundSemantics.getter,
904 compoundSemantics.setter,
905 operator,
906 node.arguments.single,
907 arg);
908 case CompoundAccessKind.SUPER_METHOD_SETTER:
909 return visitor.visitSuperMethodSetterCompound(
910 node,
911 compoundSemantics.getter,
912 compoundSemantics.setter,
913 operator,
914 node.arguments.single,
915 arg);
916 case CompoundAccessKind.SUPER_FIELD_SETTER:
917 return visitor.visitSuperFieldSetterCompound(
918 node,
919 compoundSemantics.getter,
920 compoundSemantics.setter,
921 operator,
922 node.arguments.single,
923 arg);
924 }
925 break;
926 }
927 throw new SpannableAssertionFailure(node,
928 "Invalid compound assigment: ${semantics}");
929 }
930 }
931
932 class CompoundIndexSetStructure<R, A> implements SendStructure<R, A> {
933 final AccessSemantics semantics;
934 final AssignmentOperator operator;
935 final Selector getterSelector;
936 final Selector setterSelector;
937
938 CompoundIndexSetStructure(this.semantics, this.operator,
939 this.getterSelector,
940 this.setterSelector);
941
942 R dispatch(SemanticSendVisitor<R, A> visitor, Send node, A arg) {
943 switch (semantics.kind) {
944 case AccessKind.DYNAMIC_PROPERTY:
945 return visitor.visitCompoundIndexSet(
946 node,
947 node.receiver,
948 node.arguments.first,
949 operator,
950 node.arguments.tail.head,
951 arg);
952 case AccessKind.COMPOUND:
953 CompoundAccessSemantics compoundSemantics = semantics;
954 switch (compoundSemantics.compoundAccessKind) {
955 case CompoundAccessKind.SUPER_GETTER_SETTER:
956 return visitor.visitSuperCompoundIndexSet(
957 node,
958 compoundSemantics.getter,
959 compoundSemantics.setter,
960 node.arguments.first,
961 operator,
962 node.arguments.tail.head,
963 arg);
964 default:
965 // This is not a valid case.
966 break;
967 }
968 break;
969 default:
970 // This is not a valid case.
971 break;
972 }
973 throw new SpannableAssertionFailure(
974 node, "Invalid index set: ${semantics}");
975 }
976 }
977
978 class PrefixStructure<R, A> implements SendStructure<R, A> {
979 final AccessSemantics semantics;
980 final IncDecOperator operator;
981 final Selector getterSelector;
982 final Selector setterSelector;
983
984 PrefixStructure(this.semantics,
985 this.operator,
986 this.getterSelector,
987 this.setterSelector);
988
989 R dispatch(SemanticSendVisitor<R, A> visitor, Send node, A arg) {
990 switch (semantics.kind) {
991 case AccessKind.DYNAMIC_PROPERTY:
992 return visitor.visitDynamicPropertyPrefix(
993 node,
994 node.receiver,
995 operator,
996 getterSelector,
997 setterSelector,
998 arg);
999 case AccessKind.LOCAL_FUNCTION:
1000 return visitor.errorLocalFunctionPrefix(
1001 node,
1002 semantics.element,
1003 operator,
1004 arg);
1005 case AccessKind.LOCAL_VARIABLE:
1006 return visitor.visitLocalVariablePrefix(
1007 node,
1008 semantics.element,
1009 operator,
1010 arg);
1011 case AccessKind.PARAMETER:
1012 return visitor.visitParameterPrefix(
1013 node,
1014 semantics.element,
1015 operator,
1016 arg);
1017 case AccessKind.STATIC_FIELD:
1018 return visitor.visitStaticFieldPrefix(
1019 node,
1020 semantics.element,
1021 operator,
1022 arg);
1023 case AccessKind.STATIC_METHOD:
1024 // TODO(johnniwinther): Handle this.
1025 break;
1026 case AccessKind.STATIC_GETTER:
1027 // This is not a valid case.
1028 break;
1029 case AccessKind.STATIC_SETTER:
1030 // This is not a valid case.
1031 break;
1032 case AccessKind.TOPLEVEL_FIELD:
1033 return visitor.visitTopLevelFieldPrefix(
1034 node,
1035 semantics.element,
1036 operator,
1037 arg);
1038 case AccessKind.TOPLEVEL_METHOD:
1039 // TODO(johnniwinther): Handle this.
1040 break;
1041 case AccessKind.TOPLEVEL_GETTER:
1042 // This is not a valid case.
1043 break;
1044 case AccessKind.TOPLEVEL_SETTER:
1045 // This is not a valid case.
1046 break;
1047 case AccessKind.CLASS_TYPE_LITERAL:
1048 return visitor.visitClassTypeLiteralPrefix(
1049 node,
1050 semantics.element,
1051 operator,
1052 arg);
1053 case AccessKind.TYPEDEF_TYPE_LITERAL:
1054 return visitor.visitTypedefTypeLiteralPrefix(
1055 node,
1056 semantics.element,
1057 operator,
1058 arg);
1059 case AccessKind.DYNAMIC_TYPE_LITERAL:
1060 return visitor.visitDynamicTypeLiteralPrefix(
1061 node,
1062 operator,
1063 arg);
1064 case AccessKind.TYPE_PARAMETER_TYPE_LITERAL:
1065 return visitor.visitTypeVariableTypeLiteralPrefix(
1066 node,
1067 semantics.element,
1068 operator,
1069 arg);
1070 case AccessKind.EXPRESSION:
1071 // This is not a valid case.
1072 break;
1073 case AccessKind.THIS:
1074 // This is not a valid case.
1075 break;
1076 case AccessKind.THIS_PROPERTY:
1077 return visitor.visitThisPropertyPrefix(
1078 node,
1079 operator,
1080 getterSelector,
1081 setterSelector,
1082 arg);
1083 case AccessKind.SUPER_FIELD:
1084 return visitor.visitSuperFieldPrefix(
1085 node,
1086 semantics.element,
1087 operator,
1088 arg);
1089 case AccessKind.SUPER_METHOD:
1090 // TODO(johnniwinther): Handle this.
1091 break;
1092 case AccessKind.SUPER_GETTER:
1093 // This is not a valid case.
1094 break;
1095 case AccessKind.SUPER_SETTER:
1096 // This is not a valid case.
1097 break;
1098 case AccessKind.COMPOUND:
1099 CompoundAccessSemantics compoundSemantics = semantics;
1100 switch (compoundSemantics.compoundAccessKind) {
1101 case CompoundAccessKind.STATIC_GETTER_SETTER:
1102 return visitor.visitStaticGetterSetterPrefix(
1103 node,
1104 compoundSemantics.getter,
1105 compoundSemantics.setter,
1106 operator,
1107 arg);
1108 case CompoundAccessKind.STATIC_METHOD_SETTER:
1109 return visitor.visitStaticMethodSetterPrefix(
1110 node,
1111 compoundSemantics.getter,
1112 compoundSemantics.setter,
1113 operator,
1114 arg);
1115 case CompoundAccessKind.TOPLEVEL_GETTER_SETTER:
1116 return visitor.visitTopLevelGetterSetterPrefix(
1117 node,
1118 compoundSemantics.getter,
1119 compoundSemantics.setter,
1120 operator,
1121 arg);
1122 case CompoundAccessKind.TOPLEVEL_METHOD_SETTER:
1123 return visitor.visitTopLevelMethodSetterPrefix(
1124 node,
1125 compoundSemantics.getter,
1126 compoundSemantics.setter,
1127 operator,
1128 arg);
1129 case CompoundAccessKind.SUPER_FIELD_FIELD:
1130 return visitor.visitSuperFieldFieldPrefix(
1131 node,
1132 compoundSemantics.getter,
1133 compoundSemantics.setter,
1134 operator,
1135 arg);
1136 case CompoundAccessKind.SUPER_GETTER_SETTER:
1137 return visitor.visitSuperGetterSetterPrefix(
1138 node,
1139 compoundSemantics.getter,
1140 compoundSemantics.setter,
1141 operator,
1142 arg);
1143 case CompoundAccessKind.SUPER_GETTER_FIELD:
1144 return visitor.visitSuperGetterFieldPrefix(
1145 node,
1146 compoundSemantics.getter,
1147 compoundSemantics.setter,
1148 operator,
1149 arg);
1150 case CompoundAccessKind.SUPER_METHOD_SETTER:
1151 return visitor.visitSuperMethodSetterPrefix(
1152 node,
1153 compoundSemantics.getter,
1154 compoundSemantics.setter,
1155 operator,
1156 arg);
1157 case CompoundAccessKind.SUPER_FIELD_SETTER:
1158 return visitor.visitSuperFieldSetterPrefix(
1159 node,
1160 compoundSemantics.getter,
1161 compoundSemantics.setter,
1162 operator,
1163 arg);
1164 }
1165 }
1166 throw new SpannableAssertionFailure(node,
1167 "Invalid compound assigment: ${semantics}");
1168 }
1169 }
1170
1171
1172 class PostfixStructure<R, A> implements SendStructure<R, A> {
1173 final AccessSemantics semantics;
1174 final IncDecOperator operator;
1175 final Selector getterSelector;
1176 final Selector setterSelector;
1177
1178 PostfixStructure(this.semantics,
1179 this.operator,
1180 this.getterSelector,
1181 this.setterSelector);
1182
1183 R dispatch(SemanticSendVisitor<R, A> visitor, Send node, A arg) {
1184 switch (semantics.kind) {
1185 case AccessKind.DYNAMIC_PROPERTY:
1186 return visitor.visitDynamicPropertyPostfix(
1187 node,
1188 node.receiver,
1189 operator,
1190 getterSelector,
1191 setterSelector,
1192 arg);
1193 case AccessKind.LOCAL_FUNCTION:
1194 return visitor.errorLocalFunctionPostfix(
1195 node,
1196 semantics.element,
1197 operator,
1198 arg);
1199 case AccessKind.LOCAL_VARIABLE:
1200 return visitor.visitLocalVariablePostfix(
1201 node,
1202 semantics.element,
1203 operator,
1204 arg);
1205 case AccessKind.PARAMETER:
1206 return visitor.visitParameterPostfix(
1207 node,
1208 semantics.element,
1209 operator,
1210 arg);
1211 case AccessKind.STATIC_FIELD:
1212 return visitor.visitStaticFieldPostfix(
1213 node,
1214 semantics.element,
1215 operator,
1216 arg);
1217 case AccessKind.STATIC_METHOD:
1218 // TODO(johnniwinther): Handle this.
1219 break;
1220 case AccessKind.STATIC_GETTER:
1221 // This is not a valid case.
1222 break;
1223 case AccessKind.STATIC_SETTER:
1224 // This is not a valid case.
1225 break;
1226 case AccessKind.TOPLEVEL_FIELD:
1227 return visitor.visitTopLevelFieldPostfix(
1228 node,
1229 semantics.element,
1230 operator,
1231 arg);
1232 case AccessKind.TOPLEVEL_METHOD:
1233 // TODO(johnniwinther): Handle this.
1234 break;
1235 case AccessKind.TOPLEVEL_GETTER:
1236 // This is not a valid case.
1237 break;
1238 case AccessKind.TOPLEVEL_SETTER:
1239 // This is not a valid case.
1240 break;
1241 case AccessKind.CLASS_TYPE_LITERAL:
1242 return visitor.visitClassTypeLiteralPostfix(
1243 node,
1244 semantics.element,
1245 operator,
1246 arg);
1247 case AccessKind.TYPEDEF_TYPE_LITERAL:
1248 return visitor.visitTypedefTypeLiteralPostfix(
1249 node,
1250 semantics.element,
1251 operator,
1252 arg);
1253 case AccessKind.DYNAMIC_TYPE_LITERAL:
1254 return visitor.visitDynamicTypeLiteralPostfix(
1255 node,
1256 operator,
1257 arg);
1258 case AccessKind.TYPE_PARAMETER_TYPE_LITERAL:
1259 return visitor.visitTypeVariableTypeLiteralPostfix(
1260 node,
1261 semantics.element,
1262 operator,
1263 arg);
1264 case AccessKind.EXPRESSION:
1265 // This is not a valid case.
1266 break;
1267 case AccessKind.THIS:
1268 // This is not a valid case.
1269 break;
1270 case AccessKind.THIS_PROPERTY:
1271 return visitor.visitThisPropertyPostfix(
1272 node,
1273 operator,
1274 getterSelector,
1275 setterSelector,
1276 arg);
1277 case AccessKind.SUPER_FIELD:
1278 return visitor.visitSuperFieldPostfix(
1279 node,
1280 semantics.element,
1281 operator,
1282 arg);
1283 case AccessKind.SUPER_METHOD:
1284 // TODO(johnniwinther): Handle this.
1285 break;
1286 case AccessKind.SUPER_GETTER:
1287 // This is not a valid case.
1288 break;
1289 case AccessKind.SUPER_SETTER:
1290 // This is not a valid case.
1291 break;
1292 case AccessKind.COMPOUND:
1293 CompoundAccessSemantics compoundSemantics = semantics;
1294 switch (compoundSemantics.compoundAccessKind) {
1295 case CompoundAccessKind.STATIC_GETTER_SETTER:
1296 return visitor.visitStaticGetterSetterPostfix(
1297 node,
1298 compoundSemantics.getter,
1299 compoundSemantics.setter,
1300 operator,
1301 arg);
1302 case CompoundAccessKind.STATIC_METHOD_SETTER:
1303 return visitor.visitStaticMethodSetterPostfix(
1304 node,
1305 compoundSemantics.getter,
1306 compoundSemantics.setter,
1307 operator,
1308 arg);
1309 case CompoundAccessKind.TOPLEVEL_GETTER_SETTER:
1310 return visitor.visitTopLevelGetterSetterPostfix(
1311 node,
1312 compoundSemantics.getter,
1313 compoundSemantics.setter,
1314 operator,
1315 arg);
1316 case CompoundAccessKind.TOPLEVEL_METHOD_SETTER:
1317 return visitor.visitTopLevelMethodSetterPostfix(
1318 node,
1319 compoundSemantics.getter,
1320 compoundSemantics.setter,
1321 operator,
1322 arg);
1323 case CompoundAccessKind.SUPER_FIELD_FIELD:
1324 return visitor.visitSuperFieldFieldPostfix(
1325 node,
1326 compoundSemantics.getter,
1327 compoundSemantics.setter,
1328 operator,
1329 arg);
1330 case CompoundAccessKind.SUPER_GETTER_SETTER:
1331 return visitor.visitSuperGetterSetterPostfix(
1332 node,
1333 compoundSemantics.getter,
1334 compoundSemantics.setter,
1335 operator,
1336 arg);
1337 case CompoundAccessKind.SUPER_GETTER_FIELD:
1338 return visitor.visitSuperGetterFieldPostfix(
1339 node,
1340 compoundSemantics.getter,
1341 compoundSemantics.setter,
1342 operator,
1343 arg);
1344 case CompoundAccessKind.SUPER_METHOD_SETTER:
1345 return visitor.visitSuperMethodSetterPostfix(
1346 node,
1347 compoundSemantics.getter,
1348 compoundSemantics.setter,
1349 operator,
1350 arg);
1351 case CompoundAccessKind.SUPER_FIELD_SETTER:
1352 return visitor.visitSuperFieldSetterPostfix(
1353 node,
1354 compoundSemantics.getter,
1355 compoundSemantics.setter,
1356 operator,
1357 arg);
1358 }
1359 }
1360 throw new SpannableAssertionFailure(node,
1361 "Invalid compound assigment: ${semantics}");
1362 }
1363 }
1364
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698