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

Side by Side Diff: tests/compiler/dart2js/semantic_visitor_test.dart

Issue 929113002: Add SemanticVisitor to dart2js. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Updated and extended Created 5 years, 9 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.semantics_visitor_test;
6
7 import 'package:async_helper/async_helper.dart';
8 import 'package:expect/expect.dart';
9 import 'package:compiler/src/constants/expressions.dart';
10 import 'package:compiler/src/dart_types.dart';
11 import 'package:compiler/src/dart2jslib.dart';
12 import 'package:compiler/src/elements/elements.dart';
13 import 'package:compiler/src/resolution/resolution.dart';
14 import 'package:compiler/src/resolution/semantic_visitor.dart';
15 import 'package:compiler/src/resolution/operators.dart';
16 import 'package:compiler/src/tree/tree.dart';
17 import 'package:compiler/src/util/util.dart';
18 import 'memory_compiler.dart';
19
20 class Visit {
21 final VisitKind method;
22 final element;
23 final rhs;
24 final arguments;
25 final receiver;
26 final name;
27 final expression;
28 final left;
29 final right;
30 final type;
31 final operator;
32 final index;
33 final getter;
34 final setter;
35 final constant;
36
37 const Visit(this.method,
38 {this.element,
39 this.rhs,
40 this.arguments,
41 this.receiver,
42 this.name,
43 this.expression,
44 this.left,
45 this.right,
46 this.type,
47 this.operator,
48 this.index,
49 this.getter,
50 this.setter,
51 this.constant});
52
53 int get hashCode => toString().hashCode;
54
55 bool operator ==(other) => '$this' == '$other';
56
57 String toString() {
58 StringBuffer sb = new StringBuffer();
59 sb.write('method=$method');
60 if (element != null) {
61 sb.write(',element=$element');
62 }
63 if (rhs != null) {
64 sb.write(',rhs=$rhs');
65 }
66 if (arguments != null) {
67 sb.write(',arguments=$arguments');
68 }
69 if (receiver != null) {
70 sb.write(',receiver=$receiver');
71 }
72 if (name != null) {
73 sb.write(',name=$name');
74 }
75 if (expression != null) {
76 sb.write(',expression=$expression');
77 }
78 if (left != null) {
79 sb.write(',left=$left');
80 }
81 if (right != null) {
82 sb.write(',right=$right');
83 }
84 if (type != null) {
85 sb.write(',type=$type');
86 }
87 if (operator != null) {
88 sb.write(',operator=$operator');
89 }
90 if (index != null) {
91 sb.write(',index=$index');
92 }
93 if (getter != null) {
94 sb.write(',getter=$getter');
95 }
96 if (setter != null) {
97 sb.write(',setter=$setter');
98 }
99 if (constant != null) {
100 sb.write(',constant=$constant');
101 }
102 return sb.toString();
103 }
104 }
105
106 class Test {
107 final String codeByPrefix;
108 final String code;
109 final /*Visit | List<Visit>*/ expectedVisits;
110 final String cls;
111
112 const Test(this.code, this.expectedVisits)
113 : cls = null, codeByPrefix = null;
114 const Test.clazz(this.code, this.expectedVisits)
115 : cls = 'C', codeByPrefix = null;
116 const Test.prefix(this.codeByPrefix, this.code, this.expectedVisits)
117 : cls = null;
118
119 String get method => 'm';
120
121 String toString() {
122 StringBuffer sb = new StringBuffer();
123 sb.writeln();
124 sb.writeln(code);
125 if (codeByPrefix != null) {
126 sb.writeln('imported by prefix:');
127 sb.writeln(codeByPrefix);
128 }
129 return sb.toString();
130 }
131 }
132
133 const List<Test> TESTS = const [
134 // Parameters
135 const Test('m(o) => o;',
136 const Visit(VisitKind.VISIT_PARAMETER_GET,
137 element: 'parameter(m#o)')),
138 const Test('m(o) { o = 42; }',
139 const Visit(VisitKind.VISIT_PARAMETER_SET,
140 element: 'parameter(m#o)',
141 rhs:'42')),
142 const Test('m(o) { o(null, 42); }',
143 const Visit(VisitKind.VISIT_PARAMETER_INVOKE,
144 element: 'parameter(m#o)',
145 arguments: '(null,42)')),
146
147 // Local variables
148 const Test('m() { var o; return o; }',
149 const Visit(VisitKind.VISIT_LOCAL_VARIABLE_GET,
150 element: 'variable(m#o)')),
151 const Test('m() { var o; o = 42; }',
152 const Visit(VisitKind.VISIT_LOCAL_VARIABLE_SET,
153 element: 'variable(m#o)',
154 rhs:'42')),
155 const Test('m() { var o; o(null, 42); }',
156 const Visit(VisitKind.VISIT_LOCAL_VARIABLE_INVOKE,
157 element: 'variable(m#o)',
158 arguments: '(null,42)')),
159
160 // Local functions
161 const Test('m() { o(a, b) {}; return o; }',
162 const Visit(VisitKind.VISIT_LOCAL_FUNCTION_GET,
163 element: 'function(m#o)')),
164 const Test('m() { o(a, b) {}; o(null, 42); }',
165 const Visit(VisitKind.VISIT_LOCAL_FUNCTION_INVOKE,
166 element: 'function(m#o)',
167 arguments: '(null,42)')),
168
169 // Static fields
170 const Test(
171 '''
172 class C { static var o; }
173 m() => C.o;
174 ''',
175 const Visit(VisitKind.VISIT_STATIC_FIELD_GET,
176 element: 'field(C#o)')),
177 const Test.clazz(
178 '''
179 class C {
180 static var o;
181 m() => o;
182 }
183 ''',
184 const Visit(VisitKind.VISIT_STATIC_FIELD_GET,
185 element: 'field(C#o)')),
186 const Test.clazz(
187 '''
188 class C {
189 static var o;
190 m() => C.o;
191 }
192 ''',
193 const Visit(VisitKind.VISIT_STATIC_FIELD_GET,
194 element: 'field(C#o)')),
195 const Test.prefix(
196 '''
197 class C {
198 static var o;
199 }
200 ''',
201 'm() => p.C.o;',
202 const Visit(VisitKind.VISIT_STATIC_FIELD_GET,
203 element: 'field(C#o)')),
204 const Test(
205 '''
206 class C { static var o; }
207 m() { C.o = 42; }
208 ''',
209 const Visit(VisitKind.VISIT_STATIC_FIELD_SET,
210 element: 'field(C#o)',
211 rhs: '42')),
212 const Test.clazz(
213 '''
214 class C {
215 static var o;
216 m() { o = 42; }
217 }
218 ''',
219 const Visit(VisitKind.VISIT_STATIC_FIELD_SET,
220 element: 'field(C#o)',
221 rhs: '42')),
222 const Test.clazz(
223 '''
224 class C {
225 static var o;
226 m() { C.o = 42; }
227 }
228 ''',
229 const Visit(VisitKind.VISIT_STATIC_FIELD_SET,
230 element: 'field(C#o)',
231 rhs: '42')),
232 const Test.prefix(
233 '''
234 class C {
235 static var o;
236 }
237 ''',
238 'm() { p.C.o = 42; }',
239 const Visit(VisitKind.VISIT_STATIC_FIELD_SET,
240 element: 'field(C#o)',
241 rhs: '42')),
242 const Test(
243 '''
244 class C { static var o; }
245 m() { C.o(null, 42); }
246 ''',
247 const Visit(VisitKind.VISIT_STATIC_FIELD_INVOKE,
248 element: 'field(C#o)',
249 arguments: '(null,42)')),
250 const Test.clazz(
251 '''
252 class C {
253 static var o;
254 m() { o(null, 42); }
255 }
256 ''',
257 const Visit(VisitKind.VISIT_STATIC_FIELD_INVOKE,
258 element: 'field(C#o)',
259 arguments: '(null,42)')),
260 const Test.clazz(
261 '''
262 class C {
263 static var o;
264 m() { C.o(null, 42); }
265 }
266 ''',
267 const Visit(VisitKind.VISIT_STATIC_FIELD_INVOKE,
268 element: 'field(C#o)',
269 arguments: '(null,42)')),
270 const Test.prefix(
271 '''
272 class C {
273 static var o;
274 }
275 ''',
276 'm() { p.C.o(null, 42); }',
277 const Visit(VisitKind.VISIT_STATIC_FIELD_INVOKE,
278 element: 'field(C#o)',
279 arguments: '(null,42)')),
280
281 // Static properties
282 const Test(
283 '''
284 class C {
285 static get o => null;
286 }
287 m() => C.o;
288 ''',
289 const Visit(VisitKind.VISIT_STATIC_GETTER_GET,
290 element: 'getter(C#o)')),
291 const Test.clazz(
292 '''
293 class C {
294 static get o => null;
295 m() => o;
296 }
297 ''',
298 const Visit(VisitKind.VISIT_STATIC_GETTER_GET,
299 element: 'getter(C#o)')),
300 const Test.clazz(
301 '''
302 class C {
303 static get o => null;
304 m() => C.o;
305 }
306 ''',
307 const Visit(VisitKind.VISIT_STATIC_GETTER_GET,
308 element: 'getter(C#o)')),
309 const Test.prefix(
310 '''
311 class C {
312 static get o => null;
313 }
314 ''',
315 'm() => p.C.o;',
316 const Visit(VisitKind.VISIT_STATIC_GETTER_GET,
317 element: 'getter(C#o)')),
318 const Test(
319 '''
320 class C { static set o(_) {} }
321 m() { C.o = 42; }
322 ''',
323 const Visit(VisitKind.VISIT_STATIC_SETTER_SET,
324 element: 'setter(C#o)',
325 rhs: '42')),
326 const Test.clazz(
327 '''
328 class C {
329 static set o(_) {}
330 m() { o = 42; }
331 }
332 ''',
333 const Visit(VisitKind.VISIT_STATIC_SETTER_SET,
334 element: 'setter(C#o)',
335 rhs: '42')),
336 const Test.clazz(
337 '''
338 class C {
339 static set o(_) {}
340 m() { C.o = 42; }
341 }
342 ''',
343 const Visit(VisitKind.VISIT_STATIC_SETTER_SET,
344 element: 'setter(C#o)',
345 rhs: '42')),
346 const Test.prefix(
347 '''
348 class C {
349 static set o(_) {}
350 }
351 ''',
352 'm() { p.C.o = 42; }',
353 const Visit(VisitKind.VISIT_STATIC_SETTER_SET,
354 element: 'setter(C#o)',
355 rhs: '42')),
356 const Test(
357 '''
358 class C { static get o => null; }
359 m() => C.o(null, 42);
360 ''',
361 const Visit(VisitKind.VISIT_STATIC_GETTER_INVOKE,
362 element: 'getter(C#o)',
363 arguments: '(null,42)')),
364 const Test.clazz(
365 '''
366 class C {
367 static get o => null;
368 m() { o(null, 42); }
369 }
370 ''',
371 const Visit(VisitKind.VISIT_STATIC_GETTER_INVOKE,
372 element: 'getter(C#o)',
373 arguments: '(null,42)')),
374 const Test.clazz(
375 '''
376 class C {
377 static get o => null;
378 m() { C.o(null, 42); }
379 }
380 ''',
381 const Visit(VisitKind.VISIT_STATIC_GETTER_INVOKE,
382 element: 'getter(C#o)',
383 arguments: '(null,42)')),
384 const Test.prefix(
385 '''
386 class C {
387 static get o => null;
388 }
389 ''',
390 'm() { p.C.o(null, 42); }',
391 const Visit(VisitKind.VISIT_STATIC_GETTER_INVOKE,
392 element: 'getter(C#o)',
393 arguments: '(null,42)')),
394
395 // Static functions
396 const Test(
397 '''
398 class C { static o(a, b) {} }
399 m() => C.o;
400 ''',
401 const Visit(VisitKind.VISIT_STATIC_FUNCTION_GET,
402 element: 'function(C#o)')),
403 const Test.clazz(
404 '''
405 class C {
406 static o(a, b) {}
407 m() => o;
408 }
409 ''',
410 const Visit(VisitKind.VISIT_STATIC_FUNCTION_GET,
411 element: 'function(C#o)')),
412 const Test.clazz(
413 '''
414 class C {
415 static o(a, b) {}
416 m() => C.o;
417 }
418 ''',
419 const Visit(VisitKind.VISIT_STATIC_FUNCTION_GET,
420 element: 'function(C#o)')),
421 const Test.prefix(
422 '''
423 class C { static o(a, b) {} }
424 ''',
425 '''
426 m() => p.C.o;
427 ''',
428 const Visit(VisitKind.VISIT_STATIC_FUNCTION_GET,
429 element: 'function(C#o)')),
430 const Test(
431 '''
432 class C { static o(a, b) {} }
433 m() => C.o(null, 42);
434 ''',
435 const Visit(VisitKind.VISIT_STATIC_FUNCTION_INVOKE,
436 element: 'function(C#o)',
437 arguments: '(null,42)')),
438 const Test.clazz(
439 '''
440 class C {
441 static o(a, b) {}
442 m() { o(null, 42); }
443 }
444 ''',
445 const Visit(VisitKind.VISIT_STATIC_FUNCTION_INVOKE,
446 element: 'function(C#o)',
447 arguments: '(null,42)')),
448 const Test.clazz(
449 '''
450 class C {
451 static o(a, b) {}
452 m() { C.o(null, 42); }
453 }
454 ''',
455 const Visit(VisitKind.VISIT_STATIC_FUNCTION_INVOKE,
456 element: 'function(C#o)',
457 arguments: '(null,42)')),
458 const Test.prefix(
459 '''
460 class C {
461 static o(a, b) {}
462 }
463 ''',
464 'm() { p.C.o(null, 42); }',
465 const Visit(VisitKind.VISIT_STATIC_FUNCTION_INVOKE,
466 element: 'function(C#o)',
467 arguments: '(null,42)')),
468
469 // Top level fields
470 const Test(
471 '''
472 var o;
473 m() => o;
474 ''',
475 const Visit(VisitKind.VISIT_TOP_LEVEL_FIELD_GET,
476 element: 'field(o)')),
477 const Test.prefix(
478 '''
479 var o;
480 ''',
481 'm() => p.o;',
482 const Visit(VisitKind.VISIT_TOP_LEVEL_FIELD_GET,
483 element: 'field(o)')),
484 const Test(
485 '''
486 var o;
487 m() { o = 42; }
488 ''',
489 const Visit(VisitKind.VISIT_TOP_LEVEL_FIELD_SET,
490 element: 'field(o)',
491 rhs: '42')),
492 const Test.prefix(
493 '''
494 var o;
495 ''',
496 'm() { p.o = 42; }',
497 const Visit(VisitKind.VISIT_TOP_LEVEL_FIELD_SET,
498 element: 'field(o)',
499 rhs: '42')),
500 const Test(
501 '''
502 var o;
503 m() { o(null, 42); }
504 ''',
505 const Visit(VisitKind.VISIT_TOP_LEVEL_FIELD_INVOKE,
506 element: 'field(o)',
507 arguments: '(null,42)')),
508 const Test.prefix(
509 '''
510 var o;
511 ''',
512 'm() { p.o(null, 42); }',
513 const Visit(VisitKind.VISIT_TOP_LEVEL_FIELD_INVOKE,
514 element: 'field(o)',
515 arguments: '(null,42)')),
516
517 // Top level properties
518 const Test(
519 '''
520 get o => null;
521 m() => o;
522 ''',
523 const Visit(VisitKind.VISIT_TOP_LEVEL_GETTER_GET,
524 element: 'getter(o)')),
525 const Test.prefix(
526 '''
527 get o => null;
528 ''',
529 '''
530 m() => p.o;
531 ''',
532 const Visit(VisitKind.VISIT_TOP_LEVEL_GETTER_GET,
533 element: 'getter(o)')),
534 const Test(
535 '''
536 set o(_) {}
537 m() { o = 42; }
538 ''',
539 const Visit(VisitKind.VISIT_TOP_LEVEL_SETTER_SET,
540 element: 'setter(o)',
541 rhs: '42')),
542 const Test.prefix(
543 '''
544 set o(_) {}
545 ''',
546 'm() { p.o = 42; }',
547 const Visit(VisitKind.VISIT_TOP_LEVEL_SETTER_SET,
548 element: 'setter(o)',
549 rhs: '42')),
550 const Test(
551 '''
552 get o => null;
553 m() => o(null, 42);
554 ''',
555 const Visit(VisitKind.VISIT_TOP_LEVEL_GETTER_INVOKE,
556 element: 'getter(o)',
557 arguments: '(null,42)')),
558 const Test.prefix(
559 '''
560 get o => null;
561 ''',
562 'm() { p.o(null, 42); }',
563 const Visit(VisitKind.VISIT_TOP_LEVEL_GETTER_INVOKE,
564 element: 'getter(o)',
565 arguments: '(null,42)')),
566
567 // Top level functions
568 const Test(
569 '''
570 o(a, b) {}
571 m() => o;
572 ''',
573 const Visit(VisitKind.VISIT_TOP_LEVEL_FUNCTION_GET,
574 element: 'function(o)')),
575 const Test(
576 '''
577 o(a, b) {}
578 m() => o(null, 42);
579 ''',
580 const Visit(VisitKind.VISIT_TOP_LEVEL_FUNCTION_INVOKE,
581 element: 'function(o)',
582 arguments: '(null,42)')),
583 const Test.prefix(
584 '''
585 o(a, b) {}
586 ''',
587 'm() { p.o(null, 42); }',
588 const Visit(VisitKind.VISIT_TOP_LEVEL_FUNCTION_INVOKE,
589 element: 'function(o)',
590 arguments: '(null,42)')),
591
592 // Dynamic properties
593 const Test('m(o) => o.foo;',
594 const Visit(VisitKind.VISIT_DYNAMIC_PROPERTY_GET,
595 receiver: 'o',
596 name: 'foo')),
597 const Test('m(o) { o.foo = 42; }',
598 const Visit(VisitKind.VISIT_DYNAMIC_PROPERTY_SET,
599 receiver: 'o',
600 name: 'foo',
601 rhs: '42')),
602 const Test('m(o) { o.foo(null, 42); }',
603 const Visit(VisitKind.VISIT_DYNAMIC_PROPERTY_INVOKE,
604 receiver: 'o',
605 name: 'foo',
606 arguments: '(null,42)')),
607
608 // This access
609 const Test.clazz(
610 '''
611 class C {
612 m() => this;
613 }
614 ''',
615 const Visit(VisitKind.VISIT_THIS_GET)),
616 const Test.clazz(
617 '''
618 class C {
619 call(a, b) {}
620 m() { this(null, 42); }
621 }
622 ''',
623 const Visit(VisitKind.VISIT_THIS_INVOKE,
624 arguments: '(null,42)')),
625
626 // This properties
627 const Test.clazz(
628 '''
629 class C {
630 var foo;
631 m() => foo;
632 }
633 ''',
634 const Visit(VisitKind.VISIT_THIS_PROPERTY_GET,
635 name: 'foo')),
636 const Test.clazz(
637 '''
638 class C {
639 var foo;
640 m() => this.foo;
641 }
642 ''',
643 const Visit(VisitKind.VISIT_THIS_PROPERTY_GET,
644 name: 'foo')),
645 const Test.clazz(
646 '''
647 class C {
648 get foo => null;
649 m() => foo;
650 }
651 ''',
652 const Visit(VisitKind.VISIT_THIS_PROPERTY_GET,
653 name: 'foo')),
654 const Test.clazz(
655 '''
656 class C {
657 get foo => null;
658 m() => this.foo;
659 }
660 ''',
661 const Visit(VisitKind.VISIT_THIS_PROPERTY_GET,
662 name: 'foo')),
663 const Test.clazz(
664 '''
665 class C {
666 var foo;
667 m() { foo = 42; }
668 }
669 ''',
670 const Visit(VisitKind.VISIT_THIS_PROPERTY_SET,
671 name: 'foo',
672 rhs: '42')),
673 const Test.clazz(
674 '''
675 class C {
676 var foo;
677 m() { this.foo = 42; }
678 }
679 ''',
680 const Visit(VisitKind.VISIT_THIS_PROPERTY_SET,
681 name: 'foo',
682 rhs: '42')),
683 const Test.clazz(
684 '''
685 class C {
686 set foo(_) {}
687 m() { foo = 42; }
688 }
689 ''',
690 const Visit(VisitKind.VISIT_THIS_PROPERTY_SET,
691 name: 'foo',
692 rhs: '42')),
693 const Test.clazz(
694 '''
695 class C {
696 set foo(_) {}
697 m() { this.foo = 42; }
698 }
699 ''',
700 const Visit(VisitKind.VISIT_THIS_PROPERTY_SET,
701 name: 'foo',
702 rhs: '42')),
703 const Test.clazz(
704 '''
705 class C {
706 var foo;
707 m() { foo(null, 42); }
708 }
709 ''',
710 const Visit(VisitKind.VISIT_THIS_PROPERTY_INVOKE,
711 name: 'foo',
712 arguments: '(null,42)')),
713 const Test.clazz(
714 '''
715 class C {
716 var foo;
717 m() { this.foo(null, 42); }
718 }
719 ''',
720 const Visit(VisitKind.VISIT_THIS_PROPERTY_INVOKE,
721 name: 'foo',
722 arguments: '(null,42)')),
723
724 // Super fields
725 const Test.clazz(
726 '''
727 class B {
728 var o;
729 }
730 class C extends B {
731 m() => super.o;
732 }
733 ''',
734 const Visit(VisitKind.VISIT_SUPER_FIELD_GET,
735 element: 'field(B#o)')),
736 const Test.clazz(
737 '''
738 class B {
739 var o;
740 }
741 class C extends B {
742 m() { super.o = 42; }
743 }
744 ''',
745 const Visit(VisitKind.VISIT_SUPER_FIELD_SET,
746 element: 'field(B#o)',
747 rhs: '42')),
748 const Test.clazz(
749 '''
750 class B {
751 var o;
752 }
753 class C extends B {
754 m() { super.o(null, 42); }
755 }
756 ''',
757 const Visit(VisitKind.VISIT_SUPER_FIELD_INVOKE,
758 element: 'field(B#o)',
759 arguments: '(null,42)')),
760
761 // Super properties
762 const Test.clazz(
763 '''
764 class B {
765 get o => null;
766 }
767 class C extends B {
768 m() => super.o;
769 }
770 ''',
771 const Visit(VisitKind.VISIT_SUPER_GETTER_GET,
772 element: 'getter(B#o)')),
773 const Test.clazz(
774 '''
775 class B {
776 set o(_) {}
777 }
778 class C extends B {
779 m() { super.o = 42; }
780 }
781 ''',
782 const Visit(VisitKind.VISIT_SUPER_SETTER_SET,
783 element: 'setter(B#o)',
784 rhs: '42')),
785 const Test.clazz(
786 '''
787 class B {
788 get o => null;
789 }
790 class C extends B {
791 m() { super.o(null, 42); }
792 }
793 ''',
794 const Visit(VisitKind.VISIT_SUPER_GETTER_INVOKE,
795 element: 'getter(B#o)',
796 arguments: '(null,42)')),
797
798 // Super methods
799 const Test.clazz(
800 '''
801 class B {
802 o(a, b) {}
803 }
804 class C extends B {
805 m() => super.o;
806 }
807 ''',
808 const Visit(VisitKind.VISIT_SUPER_METHOD_GET,
809 element: 'function(B#o)')),
810 const Test.clazz(
811 '''
812 class B {
813 o(a, b) {}
814 }
815 class C extends B {
816 m() { super.o(null, 42); }
817 }
818 ''',
819 const Visit(VisitKind.VISIT_SUPER_METHOD_INVOKE,
820 element: 'function(B#o)',
821 arguments: '(null,42)')),
822
823 // Expression invoke
824 const Test('m() => (a, b){}(null, 42);',
825 const Visit(VisitKind.VISIT_EXPRESSION_INVOKE,
826 receiver: '(a,b){}',
827 arguments: '(null,42)')),
828
829 // Class type literals
830 const Test(
831 '''
832 class C {}
833 m() => C;
834 ''',
835 const Visit(VisitKind.VISIT_CLASS_TYPE_LITERAL_GET,
836 constant: 'C')),
837 const Test(
838 '''
839 class C {}
840 m() => C(null, 42);
841 ''',
842 const Visit(VisitKind.VISIT_CLASS_TYPE_LITERAL_INVOKE,
843 constant: 'C',
844 arguments: '(null,42)')),
845
846 // Typedef type literals
847 const Test(
848 '''
849 typedef F();
850 m() => F;
851 ''',
852 const Visit(VisitKind.VISIT_TYPEDEF_TYPE_LITERAL_GET,
853 constant: 'F')),
854 const Test(
855 '''
856 typedef F();
857 m() => F(null, 42);
858 ''',
859 const Visit(VisitKind.VISIT_TYPEDEF_TYPE_LITERAL_INVOKE,
860 constant: 'F',
861 arguments: '(null,42)')),
862
863 // Type variable type literals
864 const Test.clazz(
865 '''
866 class C<T> {
867 m() => T;
868 }
869 ''',
870 const Visit(VisitKind.VISIT_TYPE_VARIABLE_TYPE_LITERAL_GET,
871 element: 'type_variable(C#T)')),
872 const Test.clazz(
873 '''
874 class C<T> {
875 m() => T(null, 42);
876 }
877 ''',
878 const Visit(VisitKind.VISIT_TYPE_VARIABLE_TYPE_LITERAL_INVOKE,
879 element: 'type_variable(C#T)',
880 arguments: '(null,42)')),
881
882 // Dynamic type literals
883 const Test(
884 '''
885 m() => dynamic;
886 ''',
887 const Visit(VisitKind.VISIT_DYNAMIC_TYPE_LITERAL_GET,
888 constant: 'dynamic')),
889 // TODO(johnniwinther): Enable this when we pass the right constant.
890 // Currently we generated the constant for `Type` instead of `dynamic`.
891 /*const Test(
892 '''
893 m() { dynamic(null, 42); }
894 ''',
895 const Visit(VisitKind.VISIT_DYNAMIC_TYPE_LITERAL_INVOKE,
896 constant: 'dynamic',
897 arguments: '(null,42)')),*/
898
899 // Assert
900 const Test(
901 '''
902 m() { assert(false); }
903 ''',
904 const Visit(VisitKind.VISIT_ASSERT, expression: 'false')),
905
906 // Logical and
907 const Test(
908 '''
909 m() => true && false;
910 ''',
911 const Visit(VisitKind.VISIT_LOGICAL_AND, left: 'true', right: 'false')),
912
913 // Logical or
914 const Test(
915 '''
916 m() => true || false;
917 ''',
918 const Visit(VisitKind.VISIT_LOGICAL_OR, left: 'true', right: 'false')),
919
920 // Is test
921 const Test(
922 '''
923 class C {}
924 m() => 0 is C;
925 ''',
926 const Visit(VisitKind.VISIT_IS, expression: '0', type: 'C')),
927
928 // Is not test
929 const Test(
930 '''
931 class C {}
932 m() => 0 is! C;
933 ''',
934 const Visit(VisitKind.VISIT_IS_NOT, expression: '0', type: 'C')),
935
936 // Is test
937 const Test(
938 '''
939 class C {}
940 m() => 0 as C;
941 ''',
942 const Visit(VisitKind.VISIT_AS, expression: '0', type: 'C')),
943
944 // Binary operators
945 const Test(
946 '''
947 m() => 2 + 3;
948 ''',
949 const Visit(VisitKind.VISIT_BINARY,
950 left: '2', operator: '+', right: '3')),
951 const Test(
952 '''
953 m() => 2 - 3;
954 ''',
955 const Visit(VisitKind.VISIT_BINARY,
956 left: '2', operator: '-', right: '3')),
957 const Test(
958 '''
959 m() => 2 * 3;
960 ''',
961 const Visit(VisitKind.VISIT_BINARY,
962 left: '2', operator: '*', right: '3')),
963 const Test(
964 '''
965 m() => 2 / 3;
966 ''',
967 const Visit(VisitKind.VISIT_BINARY,
968 left: '2', operator: '/', right: '3')),
969 const Test(
970 '''
971 m() => 2 ~/ 3;
972 ''',
973 const Visit(VisitKind.VISIT_BINARY,
974 left: '2', operator: '~/', right: '3')),
975 const Test(
976 '''
977 m() => 2 % 3;
978 ''',
979 const Visit(VisitKind.VISIT_BINARY,
980 left: '2', operator: '%', right: '3')),
981 const Test(
982 '''
983 m() => 2 << 3;
984 ''',
985 const Visit(VisitKind.VISIT_BINARY,
986 left: '2', operator: '<<', right: '3')),
987 const Test(
988 '''
989 m() => 2 >> 3;
990 ''',
991 const Visit(VisitKind.VISIT_BINARY,
992 left: '2', operator: '>>', right: '3')),
993 const Test(
994 '''
995 m() => 2 <= 3;
996 ''',
997 const Visit(VisitKind.VISIT_BINARY,
998 left: '2', operator: '<=', right: '3')),
999 const Test(
1000 '''
1001 m() => 2 < 3;
1002 ''',
1003 const Visit(VisitKind.VISIT_BINARY,
1004 left: '2', operator: '<', right: '3')),
1005 const Test(
1006 '''
1007 m() => 2 >= 3;
1008 ''',
1009 const Visit(VisitKind.VISIT_BINARY,
1010 left: '2', operator: '>=', right: '3')),
1011 const Test(
1012 '''
1013 m() => 2 > 3;
1014 ''',
1015 const Visit(VisitKind.VISIT_BINARY,
1016 left: '2', operator: '>', right: '3')),
1017 const Test(
1018 '''
1019 m() => 2 & 3;
1020 ''',
1021 const Visit(VisitKind.VISIT_BINARY,
1022 left: '2', operator: '&', right: '3')),
1023 const Test(
1024 '''
1025 m() => 2 | 3;
1026 ''',
1027 const Visit(VisitKind.VISIT_BINARY,
1028 left: '2', operator: '|', right: '3')),
1029 const Test(
1030 '''
1031 m() => 2 ^ 3;
1032 ''',
1033 const Visit(VisitKind.VISIT_BINARY,
1034 left: '2', operator: '^', right: '3')),
1035 const Test(
1036 '''
1037 m() => 2[3];
1038 ''',
1039 const Visit(VisitKind.VISIT_BINARY,
1040 left: '2', operator: '[]', right: '3')),
1041 const Test.clazz(
1042 '''
1043 class B {
1044 operator +(_) => null;
1045 }
1046 class C extends B {
1047 m() => super + 42;
1048 }
1049 ''',
1050 const Visit(VisitKind.VISIT_SUPER_BINARY,
1051 element: 'function(B#+)',
1052 operator: '+',
1053 right: '42')),
1054
1055 // Equals
1056 const Test(
1057 '''
1058 m() => 2 == 3;
1059 ''',
1060 const Visit(VisitKind.VISIT_EQUALS,
1061 left: '2', right: '3')),
1062 const Test.clazz(
1063 '''
1064 class B {
1065 operator ==(_) => null;
1066 }
1067 class C extends B {
1068 m() => super == 42;
1069 }
1070 ''',
1071 const Visit(VisitKind.VISIT_SUPER_EQUALS,
1072 element: 'function(B#==)',
1073 right: '42')),
1074
1075 // Not equals
1076 const Test(
1077 '''
1078 m() => 2 != 3;
1079 ''',
1080 const Visit(VisitKind.VISIT_NOT_EQUALS,
1081 left: '2', right: '3')),
1082 // TODO(johnniwinther): Enable this. Resolution does not store the element.
1083 /*const Test.clazz(
1084 '''
1085 class B {
1086 operator ==(_) => null;
1087 }
1088 class C extends B {
1089 m() => super != 42;
1090 }
1091 ''',
1092 const Visit(VisitKind.VISIT_SUPER_NOT_EQUALS,
1093 element: 'function(B#==)',
1094 right: '42')),*/
1095
1096 // Unary expression
1097 const Test(
1098 '''
1099 m() => -false;
1100 ''',
1101 const Visit(VisitKind.VISIT_UNARY,
1102 expression: 'false', operator: '-')),
1103 const Test(
1104 '''
1105 m() => ~false;
1106 ''',
1107 const Visit(VisitKind.VISIT_UNARY,
1108 expression: 'false', operator: '~')),
1109 const Test.clazz(
1110 '''
1111 class B {
1112 operator -() => null;
1113 }
1114 class C extends B {
1115 m() => -super;
1116 }
1117 ''',
1118 const Visit(VisitKind.VISIT_SUPER_UNARY,
1119 element: 'function(B#unary-)', operator: '-')),
1120 const Test.clazz(
1121 '''
1122 class B {
1123 operator ~() => null;
1124 }
1125 class C extends B {
1126 m() => ~super;
1127 }
1128 ''',
1129 const Visit(VisitKind.VISIT_SUPER_UNARY,
1130 element: 'function(B#~)', operator: '~')),
1131 const Test(
1132 '''
1133 m() => !0;
1134 ''',
1135 const Visit(VisitKind.VISIT_NOT, expression: '0')),
1136
1137 // Index set
1138 const Test(
1139 '''
1140 m() => 0[1] = 2;
1141 ''',
1142 const Visit(VisitKind.VISIT_INDEX_SET,
1143 receiver: '0', index: '1', rhs: '2')),
1144 const Test.clazz(
1145 '''
1146 class B {
1147 operator []=(a, b) {}
1148 }
1149 class C extends B {
1150 m() => super[1] = 2;
1151 }
1152 ''',
1153 const Visit(VisitKind.VISIT_SUPER_INDEX_SET,
1154 element: 'function(B#[]=)', index: '1', rhs: '2')),
1155
1156 // Compound assignment
1157 const Test(
1158 '''
1159 m(a) => a.b += 42;
1160 ''',
1161 const [
1162 const Visit(VisitKind.VISIT_DYNAMIC_PROPERTY_COMPOUND,
1163 receiver: 'a', operator: '+=', rhs: '42',
1164 getter: 'Selector(getter, b, arity=0)',
1165 setter: 'Selector(setter, b, arity=1)'),
1166 const Visit(VisitKind.VISIT_PARAMETER_GET,
1167 element: 'parameter(m#a)')
1168 ]),
1169 // TODO(johnniwinther): Enable this when type literals are recognized in
1170 // SendSet.
1171 /*const Test(
1172 '''
1173 class C {}
1174 m(a) => C += 42;
1175 ''',
1176 const Visit(VisitKind.VISIT_CLASS_TYPE_LITERAL_COMPOUND,
1177 constant: 'C', operator: '+=', rhs: '42')),
1178 const Test(
1179 '''
1180 typedef F();
1181 m(a) => F += 42;
1182 ''',
1183 const Visit(VisitKind.VISIT_TYPEDEF_TYPE_LITERAL_COMPOUND,
1184 constant: 'F', operator: '+=', rhs: '42')),
1185 const Test.clazz(
1186 '''
1187 class C<T> {
1188 m(a) => T += 42;
1189 }
1190 ''',
1191 const Visit(VisitKind.VISIT_TYPE_VARIABLE_TYPE_LITERAL_COMPOUND,
1192 element: 'type_variable(C#T)', operator: '+=', rhs: '42')),
1193 const Test(
1194 '''
1195 m(a) => dynamic += 42;
1196 ''',
1197 const Visit(VisitKind.VISIT_DYNAMIC_TYPE_LITERAL_COMPOUND,
1198 constant: 'dynamic',
1199 operator: '+=', rhs: '42')),*/
1200 const Test(
1201 '''
1202 m(a) => a += 42;
1203 ''',
1204 const Visit(VisitKind.VISIT_PARAMETER_COMPOUND,
1205 element: 'parameter(m#a)', operator: '+=', rhs: '42')),
1206 const Test(
1207 '''
1208 m() {
1209 var a;
1210 a += 42;
1211 }
1212 ''',
1213 const Visit(VisitKind.VISIT_LOCAL_VARIABLE_COMPOUND,
1214 element: 'variable(m#a)', operator: '+=', rhs: '42')),
1215 const Test(
1216 '''
1217 var a;
1218 m() => a += 42;
1219 ''',
1220 const Visit(VisitKind.VISIT_TOP_LEVEL_FIELD_COMPOUND,
1221 element: 'field(a)', operator: '+=', rhs: '42')),
1222 const Test(
1223 '''
1224 get a => 0;
1225 set a(_) {}
1226 m() => a += 42;
1227 ''',
1228 const Visit(VisitKind.VISIT_TOP_LEVEL_GETTER_SETTER_COMPOUND,
1229 getter: 'getter(a)', setter: 'setter(a)',
1230 operator: '+=', rhs: '42')),
1231 const Test(
1232 '''
1233 class C {
1234 static var a;
1235 }
1236 m() => C.a += 42;
1237 ''',
1238 const Visit(VisitKind.VISIT_STATIC_FIELD_COMPOUND,
1239 element: 'field(C#a)', operator: '+=', rhs: '42')),
1240 const Test.clazz(
1241 '''
1242 class C {
1243 static var a;
1244 m() => C.a += 42;
1245 }
1246 ''',
1247 const Visit(VisitKind.VISIT_STATIC_FIELD_COMPOUND,
1248 element: 'field(C#a)', operator: '+=', rhs: '42')),
1249 const Test.clazz(
1250 '''
1251 class C {
1252 static var a;
1253 m() => a += 42;
1254 }
1255 ''',
1256 const Visit(VisitKind.VISIT_STATIC_FIELD_COMPOUND,
1257 element: 'field(C#a)', operator: '+=', rhs: '42')),
1258 const Test.prefix(
1259 '''
1260 class C {
1261 static var a;
1262 }
1263 ''',
1264 '''
1265 m() => p.C.a += 42;
1266 ''',
1267 const Visit(VisitKind.VISIT_STATIC_FIELD_COMPOUND,
1268 element: 'field(C#a)', operator: '+=', rhs: '42')),
1269 const Test(
1270 '''
1271 class C {
1272 static get a => 0;
1273 static set a(_) {}
1274 }
1275 m() => C.a += 42;
1276 ''',
1277 const Visit(VisitKind.VISIT_STATIC_GETTER_SETTER_COMPOUND,
1278 getter: 'getter(C#a)', setter: 'setter(C#a)',
1279 operator: '+=', rhs: '42')),
1280 const Test.clazz(
1281 '''
1282 class C {
1283 static get a => 0;
1284 static set a(_) {}
1285 m() => C.a += 42;
1286 }
1287 ''',
1288 const Visit(VisitKind.VISIT_STATIC_GETTER_SETTER_COMPOUND,
1289 getter: 'getter(C#a)', setter: 'setter(C#a)',
1290 operator: '+=', rhs: '42')),
1291 const Test.clazz(
1292 '''
1293 class C {
1294 static get a => 0;
1295 static set a(_) {}
1296 m() => a += 42;
1297 }
1298 ''',
1299 const Visit(VisitKind.VISIT_STATIC_GETTER_SETTER_COMPOUND,
1300 getter: 'getter(C#a)', setter: 'setter(C#a)',
1301 operator: '+=', rhs: '42')),
1302 const Test.prefix(
1303 '''
1304 class C {
1305 static get a => 0;
1306 static set a(_) {}
1307 }
1308 ''',
1309 '''
1310 m() => p.C.a += 42;
1311 ''',
1312 const Visit(VisitKind.VISIT_STATIC_GETTER_SETTER_COMPOUND,
1313 getter: 'getter(C#a)', setter: 'setter(C#a)',
1314 operator: '+=', rhs: '42')),
1315 // TODO(johnniwinther): Enable these when dart2js supports method and setter
1316 // with the same name.
1317 /*const Test(
1318 '''
1319 class C {
1320 static a() {}
1321 static set a(_) {}
1322 }
1323 m() => C.a += 42;
1324 ''',
1325 const Visit(VisitKind.VISIT_STATIC_METHOD_SETTER_COMPOUND,
1326 getter: 'function(C#a)', setter: 'setter(C#a)',
1327 operator: '+=', rhs: '42')),
1328 const Test.clazz(
1329 '''
1330 class C {
1331 static a() {}
1332 static set a(_) {}
1333 m() => C.a += 42;
1334 }
1335 ''',
1336 const Visit(VisitKind.VISIT_STATIC_METHOD_SETTER_COMPOUND,
1337 getter: 'function(C#a)', setter: 'setter(C#a)',
1338 operator: '+=', rhs: '42')),
1339 const Test.clazz(
1340 '''
1341 class C {
1342 static a() {}
1343 static set a(_) {}
1344 m() => a += 42;
1345 }
1346 ''',
1347 const Visit(VisitKind.VISIT_STATIC_METHOD_SETTER_COMPOUND,
1348 getter: 'function(C#a)', setter: 'setter(C#a)',
1349 operator: '+=', rhs: '42')),
1350 const Test.prefix(
1351 '''
1352 class C {
1353 static a() {}
1354 static set a(_) {}
1355 }
1356 ''',
1357 '''
1358 m() => p.C.a += 42;
1359 ''',
1360 const Visit(VisitKind.VISIT_STATIC_METHOD_SETTER_COMPOUND,
1361 getter: 'function(C#a)', setter: 'setter(C#a)',
1362 operator: '+=', rhs: '42')),*/
1363 const Test.clazz(
1364 '''
1365 class C {
1366 var a;
1367 m() => a += 42;
1368 }
1369 ''',
1370 const Visit(VisitKind.VISIT_THIS_PROPERTY_COMPOUND,
1371 operator: '+=', rhs: '42',
1372 getter: 'Selector(getter, a, arity=0)',
1373 setter: 'Selector(setter, a, arity=1)')),
1374 const Test.clazz(
1375 '''
1376 class C {
1377 var a = 0;
1378 m() => this.a += 42;
1379 }
1380 ''',
1381 const Visit(VisitKind.VISIT_THIS_PROPERTY_COMPOUND,
1382 operator: '+=', rhs: '42',
1383 getter: 'Selector(getter, a, arity=0)',
1384 setter: 'Selector(setter, a, arity=1)')),
1385 const Test.clazz(
1386 '''
1387 class B {
1388 var a = 0;
1389 }
1390 class C extends B {
1391 m() => super.a += 42;
1392 }
1393 ''',
1394 const Visit(VisitKind.VISIT_SUPER_FIELD_COMPOUND,
1395 element: 'field(B#a)', operator: '+=', rhs: '42')),
1396 const Test.clazz(
1397 '''
1398 class B {
1399 get a => 0;
1400 set a (_) {}
1401 }
1402 class C extends B {
1403 m() => super.a += 42;
1404 }
1405 ''',
1406 const Visit(VisitKind.VISIT_SUPER_GETTER_SETTER_COMPOUND,
1407 getter: 'getter(B#a)', setter: 'setter(B#a)',
1408 operator: '+=', rhs: '42')),
1409 const Test.clazz(
1410 '''
1411 class A {
1412 get a => 0;
1413 }
1414 class B extends A {
1415 set a (_) {}
1416 }
1417 class C extends B {
1418 m() => super.a += 42;
1419 }
1420 ''',
1421 const Visit(VisitKind.VISIT_SUPER_GETTER_SETTER_COMPOUND,
1422 getter: 'getter(A#a)', setter: 'setter(B#a)',
1423 operator: '+=', rhs: '42')),
1424 const Test.clazz(
1425 '''
1426 class A {
1427 var a;
1428 }
1429 class B extends A {
1430 get a => 0;
1431 }
1432
1433 class C extends B {
1434 m() => super.a += 42;
1435 }
1436 ''',
1437 const Visit(VisitKind.VISIT_SUPER_GETTER_FIELD_COMPOUND,
1438 getter: 'getter(B#a)', setter: 'field(A#a)',
1439 operator: '+=', rhs: '42')),
1440 const Test.clazz(
1441 '''
1442 class A {
1443 var a;
1444 }
1445 class B extends A {
1446 set a(_) {}
1447 }
1448
1449 class C extends B {
1450 m() => super.a += 42;
1451 }
1452 ''',
1453 const Visit(VisitKind.VISIT_SUPER_FIELD_SETTER_COMPOUND,
1454 getter: 'field(A#a)', setter: 'setter(B#a)',
1455 operator: '+=', rhs: '42')),
1456 // TODO(johnniwinther): Enable this when dart2js supports shadow setters.
1457 /*const Test.clazz(
1458 '''
1459 class A {
1460 var a;
1461 }
1462 class B extends A {
1463 final a;
1464 }
1465
1466 class C extends B {
1467 m() => super.a += 42;
1468 }
1469 ''',
1470 const Visit(VisitKind.VISIT_SUPER_FIELD_FIELD_COMPOUND,
1471 getter: 'field(B#a)', setter: 'field(A#a)',
1472 operator: '+=', rhs: '42')),*/
1473
1474 // Compound index assignment
1475 const Test(
1476 '''
1477 m() => 0[1] += 42;
1478 ''',
1479 const Visit(VisitKind.VISIT_COMPOUND_INDEX_SET,
1480 receiver: '0', index: '1', operator: '+=', rhs: '42')),
1481 // TODO(johnniwinther): Enable this when the getter element is stored.
1482 /*const Test.clazz(
1483 '''
1484 class B {
1485 operator [](_) {}
1486 operator []=(a, b) {}
1487 }
1488 class C extends B {
1489 m() => super[1] += 42;
1490 }
1491 ''',
1492 const Visit(VisitKind.VISIT_SUPER_COMPOUND_INDEX_SET,
1493 getter: 'function(B#[])', setter: 'function(B#[]=)',
1494 index: '1', operator: '+=', rhs: '42')),*/
1495
1496 // Prefix expression
1497 const Test(
1498 '''
1499 m(a) => --a.b;
1500 ''',
1501 const [
1502 const Visit(VisitKind.VISIT_DYNAMIC_PROPERTY_PREFIX,
1503 receiver: 'a', operator: '--',
1504 getter: 'Selector(getter, b, arity=0)',
1505 setter: 'Selector(setter, b, arity=1)'),
1506 const Visit(VisitKind.VISIT_PARAMETER_GET,
1507 element: 'parameter(m#a)')
1508 ]),
1509 const Test(
1510 '''
1511 m(a) => ++a;
1512 ''',
1513 const Visit(VisitKind.VISIT_PARAMETER_PREFIX,
1514 element: 'parameter(m#a)', operator: '++')),
1515 const Test(
1516 '''
1517 m() {
1518 var a;
1519 --a;
1520 }
1521 ''',
1522 const Visit(VisitKind.VISIT_LOCAL_VARIABLE_PREFIX,
1523 element: 'variable(m#a)', operator: '--')),
1524 const Test(
1525 '''
1526 var a;
1527 m() => ++a;
1528 ''',
1529 const Visit(VisitKind.VISIT_TOP_LEVEL_FIELD_PREFIX,
1530 element: 'field(a)', operator: '++')),
1531 const Test(
1532 '''
1533 get a => 0;
1534 set a(_) {}
1535 m() => --a;
1536 ''',
1537 const Visit(VisitKind.VISIT_TOP_LEVEL_GETTER_SETTER_PREFIX,
1538 getter: 'getter(a)', setter: 'setter(a)',
1539 operator: '--')),
1540 const Test(
1541 '''
1542 class C {
1543 static var a;
1544 }
1545 m() => ++C.a;
1546 ''',
1547 const Visit(VisitKind.VISIT_STATIC_FIELD_PREFIX,
1548 element: 'field(C#a)', operator: '++')),
1549 const Test.clazz(
1550 '''
1551 class C {
1552 static var a;
1553 m() => ++C.a;
1554 }
1555 ''',
1556 const Visit(VisitKind.VISIT_STATIC_FIELD_PREFIX,
1557 element: 'field(C#a)', operator: '++')),
1558 const Test.clazz(
1559 '''
1560 class C {
1561 static var a;
1562 m() => --a;
1563 }
1564 ''',
1565 const Visit(VisitKind.VISIT_STATIC_FIELD_PREFIX,
1566 element: 'field(C#a)', operator: '--')),
1567 const Test.prefix(
1568 '''
1569 class C {
1570 static var a;
1571 }
1572 ''',
1573 '''
1574 m() => --p.C.a;
1575 ''',
1576 const Visit(VisitKind.VISIT_STATIC_FIELD_PREFIX,
1577 element: 'field(C#a)', operator: '--')),
1578 const Test(
1579 '''
1580 class C {
1581 static get a => 0;
1582 static set a(_) {}
1583 }
1584 m() => ++C.a;
1585 ''',
1586 const Visit(VisitKind.VISIT_STATIC_GETTER_SETTER_PREFIX,
1587 getter: 'getter(C#a)', setter: 'setter(C#a)',
1588 operator: '++')),
1589 const Test.clazz(
1590 '''
1591 class C {
1592 static get a => 0;
1593 static set a(_) {}
1594 m() => --C.a;
1595 }
1596 ''',
1597 const Visit(VisitKind.VISIT_STATIC_GETTER_SETTER_PREFIX,
1598 getter: 'getter(C#a)', setter: 'setter(C#a)',
1599 operator: '--')),
1600 const Test.clazz(
1601 '''
1602 class C {
1603 static get a => 0;
1604 static set a(_) {}
1605 m() => --a;
1606 }
1607 ''',
1608 const Visit(VisitKind.VISIT_STATIC_GETTER_SETTER_PREFIX,
1609 getter: 'getter(C#a)', setter: 'setter(C#a)',
1610 operator: '--')),
1611 const Test.prefix(
1612 '''
1613 class C {
1614 static get a => 0;
1615 static set a(_) {}
1616 }
1617 ''',
1618 '''
1619 m() => ++p.C.a;
1620 ''',
1621 const Visit(VisitKind.VISIT_STATIC_GETTER_SETTER_PREFIX,
1622 getter: 'getter(C#a)', setter: 'setter(C#a)',
1623 operator: '++')),
1624 const Test.clazz(
1625 '''
1626 class C {
1627 var a;
1628 m() => --a;
1629 }
1630 ''',
1631 const Visit(VisitKind.VISIT_THIS_PROPERTY_PREFIX,
1632 operator: '--',
1633 getter: 'Selector(getter, a, arity=0)',
1634 setter: 'Selector(setter, a, arity=1)')),
1635 const Test.clazz(
1636 '''
1637 class C {
1638 var a = 0;
1639 m() => ++this.a;
1640 }
1641 ''',
1642 const Visit(VisitKind.VISIT_THIS_PROPERTY_PREFIX,
1643 operator: '++',
1644 getter: 'Selector(getter, a, arity=0)',
1645 setter: 'Selector(setter, a, arity=1)')),
1646 const Test.clazz(
1647 '''
1648 class B {
1649 var a = 0;
1650 }
1651 class C extends B {
1652 m() => --super.a;
1653 }
1654 ''',
1655 const Visit(VisitKind.VISIT_SUPER_FIELD_PREFIX,
1656 element: 'field(B#a)', operator: '--')),
1657 const Test.clazz(
1658 '''
1659 class B {
1660 get a => 0;
1661 set a (_) {}
1662 }
1663 class C extends B {
1664 m() => --super.a;
1665 }
1666 ''',
1667 const Visit(VisitKind.VISIT_SUPER_GETTER_SETTER_PREFIX,
1668 getter: 'getter(B#a)', setter: 'setter(B#a)',
1669 operator: '--')),
1670 const Test.clazz(
1671 '''
1672 class A {
1673 get a => 0;
1674 }
1675 class B extends A {
1676 set a (_) {}
1677 }
1678 class C extends B {
1679 m() => ++super.a;
1680 }
1681 ''',
1682 const Visit(VisitKind.VISIT_SUPER_GETTER_SETTER_PREFIX,
1683 getter: 'getter(A#a)', setter: 'setter(B#a)',
1684 operator: '++')),
1685 const Test.clazz(
1686 '''
1687 class A {
1688 var a;
1689 }
1690 class B extends A {
1691 get a => 0;
1692 }
1693
1694 class C extends B {
1695 m() => --super.a;
1696 }
1697 ''',
1698 const Visit(VisitKind.VISIT_SUPER_GETTER_FIELD_PREFIX,
1699 getter: 'getter(B#a)', setter: 'field(A#a)',
1700 operator: '--')),
1701 const Test.clazz(
1702 '''
1703 class A {
1704 var a;
1705 }
1706 class B extends A {
1707 set a(_) {}
1708 }
1709
1710 class C extends B {
1711 m() => ++super.a;
1712 }
1713 ''',
1714 const Visit(VisitKind.VISIT_SUPER_FIELD_SETTER_PREFIX,
1715 getter: 'field(A#a)', setter: 'setter(B#a)',
1716 operator: '++')),
1717
1718 // Prefix expression
1719 const Test(
1720 '''
1721 m(a) => a.b--;
1722 ''',
1723 const [
1724 const Visit(VisitKind.VISIT_DYNAMIC_PROPERTY_POSTFIX,
1725 receiver: 'a', operator: '--',
1726 getter: 'Selector(getter, b, arity=0)',
1727 setter: 'Selector(setter, b, arity=1)'),
1728 const Visit(VisitKind.VISIT_PARAMETER_GET,
1729 element: 'parameter(m#a)')
1730 ]),
1731 const Test(
1732 '''
1733 m(a) => a++;
1734 ''',
1735 const Visit(VisitKind.VISIT_PARAMETER_POSTFIX,
1736 element: 'parameter(m#a)', operator: '++')),
1737 const Test(
1738 '''
1739 m() {
1740 var a;
1741 a--;
1742 }
1743 ''',
1744 const Visit(VisitKind.VISIT_LOCAL_VARIABLE_POSTFIX,
1745 element: 'variable(m#a)', operator: '--')),
1746 const Test(
1747 '''
1748 var a;
1749 m() => a++;
1750 ''',
1751 const Visit(VisitKind.VISIT_TOP_LEVEL_FIELD_POSTFIX,
1752 element: 'field(a)', operator: '++')),
1753 const Test(
1754 '''
1755 get a => 0;
1756 set a(_) {}
1757 m() => a--;
1758 ''',
1759 const Visit(VisitKind.VISIT_TOP_LEVEL_GETTER_SETTER_POSTFIX,
1760 getter: 'getter(a)', setter: 'setter(a)',
1761 operator: '--')),
1762 const Test(
1763 '''
1764 class C {
1765 static var a;
1766 }
1767 m() => C.a++;
1768 ''',
1769 const Visit(VisitKind.VISIT_STATIC_FIELD_POSTFIX,
1770 element: 'field(C#a)', operator: '++')),
1771 const Test.clazz(
1772 '''
1773 class C {
1774 static var a;
1775 m() => C.a++;
1776 }
1777 ''',
1778 const Visit(VisitKind.VISIT_STATIC_FIELD_POSTFIX,
1779 element: 'field(C#a)', operator: '++')),
1780 const Test.clazz(
1781 '''
1782 class C {
1783 static var a;
1784 m() => a--;
1785 }
1786 ''',
1787 const Visit(VisitKind.VISIT_STATIC_FIELD_POSTFIX,
1788 element: 'field(C#a)', operator: '--')),
1789 const Test.prefix(
1790 '''
1791 class C {
1792 static var a;
1793 }
1794 ''',
1795 '''
1796 m() => p.C.a--;
1797 ''',
1798 const Visit(VisitKind.VISIT_STATIC_FIELD_POSTFIX,
1799 element: 'field(C#a)', operator: '--')),
1800 const Test(
1801 '''
1802 class C {
1803 static get a => 0;
1804 static set a(_) {}
1805 }
1806 m() => C.a++;
1807 ''',
1808 const Visit(VisitKind.VISIT_STATIC_GETTER_SETTER_POSTFIX,
1809 getter: 'getter(C#a)', setter: 'setter(C#a)',
1810 operator: '++')),
1811 const Test.clazz(
1812 '''
1813 class C {
1814 static get a => 0;
1815 static set a(_) {}
1816 m() => C.a--;
1817 }
1818 ''',
1819 const Visit(VisitKind.VISIT_STATIC_GETTER_SETTER_POSTFIX,
1820 getter: 'getter(C#a)', setter: 'setter(C#a)',
1821 operator: '--')),
1822 const Test.clazz(
1823 '''
1824 class C {
1825 static get a => 0;
1826 static set a(_) {}
1827 m() => a--;
1828 }
1829 ''',
1830 const Visit(VisitKind.VISIT_STATIC_GETTER_SETTER_POSTFIX,
1831 getter: 'getter(C#a)', setter: 'setter(C#a)',
1832 operator: '--')),
1833 const Test.prefix(
1834 '''
1835 class C {
1836 static get a => 0;
1837 static set a(_) {}
1838 }
1839 ''',
1840 '''
1841 m() => p.C.a++;
1842 ''',
1843 const Visit(VisitKind.VISIT_STATIC_GETTER_SETTER_POSTFIX,
1844 getter: 'getter(C#a)', setter: 'setter(C#a)',
1845 operator: '++')),
1846 const Test.clazz(
1847 '''
1848 class C {
1849 var a;
1850 m() => a--;
1851 }
1852 ''',
1853 const Visit(VisitKind.VISIT_THIS_PROPERTY_POSTFIX,
1854 operator: '--',
1855 getter: 'Selector(getter, a, arity=0)',
1856 setter: 'Selector(setter, a, arity=1)')),
1857 const Test.clazz(
1858 '''
1859 class C {
1860 var a = 0;
1861 m() => this.a++;
1862 }
1863 ''',
1864 const Visit(VisitKind.VISIT_THIS_PROPERTY_POSTFIX,
1865 operator: '++',
1866 getter: 'Selector(getter, a, arity=0)',
1867 setter: 'Selector(setter, a, arity=1)')),
1868 const Test.clazz(
1869 '''
1870 class B {
1871 var a = 0;
1872 }
1873 class C extends B {
1874 m() => super.a--;
1875 }
1876 ''',
1877 const Visit(VisitKind.VISIT_SUPER_FIELD_POSTFIX,
1878 element: 'field(B#a)', operator: '--')),
1879 const Test.clazz(
1880 '''
1881 class B {
1882 get a => 0;
1883 set a (_) {}
1884 }
1885 class C extends B {
1886 m() => super.a--;
1887 }
1888 ''',
1889 const Visit(VisitKind.VISIT_SUPER_GETTER_SETTER_POSTFIX,
1890 getter: 'getter(B#a)', setter: 'setter(B#a)',
1891 operator: '--')),
1892 const Test.clazz(
1893 '''
1894 class A {
1895 get a => 0;
1896 }
1897 class B extends A {
1898 set a (_) {}
1899 }
1900 class C extends B {
1901 m() => super.a++;
1902 }
1903 ''',
1904 const Visit(VisitKind.VISIT_SUPER_GETTER_SETTER_POSTFIX,
1905 getter: 'getter(A#a)', setter: 'setter(B#a)',
1906 operator: '++')),
1907 const Test.clazz(
1908 '''
1909 class A {
1910 var a;
1911 }
1912 class B extends A {
1913 get a => 0;
1914 }
1915
1916 class C extends B {
1917 m() => super.a--;
1918 }
1919 ''',
1920 const Visit(VisitKind.VISIT_SUPER_GETTER_FIELD_POSTFIX,
1921 getter: 'getter(B#a)', setter: 'field(A#a)',
1922 operator: '--')),
1923 const Test.clazz(
1924 '''
1925 class A {
1926 var a;
1927 }
1928 class B extends A {
1929 set a(_) {}
1930 }
1931
1932 class C extends B {
1933 m() => super.a++;
1934 }
1935 ''',
1936 const Visit(VisitKind.VISIT_SUPER_FIELD_SETTER_POSTFIX,
1937 getter: 'field(A#a)', setter: 'setter(B#a)',
1938 operator: '++')),
1939
1940 ];
1941
1942 main() {
1943 Map<String, String> sourceFiles = {};
1944 Map<String, Test> testMap = {};
1945 StringBuffer mainSource = new StringBuffer();
1946 int index = 0;
1947 TESTS.forEach((Test test) {
1948 StringBuffer testSource = new StringBuffer();
1949 if (test.codeByPrefix != null) {
1950 String prefixFilename = 'pre$index.dart';
1951 sourceFiles[prefixFilename] = test.codeByPrefix;
1952 testSource.writeln("import '$prefixFilename' as p;");
1953 }
1954
1955 String filename = 'lib$index.dart';
1956 testSource.writeln(test.code);
1957 sourceFiles[filename] = testSource.toString();
1958 mainSource.writeln("import '$filename';");
1959 testMap[filename] = test;
1960 index++;
1961 });
1962 mainSource.writeln("main() {}");
1963 sourceFiles['main.dart'] = mainSource.toString();
1964
1965 asyncTest(() {
1966 Compiler compiler = compilerFor(sourceFiles,
1967 options: ['--analyze-all', '--analyze-only']);
1968 return compiler.run(Uri.parse('memory:main.dart')).then((_) {
1969 testMap.forEach((String filename, Test test) {
1970 LibraryElement library = compiler.libraryLoader.lookupLibrary(
1971 Uri.parse('memory:$filename'));
1972 var expectedVisits = test.expectedVisits;
1973 if (expectedVisits is! List) {
1974 expectedVisits = [expectedVisits];
1975 }
1976 AstElement element;
1977 String cls = test.cls;
1978 String method = test.method;
1979 if (cls == null) {
1980 element = library.find(method);
1981 } else {
1982 ClassElement classElement = library.find(cls);
1983 Expect.isNotNull(classElement,
1984 "Class '$cls' not found in:\n"
1985 "${library.compilationUnit.script.text}");
1986 element = classElement.localLookup(method);
1987 }
1988 Expect.isNotNull(element, "Element '$method' not found in:\n"
1989 "${library.compilationUnit.script.text}");
1990 ResolvedAst resolvedAst = element.resolvedAst;
1991 SemanticTestVisitor visitor =
1992 new SemanticTestVisitor(resolvedAst.elements);
1993 try {
1994 compiler.withCurrentElement(resolvedAst.element, () {
1995 //print(resolvedAst.node.toDebugString());
1996 resolvedAst.node.accept(visitor);
1997 });
1998 } catch (e, s) {
1999 Expect.fail("$e:\n$s\nIn test:\n"
2000 "${library.compilationUnit.script.text}");
2001 }
2002 Expect.listEquals(expectedVisits, visitor.visits,
2003 "In test:\n"
2004 "${library.compilationUnit.script.text}");
2005 });
2006 });
2007 });
2008 }
2009
2010
2011 class SemanticTestVisitor extends SemanticVisitor with SemanticSendVisitor {
2012 List<Visit> visits = <Visit>[];
2013
2014 SemanticTestVisitor(TreeElements elements) : super(elements);
2015
2016 apply(Node node, arg) => node.accept(this);
2017
2018 internalError(Spannable spannable, String message) {
2019 throw new SpannableAssertionFailure(spannable, message);
2020 }
2021
2022 SemanticSendVisitor get sendVisitor => this;
2023
2024 @override
2025 visitNode(Node node) {
2026 node.visitChildren(this);
2027 }
2028
2029 @override
2030 visitAs(Send node, Node expression, DartType type, arg) {
2031 visits.add(new Visit(VisitKind.VISIT_AS,
2032 expression: expression, type: type));
2033 apply(expression, arg);
2034 }
2035
2036 @override
2037 visitAssert(Send node, Node expression, arg) {
2038 visits.add(new Visit(VisitKind.VISIT_ASSERT, expression: expression));
2039 apply(expression, arg);
2040 }
2041
2042 @override
2043 errorInvalidAssert(Send node, NodeList arguments, arg) {
2044 // TODO: implement errorAssert
2045 }
2046
2047 @override
2048 visitBinary(Send node, Node left, BinaryOperator operator, Node right, arg) {
2049 visits.add(new Visit(VisitKind.VISIT_BINARY,
2050 left: left, operator: operator, right: right));
2051 apply(left, arg);
2052 apply(right, arg);
2053 }
2054
2055 @override
2056 visitClassTypeLiteralGet(Send node, TypeConstantExpression constant, arg) {
2057 visits.add(new Visit(VisitKind.VISIT_CLASS_TYPE_LITERAL_GET,
2058 constant: constant.getText()));
2059 }
2060
2061 @override
2062 visitClassTypeLiteralInvoke(Send node, TypeConstantExpression constant, NodeLi st arguments, Selector selector, arg) {
2063 visits.add(new Visit(VisitKind.VISIT_CLASS_TYPE_LITERAL_INVOKE,
2064 constant: constant.getText(), arguments: arguments));
2065 apply(arguments, arg);
2066 }
2067
2068 @override
2069 errorClassTypeLiteralSet(SendSet node, TypeConstantExpression constant, Node r hs, arg) {
2070 visits.add(new Visit(VisitKind.VISIT_CLASS_TYPE_LITERAL_INVOKE,
2071 constant: constant.getText(), rhs: rhs));
2072 apply(rhs, arg);
2073 }
2074
2075 @override
2076 visitNotEquals(Send node, Node left, Node right, arg) {
2077 visits.add(new Visit(VisitKind.VISIT_NOT_EQUALS,
2078 left: left, right: right));
2079 apply(left, arg);
2080 apply(right, arg);
2081 }
2082
2083 @override
2084 visitDynamicPropertyPrefix(Send node, Node receiver, IncDecOperator operator, Selector getterSelector, Selector setterSelector, arg) {
2085 visits.add(new Visit(VisitKind.VISIT_DYNAMIC_PROPERTY_PREFIX,
2086 receiver: receiver, operator: operator,
2087 getter: getterSelector, setter: setterSelector));
2088 apply(receiver, arg);
2089 }
2090
2091 @override
2092 visitDynamicPropertyPostfix(Send node, Node receiver, IncDecOperator operator, Selector getterSelector, Selector setterSelector, arg) {
2093 visits.add(new Visit(VisitKind.VISIT_DYNAMIC_PROPERTY_POSTFIX,
2094 receiver: receiver, operator: operator,
2095 getter: getterSelector, setter: setterSelector));
2096 apply(receiver, arg);
2097 }
2098
2099 @override
2100 visitDynamicPropertyGet(Send node, Node receiver, Selector selector, arg) {
2101 visits.add(new Visit(VisitKind.VISIT_DYNAMIC_PROPERTY_GET,
2102 receiver: receiver, name: selector.name));
2103 }
2104
2105 @override
2106 visitDynamicPropertyInvoke(Send node, Node receiver, NodeList arguments, Selec tor selector, arg) {
2107 visits.add(new Visit(VisitKind.VISIT_DYNAMIC_PROPERTY_INVOKE,
2108 receiver: receiver, name: selector.name, arguments: arguments));
2109 apply(arguments, arg);
2110 }
2111
2112 @override
2113 visitDynamicPropertySet(SendSet node, Node receiver, Selector selector, Node r hs, arg) {
2114 visits.add(new Visit(VisitKind.VISIT_DYNAMIC_PROPERTY_SET,
2115 receiver: receiver, name: selector.name, rhs: rhs));
2116 }
2117
2118 @override
2119 visitDynamicTypeLiteralGet(Send node, TypeConstantExpression constant, arg) {
2120 visits.add(new Visit(VisitKind.VISIT_DYNAMIC_TYPE_LITERAL_GET,
2121 constant: constant.getText()));
2122 }
2123
2124 @override
2125 visitDynamicTypeLiteralInvoke(Send node, TypeConstantExpression constant, Node List arguments, Selector selector, arg) {
2126 visits.add(new Visit(VisitKind.VISIT_DYNAMIC_TYPE_LITERAL_INVOKE,
2127 constant: constant.getText(), arguments: arguments));
2128 }
2129
2130 @override
2131 errorDynamicTypeLiteralSet(Send node, TypeConstantExpression constant, Node rh s, arg) {
2132 visits.add(new Visit(VisitKind.VISIT_DYNAMIC_TYPE_LITERAL_SET,
2133 rhs: rhs));
2134 apply(rhs, arg);
2135 }
2136
2137 @override
2138 visitExpressionInvoke(Send node, Node expression, NodeList arguments, Selector selector, arg) {
2139 visits.add(new Visit(VisitKind.VISIT_EXPRESSION_INVOKE,
2140 receiver: expression, arguments: arguments));
2141 }
2142
2143 @override
2144 visitIs(Send node, Node expression, DartType type, arg) {
2145 visits.add(new Visit(VisitKind.VISIT_IS,
2146 expression: expression, type: type));
2147 apply(expression, arg);
2148 }
2149
2150 @override
2151 visitIsNot(Send node, Node expression, DartType type, arg) {
2152 visits.add(new Visit(VisitKind.VISIT_IS_NOT,
2153 expression: expression, type: type));
2154 apply(expression, arg);
2155 }
2156
2157 @override
2158 visitLogicalAnd(Send node, Node left, Node right, arg) {
2159 visits.add(new Visit(VisitKind.VISIT_LOGICAL_AND,
2160 left: left, right: right));
2161 apply(left, arg);
2162 apply(right, arg);
2163 }
2164
2165 @override
2166 visitLogicalOr(Send node, Node left, Node right, arg) {
2167 visits.add(new Visit(VisitKind.VISIT_LOGICAL_OR,
2168 left: left, right: right));
2169 apply(left, arg);
2170 apply(right, arg);
2171 }
2172
2173 @override
2174 visitLocalFunctionGet(Send node, LocalFunctionElement function, arg) {
2175 visits.add(new Visit(VisitKind.VISIT_LOCAL_FUNCTION_GET, element: function)) ;
2176 }
2177
2178 @override
2179 visitLocalFunctionInvoke(Send node, LocalFunctionElement function, NodeList ar guments, Selector selector, arg) {
2180 visits.add(new Visit(VisitKind.VISIT_LOCAL_FUNCTION_INVOKE,
2181 element: function, arguments: arguments));
2182 apply(arguments, arg);
2183 }
2184
2185 @override
2186 visitLocalVariableGet(Send node, LocalVariableElement variable, arg) {
2187 visits.add(new Visit(VisitKind.VISIT_LOCAL_VARIABLE_GET, element: variable)) ;
2188 }
2189
2190 @override
2191 visitLocalVariableInvoke(Send node, LocalVariableElement variable, NodeList ar guments, Selector selector, arg) {
2192 visits.add(new Visit(VisitKind.VISIT_LOCAL_VARIABLE_INVOKE,
2193 element: variable, arguments: arguments));
2194 apply(arguments, arg);
2195 }
2196
2197 @override
2198 visitLocalVariableSet(SendSet node, LocalVariableElement variable, Node rhs, a rg) {
2199 visits.add(new Visit(VisitKind.VISIT_LOCAL_VARIABLE_SET,
2200 element: variable, rhs: rhs));
2201 apply(rhs, arg);
2202 }
2203
2204 @override
2205 visitParameterGet(Send node, ParameterElement parameter, arg) {
2206 visits.add(new Visit(VisitKind.VISIT_PARAMETER_GET, element: parameter));
2207 }
2208
2209 @override
2210 visitParameterInvoke(Send node, ParameterElement parameter, NodeList arguments , Selector selector, arg) {
2211 visits.add(new Visit(VisitKind.VISIT_PARAMETER_INVOKE,
2212 element: parameter, arguments: arguments));
2213 apply(arguments, arg);
2214 }
2215
2216 @override
2217 visitParameterSet(SendSet node, ParameterElement parameter, Node rhs, arg) {
2218 visits.add(new Visit(VisitKind.VISIT_PARAMETER_SET, element: parameter, rhs: rhs));
2219 apply(rhs, arg);
2220 }
2221
2222 @override
2223 visitStaticFieldGet(Send node, FieldElement field, arg) {
2224 visits.add(new Visit(VisitKind.VISIT_STATIC_FIELD_GET, element: field));
2225 }
2226
2227 @override
2228 visitStaticFieldInvoke(Send node, FieldElement field, NodeList arguments, Sele ctor selector, arg) {
2229 visits.add(new Visit(VisitKind.VISIT_STATIC_FIELD_INVOKE,
2230 element: field, arguments: arguments));
2231 apply(arguments, arg);
2232 }
2233
2234 @override
2235 visitStaticFieldSet(SendSet node, FieldElement field, Node rhs, arg) {
2236 visits.add(new Visit(VisitKind.VISIT_STATIC_FIELD_SET,
2237 element: field, rhs: rhs));
2238 apply(rhs, arg);
2239 }
2240
2241 @override
2242 visitStaticFunctionGet(Send node, MethodElement function, arg) {
2243 visits.add(new Visit(VisitKind.VISIT_STATIC_FUNCTION_GET,
2244 element: function));
2245 }
2246
2247 @override
2248 visitStaticFunctionInvoke(Send node, MethodElement function, NodeList argument s, Selector selector, arg) {
2249 visits.add(new Visit(VisitKind.VISIT_STATIC_FUNCTION_INVOKE,
2250 element: function, arguments: arguments));
2251 apply(arguments, arg);
2252 }
2253
2254 @override
2255 visitStaticGetterGet(Send node, FunctionElement getter, arg) {
2256 visits.add(new Visit(VisitKind.VISIT_STATIC_GETTER_GET,
2257 element: getter));
2258 }
2259
2260 @override
2261 visitStaticGetterInvoke(Send node, FunctionElement getter, NodeList arguments, Selector selector, arg) {
2262 visits.add(new Visit(VisitKind.VISIT_STATIC_GETTER_INVOKE,
2263 element: getter, arguments: arguments));
2264 apply(arguments, arg);
2265 }
2266
2267 @override
2268 visitStaticSetterSet(SendSet node, FunctionElement setter, Node rhs, arg) {
2269 visits.add(new Visit(VisitKind.VISIT_STATIC_SETTER_SET,
2270 element: setter, rhs: rhs));
2271 apply(rhs, arg);
2272 }
2273
2274 @override
2275 visitSuperBinary(Send node, FunctionElement function, BinaryOperator operator, Node argument, arg) {
2276 visits.add(new Visit(VisitKind.VISIT_SUPER_BINARY,
2277 element: function, operator: operator, right: argument));
2278 apply(argument, arg);
2279 }
2280
2281 @override
2282 visitSuperNotEquals(Send node, FunctionElement function, Node argument, arg) {
2283 visits.add(new Visit(VisitKind.VISIT_SUPER_NOT_EQUALS,
2284 element: function, right: argument));
2285 apply(argument, arg);
2286 }
2287
2288 @override
2289 visitThisGet(Identifier node, arg) {
2290 visits.add(new Visit(VisitKind.VISIT_THIS_GET));
2291 }
2292
2293 @override
2294 visitThisInvoke(Send node, NodeList arguments, Selector selector, arg) {
2295 visits.add(new Visit(VisitKind.VISIT_THIS_INVOKE, arguments: arguments));
2296 apply(arguments, arg);
2297 }
2298
2299 @override
2300 visitThisPropertyGet(Send node, Selector selector, arg) {
2301 visits.add(new Visit(VisitKind.VISIT_THIS_PROPERTY_GET,
2302 name: selector.name));
2303 }
2304
2305 @override
2306 visitThisPropertyInvoke(Send node, NodeList arguments, Selector selector, arg) {
2307 visits.add(new Visit(VisitKind.VISIT_THIS_PROPERTY_INVOKE,
2308 name: selector.name, arguments: arguments));
2309 apply(arguments, arg);
2310 }
2311
2312 @override
2313 visitThisPropertySet(SendSet node, Selector selector, Node rhs, arg) {
2314 visits.add(new Visit(VisitKind.VISIT_THIS_PROPERTY_SET,
2315 name: selector.name, rhs: rhs));
2316 apply(rhs, arg);
2317 }
2318
2319 @override
2320 visitTopLevelFieldGet(Send node, FieldElement field, arg) {
2321 visits.add(new Visit(VisitKind.VISIT_TOP_LEVEL_FIELD_GET, element: field));
2322 }
2323
2324 @override
2325 visitTopLevelFieldInvoke(Send node, FieldElement field, NodeList arguments, Se lector selector, arg) {
2326 visits.add(new Visit(VisitKind.VISIT_TOP_LEVEL_FIELD_INVOKE,
2327 element: field, arguments: arguments));
2328 apply(arguments, arg);
2329 }
2330
2331 @override
2332 visitTopLevelFieldSet(SendSet node, FieldElement field, Node rhs, arg) {
2333 visits.add(new Visit(VisitKind.VISIT_TOP_LEVEL_FIELD_SET,
2334 element: field, rhs: rhs));
2335 apply(rhs, arg);
2336 }
2337
2338 @override
2339 visitTopLevelFunctionGet(Send node, MethodElement function, arg) {
2340 visits.add(new Visit(VisitKind.VISIT_TOP_LEVEL_FUNCTION_GET,
2341 element: function));
2342 }
2343
2344 @override
2345 visitTopLevelFunctionInvoke(Send node, MethodElement function, NodeList argume nts, Selector selector, arg) {
2346 visits.add(new Visit(VisitKind.VISIT_TOP_LEVEL_FUNCTION_INVOKE,
2347 element: function, arguments: arguments));
2348 apply(arguments, arg);
2349 }
2350
2351 @override
2352 visitTopLevelGetterGet(Send node, FunctionElement getter, arg) {
2353 visits.add(new Visit(VisitKind.VISIT_TOP_LEVEL_GETTER_GET,
2354 element: getter));
2355 }
2356
2357 @override
2358 visitTopLevelGetterInvoke(Send node, FunctionElement getter, NodeList argument s, Selector selector, arg) {
2359 visits.add(new Visit(VisitKind.VISIT_TOP_LEVEL_GETTER_INVOKE,
2360 element: getter, arguments: arguments));
2361 apply(arguments, arg);
2362 }
2363
2364 @override
2365 visitTopLevelSetterSet(SendSet node, FunctionElement setter, Node rhs, arg) {
2366 visits.add(new Visit(VisitKind.VISIT_TOP_LEVEL_SETTER_SET,
2367 element: setter, rhs: rhs));
2368 apply(rhs, arg);
2369 }
2370
2371 @override
2372 visitTypeVariableTypeLiteralGet(Send node, TypeVariableElement element, arg) {
2373 visits.add(new Visit(VisitKind.VISIT_TYPE_VARIABLE_TYPE_LITERAL_GET,
2374 element: element));
2375 }
2376
2377 @override
2378 visitTypeVariableTypeLiteralInvoke(Send node, TypeVariableElement element, Nod eList arguments, Selector selector, arg) {
2379 visits.add(new Visit(VisitKind.VISIT_TYPE_VARIABLE_TYPE_LITERAL_INVOKE,
2380 element: element, arguments: arguments));
2381 apply(arguments, arg);
2382 }
2383
2384 @override
2385 errorTypeVariableTypeLiteralSet(SendSet node, TypeVariableElement element, Nod e rhs, arg) {
2386 visits.add(new Visit(VisitKind.VISIT_TYPE_VARIABLE_TYPE_LITERAL_SET,
2387 element: element, rhs: rhs));
2388 apply(rhs, arg);
2389 }
2390
2391 @override
2392 visitTypedefTypeLiteralGet(Send node, TypeConstantExpression constant, arg) {
2393 visits.add(new Visit(VisitKind.VISIT_TYPEDEF_TYPE_LITERAL_GET,
2394 constant: constant.getText()));
2395 }
2396
2397 @override
2398 visitTypedefTypeLiteralInvoke(Send node, TypeConstantExpression constant, Node List arguments, Selector selector, arg) {
2399 visits.add(new Visit(VisitKind.VISIT_TYPEDEF_TYPE_LITERAL_INVOKE,
2400 constant: constant.getText(), arguments: arguments));
2401 apply(arguments, arg);
2402 }
2403
2404 @override
2405 errorTypedefTypeLiteralSet(SendSet node, TypeConstantExpression constant, Node rhs, arg) {
2406 visits.add(new Visit(VisitKind.VISIT_TYPEDEF_TYPE_LITERAL_SET,
2407 constant: constant.getText(), rhs: rhs));
2408 apply(rhs, arg);
2409 }
2410
2411 @override
2412 visitUnary(Send node, UnaryOperator operator, Node expression, arg) {
2413 visits.add(new Visit(VisitKind.VISIT_UNARY,
2414 expression: expression, operator: operator));
2415 apply(expression, arg);
2416 }
2417
2418 @override
2419 visitNot(Send node, Node expression, arg) {
2420 visits.add(new Visit(VisitKind.VISIT_NOT, expression: expression));
2421 apply(expression, arg);
2422 }
2423
2424 @override
2425 visitSuperFieldGet(Send node, FieldElement field, arg) {
2426 visits.add(new Visit(VisitKind.VISIT_SUPER_FIELD_GET, element: field));
2427 }
2428
2429 @override
2430 visitSuperFieldInvoke(Send node, FieldElement field, NodeList arguments, Selec tor selector, arg) {
2431 visits.add(new Visit(VisitKind.VISIT_SUPER_FIELD_INVOKE,
2432 element: field, arguments: arguments));
2433 apply(arguments, arg);
2434 }
2435
2436 @override
2437 visitSuperFieldSet(SendSet node, FieldElement field, Node rhs, arg) {
2438 visits.add(new Visit(VisitKind.VISIT_SUPER_FIELD_SET,
2439 element: field, rhs: rhs));
2440 apply(rhs, arg);
2441 }
2442
2443 @override
2444 visitSuperMethodGet(Send node, MethodElement method, arg) {
2445 visits.add(new Visit(VisitKind.VISIT_SUPER_METHOD_GET, element: method));
2446 }
2447
2448 @override
2449 visitSuperMethodInvoke(Send node, MethodElement method, NodeList arguments, Se lector selector, arg) {
2450 visits.add(new Visit(VisitKind.VISIT_SUPER_METHOD_INVOKE,
2451 element: method, arguments: arguments));
2452 apply(arguments, arg);
2453 }
2454
2455 @override
2456 visitSuperGetterGet(Send node, FunctionElement getter, arg) {
2457 visits.add(new Visit(VisitKind.VISIT_SUPER_GETTER_GET, element: getter));
2458 }
2459
2460 @override
2461 visitSuperGetterInvoke(Send node, FunctionElement getter, NodeList arguments, Selector selector, arg) {
2462 visits.add(new Visit(VisitKind.VISIT_SUPER_GETTER_INVOKE,
2463 element: getter, arguments: arguments));
2464 apply(arguments, arg);
2465 }
2466
2467 @override
2468 visitSuperSetterSet(SendSet node, FunctionElement setter, Node rhs, arg) {
2469 visits.add(new Visit(VisitKind.VISIT_SUPER_SETTER_SET,
2470 element: setter, rhs: rhs));
2471 apply(rhs, arg);
2472 }
2473
2474 @override
2475 visitSuperUnary(Send node, UnaryOperator operator, FunctionElement function, a rg) {
2476 visits.add(new Visit(VisitKind.VISIT_SUPER_UNARY,
2477 element: function, operator: operator));
2478 }
2479
2480 @override
2481 visitEquals(Send node, Node left, Node right, arg) {
2482 visits.add(new Visit(VisitKind.VISIT_EQUALS, left: left, right: right));
2483 apply(left, arg);
2484 apply(right, arg);
2485 }
2486
2487 @override
2488 visitSuperEquals(Send node, FunctionElement function, Node argument, arg) {
2489 visits.add(new Visit(VisitKind.VISIT_SUPER_EQUALS,
2490 element: function, right: argument));
2491 apply(argument, arg);
2492 }
2493
2494 @override
2495 visitIndexSet(Send node, Node receiver, Node index, Node rhs, arg) {
2496 visits.add(new Visit(VisitKind.VISIT_INDEX_SET,
2497 receiver: receiver, index: index, rhs: rhs));
2498 apply(receiver, arg);
2499 apply(index, arg);
2500 apply(rhs, arg);
2501 }
2502
2503 @override
2504 visitSuperIndexSet(Send node, FunctionElement function, Node index, Node rhs, arg) {
2505 visits.add(new Visit(VisitKind.VISIT_SUPER_INDEX_SET,
2506 element: function, index: index, rhs: rhs));
2507 apply(index, arg);
2508 apply(rhs, arg);
2509 }
2510
2511 @override
2512 errorFinalLocalVariableSet(SendSet node, LocalVariableElement variable, Node r hs, arg) {
2513 // TODO: implement errorFinalLocalVariableSet
2514 }
2515
2516 @override
2517 errorFinalParameterSet(SendSet node, ParameterElement parameter, Node rhs, arg ) {
2518 // TODO: implement errorFinalParameterSet
2519 }
2520
2521 @override
2522 errorFinalStaticFieldSet(SendSet node, FieldElement field, Node rhs, arg) {
2523 // TODO: implement errorFinalStaticFieldSet
2524 }
2525
2526 @override
2527 errorFinalSuperFieldSet(SendSet node, FieldElement field, Node rhs, arg) {
2528 // TODO: implement errorFinalSuperFieldSet
2529 }
2530
2531 @override
2532 errorFinalTopLevelFieldSet(SendSet node, FieldElement field, Node rhs, arg) {
2533 // TODO: implement errorFinalTopLevelFieldSet
2534 }
2535
2536 @override
2537 errorLocalFunctionSet(SendSet node, LocalFunctionElement function, Node rhs, a rg) {
2538 // TODO: implement errorLocalFunctionSet
2539 }
2540
2541 @override
2542 errorStaticFunctionSet(Send node, MethodElement function, Node rhs, arg) {
2543 // TODO: implement errorStaticFunctionSet
2544 }
2545
2546 @override
2547 errorStaticGetterSet(SendSet node, FunctionElement getter, Node rhs, arg) {
2548 // TODO: implement errorStaticGetterSet
2549 }
2550
2551 @override
2552 errorStaticSetterGet(Send node, FunctionElement setter, arg) {
2553 // TODO: implement errorStaticSetterGet
2554 }
2555
2556 @override
2557 errorStaticSetterInvoke(Send node, FunctionElement setter, NodeList arguments, Selector selector, arg) {
2558 // TODO: implement errorStaticSetterInvoke
2559 }
2560
2561 @override
2562 errorSuperGetterSet(SendSet node, FunctionElement getter, Node rhs, arg) {
2563 // TODO: implement errorSuperGetterSet
2564 }
2565
2566 @override
2567 errorSuperMethodSet(Send node, MethodElement method, Node rhs, arg) {
2568 // TODO: implement errorSuperMethodSet
2569 }
2570
2571 @override
2572 errorSuperSetterGet(Send node, FunctionElement setter, arg) {
2573 // TODO: implement errorSuperSetterGet
2574 }
2575
2576 @override
2577 errorSuperSetterInvoke(Send node, FunctionElement setter, NodeList arguments, Selector selector, arg) {
2578 // TODO: implement errorSuperSetterInvoke
2579 }
2580
2581 @override
2582 errorTopLevelFunctionSet(Send node, MethodElement function, Node rhs, arg) {
2583 // TODO: implement errorTopLevelFunctionSet
2584 }
2585
2586 @override
2587 errorTopLevelGetterSet(SendSet node, FunctionElement getter, Node rhs, arg) {
2588 // TODO: implement errorTopLevelGetterSet
2589 }
2590
2591 @override
2592 errorTopLevelSetterGet(Send node, FunctionElement setter, arg) {
2593 // TODO: implement errorTopLevelSetterGet
2594 }
2595
2596 @override
2597 errorTopLevelSetterInvoke(Send node, FunctionElement setter, NodeList argument s, Selector selector, arg) {
2598 // TODO: implement errorTopLevelSetterInvoke
2599 }
2600
2601 @override
2602 visitDynamicPropertyCompound(Send node, Node receiver, AssignmentOperator oper ator, Node rhs, Selector getterSelector, Selector setterSelector, arg) {
2603 visits.add(new Visit(VisitKind.VISIT_DYNAMIC_PROPERTY_COMPOUND,
2604 receiver: receiver, operator: operator, rhs: rhs,
2605 getter: getterSelector, setter: setterSelector));
2606 apply(receiver, arg);
2607 apply(rhs, arg);
2608 }
2609
2610 @override
2611 errorFinalLocalVariableCompound(Send node, LocalVariableElement variable, Assi gnmentOperator operator, Node rhs, arg) {
2612 // TODO: implement errorFinalLocalVariableCompound
2613 }
2614
2615 @override
2616 errorFinalParameterCompound(Send node, ParameterElement parameter, AssignmentO perator operator, Node rhs, arg) {
2617 // TODO: implement errorFinalParameterCompound
2618 }
2619
2620 @override
2621 errorFinalStaticFieldCompound(Send node, FieldElement field, AssignmentOperato r operator, Node rhs, arg) {
2622 // TODO: implement errorFinalStaticFieldCompound
2623 }
2624
2625 @override
2626 errorFinalSuperFieldCompound(Send node, FieldElement field, AssignmentOperator operator, Node rhs, arg) {
2627 // TODO: implement errorFinalSuperFieldCompound
2628 }
2629
2630 @override
2631 errorFinalTopLevelFieldCompound(Send node, FieldElement field, AssignmentOpera tor operator, Node rhs, arg) {
2632 // TODO: implement errorFinalTopLevelFieldCompound
2633 }
2634
2635 @override
2636 errorLocalFunctionCompound(Send node, LocalFunctionElement function, Assignmen tOperator operator, Node rhs, arg) {
2637 // TODO: implement errorLocalFunctionCompound
2638 }
2639
2640 @override
2641 visitLocalVariableCompound(Send node, LocalVariableElement variable, Assignmen tOperator operator, Node rhs, arg) {
2642 visits.add(new Visit(VisitKind.VISIT_LOCAL_VARIABLE_COMPOUND,
2643 element: variable, operator: operator, rhs: rhs));
2644 apply(rhs, arg);
2645 }
2646
2647 @override
2648 visitParameterCompound(Send node, ParameterElement parameter, AssignmentOperat or operator, Node rhs, arg) {
2649 visits.add(new Visit(VisitKind.VISIT_PARAMETER_COMPOUND,
2650 element: parameter, operator: operator, rhs: rhs));
2651 apply(rhs, arg);
2652 }
2653
2654 @override
2655 visitStaticFieldCompound(Send node, FieldElement field, AssignmentOperator ope rator, Node rhs, arg) {
2656 visits.add(new Visit(VisitKind.VISIT_STATIC_FIELD_COMPOUND,
2657 element: field, operator: operator, rhs: rhs));
2658 apply(rhs, arg);
2659 }
2660
2661 @override
2662 visitStaticGetterSetterCompound(Send node, FunctionElement getter, FunctionEle ment setter, AssignmentOperator operator, Node rhs, arg) {
2663 visits.add(new Visit(VisitKind.VISIT_STATIC_GETTER_SETTER_COMPOUND,
2664 operator: operator, rhs: rhs,
2665 getter: getter, setter: setter));
2666 apply(rhs, arg);
2667 }
2668
2669 @override
2670 visitSuperFieldCompound(Send node, FieldElement field, AssignmentOperator oper ator, Node rhs, arg) {
2671 visits.add(new Visit(VisitKind.VISIT_SUPER_FIELD_COMPOUND,
2672 element: field, operator: operator, rhs: rhs));
2673 apply(rhs, arg);
2674 }
2675
2676 @override
2677 visitSuperGetterSetterCompound(Send node, FunctionElement getter, FunctionElem ent setter, AssignmentOperator operator, Node rhs, arg) {
2678 visits.add(new Visit(VisitKind.VISIT_SUPER_GETTER_SETTER_COMPOUND,
2679 operator: operator, rhs: rhs,
2680 getter: getter, setter: setter));
2681 apply(rhs, arg);
2682 }
2683
2684 @override
2685 visitThisPropertyCompound(Send node, AssignmentOperator operator, Node rhs, Se lector getterSelector, Selector setterSelector, arg) {
2686 visits.add(new Visit(VisitKind.VISIT_THIS_PROPERTY_COMPOUND,
2687 operator: operator, rhs: rhs,
2688 getter: getterSelector, setter: setterSelector));
2689 apply(rhs, arg);
2690 }
2691
2692 @override
2693 visitTopLevelFieldCompound(Send node, FieldElement field, AssignmentOperator o perator, Node rhs, arg) {
2694 visits.add(new Visit(VisitKind.VISIT_TOP_LEVEL_FIELD_COMPOUND,
2695 element: field, operator: operator, rhs: rhs));
2696 apply(rhs, arg);
2697 }
2698
2699 @override
2700 visitTopLevelGetterSetterCompound(Send node, FunctionElement getter, FunctionE lement setter, AssignmentOperator operator, Node rhs, arg) {
2701 visits.add(new Visit(VisitKind.VISIT_TOP_LEVEL_GETTER_SETTER_COMPOUND,
2702 operator: operator, rhs: rhs,
2703 getter: getter, setter: setter));
2704 apply(rhs, arg);
2705 }
2706
2707 @override
2708 visitStaticMethodSetterCompound(Send node, FunctionElement method, FunctionEle ment setter, AssignmentOperator operator, Node rhs, arg) {
2709 visits.add(new Visit(VisitKind.VISIT_STATIC_METHOD_SETTER_COMPOUND,
2710 operator: operator, rhs: rhs,
2711 getter: method, setter: setter));
2712 apply(rhs, arg);
2713 }
2714
2715 @override
2716 visitSuperFieldSetterCompound(Send node, FieldElement field, FunctionElement s etter, AssignmentOperator operator, Node rhs, arg) {
2717 visits.add(new Visit(VisitKind.VISIT_SUPER_FIELD_SETTER_COMPOUND,
2718 operator: operator, rhs: rhs,
2719 getter: field, setter: setter));
2720 apply(rhs, arg);
2721 }
2722
2723 @override
2724 visitSuperGetterFieldCompound(Send node, FunctionElement getter, FieldElement field, AssignmentOperator operator, Node rhs, arg) {
2725 visits.add(new Visit(VisitKind.VISIT_SUPER_GETTER_FIELD_COMPOUND,
2726 operator: operator, rhs: rhs,
2727 getter: getter, setter: field));
2728 apply(rhs, arg);
2729 }
2730
2731 @override
2732 visitSuperMethodSetterCompound(Send node, FunctionElement method, FunctionElem ent setter, AssignmentOperator operator, Node rhs, arg) {
2733 // TODO: implement visitSuperMethodSetterCompound
2734 }
2735
2736 @override
2737 visitTopLevelMethodSetterCompound(Send node, FunctionElement method, FunctionE lement setter, AssignmentOperator operator, Node rhs, arg) {
2738 // TODO: implement visitTopLevelMethodSetterCompound
2739 }
2740
2741 @override
2742 visitCompoundIndexSet(Send node, Node receiver, Node index, AssignmentOperator operator, Node rhs, arg) {
2743 visits.add(new Visit(VisitKind.VISIT_COMPOUND_INDEX_SET,
2744 receiver: receiver, index: index, rhs: rhs, operator: operator));
2745 apply(receiver, arg);
2746 apply(index, arg);
2747 apply(rhs, arg);
2748 }
2749
2750 @override
2751 visitSuperCompoundIndexSet(Send node, FunctionElement getter, FunctionElement setter, Node index, AssignmentOperator operator, Node rhs, arg) {
2752 visits.add(new Visit(VisitKind.VISIT_SUPER_COMPOUND_INDEX_SET,
2753 getter: getter, setter: setter,
2754 index: index, rhs: rhs, operator: operator));
2755 apply(index, arg);
2756 apply(rhs, arg);
2757 }
2758
2759 @override
2760 visitClassTypeLiteralCompound(Send node, TypeConstantExpression constant, Assi gnmentOperator operator, Node rhs, arg) {
2761 visits.add(new Visit(VisitKind.VISIT_CLASS_TYPE_LITERAL_COMPOUND,
2762 constant: constant.getText(), operator: operator, rhs: rhs));
2763 apply(rhs, arg);
2764 }
2765
2766 @override
2767 visitDynamicTypeLiteralCompound(Send node, TypeConstantExpression constant, As signmentOperator operator, Node rhs, arg) {
2768 visits.add(new Visit(VisitKind.VISIT_DYNAMIC_TYPE_LITERAL_COMPOUND,
2769 constant: constant.getText(), operator: operator, rhs: rhs));
2770 apply(rhs, arg);
2771 }
2772
2773 @override
2774 visitTypeVariableTypeLiteralCompound(Send node, TypeVariableElement element, A ssignmentOperator operator, Node rhs, arg) {
2775 visits.add(new Visit(VisitKind.VISIT_TYPE_VARIABLE_TYPE_LITERAL_COMPOUND,
2776 element: element, operator: operator, rhs: rhs));
2777 apply(rhs, arg);
2778 }
2779
2780 @override
2781 visitTypedefTypeLiteralCompound(Send node, TypeConstantExpression constant, As signmentOperator operator, Node rhs, arg) {
2782 visits.add(new Visit(VisitKind.VISIT_TYPEDEF_TYPE_LITERAL_COMPOUND,
2783 constant: constant.getText(), operator: operator, rhs: rhs));
2784 apply(rhs, arg);
2785 }
2786
2787 @override
2788 errorLocalFunctionPrefix(Send node, LocalFunctionElement function, IncDecOpera tor operator, arg) {
2789 // TODO: implement errorLocalFunctionPrefix
2790 }
2791
2792 @override
2793 visitClassTypeLiteralPrefix(Send node, TypeConstantExpression constant, IncDec Operator operator, arg) {
2794 visits.add(new Visit(VisitKind.VISIT_CLASS_TYPE_LITERAL_PREFIX,
2795 constant: constant.getText(), operator: operator));
2796 }
2797
2798 @override
2799 visitDynamicTypeLiteralPrefix(Send node, TypeConstantExpression constant, IncD ecOperator operator, arg) {
2800 visits.add(new Visit(VisitKind.VISIT_DYNAMIC_TYPE_LITERAL_PREFIX,
2801 constant: constant.getText(), operator: operator));
2802 }
2803
2804 @override
2805 visitLocalVariablePrefix(Send node, LocalVariableElement variable, IncDecOpera tor operator, arg) {
2806 visits.add(new Visit(VisitKind.VISIT_LOCAL_VARIABLE_PREFIX,
2807 element: variable, operator: operator));
2808 }
2809
2810 @override
2811 visitParameterPrefix(Send node, ParameterElement parameter, IncDecOperator ope rator, arg) {
2812 visits.add(new Visit(VisitKind.VISIT_PARAMETER_PREFIX,
2813 element: parameter, operator: operator));
2814 }
2815
2816 @override
2817 visitStaticFieldPrefix(Send node, FieldElement field, IncDecOperator operator, arg) {
2818 visits.add(new Visit(VisitKind.VISIT_STATIC_FIELD_PREFIX,
2819 element: field, operator: operator));
2820 }
2821
2822 @override
2823 visitStaticGetterSetterPrefix(Send node, FunctionElement getter, FunctionEleme nt setter, IncDecOperator operator, arg) {
2824 visits.add(new Visit(VisitKind.VISIT_STATIC_GETTER_SETTER_PREFIX,
2825 getter: getter, setter: setter, operator: operator));
2826 }
2827
2828 @override
2829 visitStaticMethodSetterPrefix(Send node, FunctionElement getter, FunctionEleme nt setter, IncDecOperator operator, arg) {
2830 // TODO: implement visitStaticMethodSetterPrefix
2831 }
2832
2833 @override
2834 visitSuperFieldFieldPrefix(Send node, FieldElement readField, FieldElement wri ttenField, IncDecOperator operator, arg) {
2835 // TODO: implement visitSuperFieldFieldPrefix
2836 }
2837
2838 @override
2839 visitSuperFieldPrefix(Send node, FieldElement field, IncDecOperator operator, arg) {
2840 visits.add(new Visit(VisitKind.VISIT_SUPER_FIELD_PREFIX,
2841 element: field, operator: operator));
2842 }
2843
2844 @override
2845 visitSuperFieldSetterPrefix(Send node, FieldElement field, FunctionElement set ter, IncDecOperator operator, arg) {
2846 visits.add(new Visit(VisitKind.VISIT_SUPER_FIELD_SETTER_PREFIX,
2847 getter: field, setter: setter, operator: operator));
2848 }
2849
2850 @override
2851 visitSuperGetterFieldPrefix(Send node, FunctionElement getter, FieldElement fi eld, IncDecOperator operator, arg) {
2852 visits.add(new Visit(VisitKind.VISIT_SUPER_GETTER_FIELD_PREFIX,
2853 getter: getter, setter: field, operator: operator));
2854 }
2855
2856 @override
2857 visitSuperGetterSetterPrefix(Send node, FunctionElement getter, FunctionElemen t setter, IncDecOperator operator, arg) {
2858 visits.add(new Visit(VisitKind.VISIT_SUPER_GETTER_SETTER_PREFIX,
2859 getter: getter, setter: setter, operator: operator));
2860 }
2861
2862 @override
2863 visitSuperMethodSetterPrefix(Send node, FunctionElement method, FunctionElemen t setter, IncDecOperator operator, arg) {
2864 // TODO: implement visitSuperMethodSetterPrefix
2865 }
2866
2867 @override
2868 visitThisPropertyPrefix(Send node, IncDecOperator operator, Selector getterSel ector, Selector setterSelector, arg) {
2869 visits.add(new Visit(VisitKind.VISIT_THIS_PROPERTY_PREFIX,
2870 operator: operator,
2871 getter: getterSelector, setter: setterSelector));
2872 }
2873
2874 @override
2875 visitTopLevelFieldPrefix(Send node, FieldElement field, IncDecOperator operato r, arg) {
2876 visits.add(new Visit(VisitKind.VISIT_TOP_LEVEL_FIELD_PREFIX,
2877 element: field, operator: operator));
2878 }
2879
2880 @override
2881 visitTopLevelGetterSetterPrefix(Send node, FunctionElement getter, FunctionEle ment setter, IncDecOperator operator, arg) {
2882 visits.add(new Visit(VisitKind.VISIT_TOP_LEVEL_GETTER_SETTER_PREFIX,
2883 getter: getter, setter: setter, operator: operator));
2884 }
2885
2886 @override
2887 visitTopLevelMethodSetterPrefix(Send node, FunctionElement method, FunctionEle ment setter, IncDecOperator operator, arg) {
2888 // TODO: implement visitTopLevelMethodSetterPrefix
2889 }
2890
2891 @override
2892 visitTypeVariableTypeLiteralPrefix(Send node, TypeVariableElement element, Inc DecOperator operator, arg) {
2893 visits.add(new Visit(VisitKind.VISIT_TYPE_VARIABLE_TYPE_LITERAL_PREFIX,
2894 element: element, operator: operator));
2895 }
2896
2897 @override
2898 visitTypedefTypeLiteralPrefix(Send node, TypeConstantExpression constant, IncD ecOperator operator, arg) {
2899 visits.add(new Visit(VisitKind.VISIT_TYPEDEF_TYPE_LITERAL_PREFIX,
2900 constant: constant.getText(), operator: operator));
2901 }
2902
2903 @override
2904 errorLocalFunctionPostfix(Send node, LocalFunctionElement function, IncDecOper ator operator, arg) {
2905 // TODO: implement errorLocalFunctionPostfix
2906 }
2907
2908 @override
2909 visitClassTypeLiteralPostfix(Send node, TypeConstantExpression constant, IncDe cOperator operator, arg) {
2910 visits.add(new Visit(VisitKind.VISIT_CLASS_TYPE_LITERAL_POSTFIX,
2911 constant: constant.getText(), operator: operator));
2912 }
2913
2914 @override
2915 visitDynamicTypeLiteralPostfix(Send node, TypeConstantExpression constant, Inc DecOperator operator, arg) {
2916 visits.add(new Visit(VisitKind.VISIT_DYNAMIC_TYPE_LITERAL_POSTFIX,
2917 constant: constant.getText(), operator: operator));
2918 }
2919
2920 @override
2921 visitLocalVariablePostfix(Send node, LocalVariableElement variable, IncDecOper ator operator, arg) {
2922 visits.add(new Visit(VisitKind.VISIT_LOCAL_VARIABLE_POSTFIX,
2923 element: variable, operator: operator));
2924 }
2925
2926 @override
2927 visitParameterPostfix(Send node, ParameterElement parameter, IncDecOperator op erator, arg) {
2928 visits.add(new Visit(VisitKind.VISIT_PARAMETER_POSTFIX,
2929 element: parameter, operator: operator));
2930 }
2931
2932 @override
2933 visitStaticFieldPostfix(Send node, FieldElement field, IncDecOperator operator , arg) {
2934 visits.add(new Visit(VisitKind.VISIT_STATIC_FIELD_POSTFIX,
2935 element: field, operator: operator));
2936 }
2937
2938 @override
2939 visitStaticGetterSetterPostfix(Send node, FunctionElement getter, FunctionElem ent setter, IncDecOperator operator, arg) {
2940 visits.add(new Visit(VisitKind.VISIT_STATIC_GETTER_SETTER_POSTFIX,
2941 getter: getter, setter: setter, operator: operator));
2942 }
2943
2944 @override
2945 visitStaticMethodSetterPostfix(Send node, FunctionElement getter, FunctionElem ent setter, IncDecOperator operator, arg) {
2946 // TODO: implement visitStaticMethodSetterPostfix
2947 }
2948
2949 @override
2950 visitSuperFieldFieldPostfix(Send node, FieldElement readField, FieldElement wr ittenField, IncDecOperator operator, arg) {
2951 // TODO: implement visitSuperFieldFieldPostfix
2952 }
2953
2954 @override
2955 visitSuperFieldPostfix(Send node, FieldElement field, IncDecOperator operator, arg) {
2956 visits.add(new Visit(VisitKind.VISIT_SUPER_FIELD_POSTFIX,
2957 element: field, operator: operator));
2958 }
2959
2960 @override
2961 visitSuperFieldSetterPostfix(Send node, FieldElement field, FunctionElement se tter, IncDecOperator operator, arg) {
2962 visits.add(new Visit(VisitKind.VISIT_SUPER_FIELD_SETTER_POSTFIX,
2963 getter: field, setter: setter, operator: operator));
2964 }
2965
2966 @override
2967 visitSuperGetterFieldPostfix(Send node, FunctionElement getter, FieldElement f ield, IncDecOperator operator, arg) {
2968 visits.add(new Visit(VisitKind.VISIT_SUPER_GETTER_FIELD_POSTFIX,
2969 getter: getter, setter: field, operator: operator));
2970 }
2971
2972 @override
2973 visitSuperGetterSetterPostfix(Send node, FunctionElement getter, FunctionEleme nt setter, IncDecOperator operator, arg) {
2974 visits.add(new Visit(VisitKind.VISIT_SUPER_GETTER_SETTER_POSTFIX,
2975 getter: getter, setter: setter, operator: operator));
2976 }
2977
2978 @override
2979 visitSuperMethodSetterPostfix(Send node, FunctionElement method, FunctionEleme nt setter, IncDecOperator operator, arg) {
2980 // TODO: implement visitSuperMethodSetterPostfix
2981 }
2982
2983 @override
2984 visitThisPropertyPostfix(Send node, IncDecOperator operator, Selector getterSe lector, Selector setterSelector, arg) {
2985 visits.add(new Visit(VisitKind.VISIT_THIS_PROPERTY_POSTFIX,
2986 operator: operator,
2987 getter: getterSelector, setter: setterSelector));
2988 }
2989
2990 @override
2991 visitTopLevelFieldPostfix(Send node, FieldElement field, IncDecOperator operat or, arg) {
2992 visits.add(new Visit(VisitKind.VISIT_TOP_LEVEL_FIELD_POSTFIX,
2993 element: field, operator: operator));
2994 }
2995
2996 @override
2997 visitTopLevelGetterSetterPostfix(Send node, FunctionElement getter, FunctionEl ement setter, IncDecOperator operator, arg) {
2998 visits.add(new Visit(VisitKind.VISIT_TOP_LEVEL_GETTER_SETTER_POSTFIX,
2999 getter: getter, setter: setter, operator: operator));
3000 }
3001
3002 @override
3003 visitTopLevelMethodSetterPostfix(Send node, FunctionElement method, FunctionEl ement setter, IncDecOperator operator, arg) {
3004 // TODO: implement visitTopLevelMethodSetterPostfix
3005 }
3006
3007 @override
3008 visitTypeVariableTypeLiteralPostfix(Send node, TypeVariableElement element, In cDecOperator operator, arg) {
3009 visits.add(new Visit(VisitKind.VISIT_TYPE_VARIABLE_TYPE_LITERAL_POSTFIX,
3010 element: element, operator: operator));
3011 }
3012
3013 @override
3014 visitTypedefTypeLiteralPostfix(Send node, TypeConstantExpression constant, Inc DecOperator operator, arg) {
3015 visits.add(new Visit(VisitKind.VISIT_TYPEDEF_TYPE_LITERAL_POSTFIX,
3016 constant: constant.getText(), operator: operator));
3017 }
3018
3019 @override
3020 visitConstantGet(Send node, ConstantExpression constant, arg) {
3021 // TODO: implement visitConstantGet
3022 }
3023
3024 @override
3025 visitConstantInvoke(Send node, ConstantExpression constant, NodeList arguments , Selector selector, arg) {
3026 // TODO: implement visitConstantInvoke
3027 }
3028
3029 @override
3030 errorUnresolvedCompound(Send node, ErroneousElement element, AssignmentOperato r operator, Node rhs, arg) {
3031 // TODO: implement errorUnresolvedCompound
3032 }
3033
3034 @override
3035 errorUnresolvedGet(Send node, ErroneousElement element, arg) {
3036 // TODO: implement errorUnresolvedGet
3037 }
3038
3039 @override
3040 errorUnresolvedInvoke(Send node, ErroneousElement element, NodeList arguments, Selector selector, arg) {
3041 // TODO: implement errorUnresolvedInvoke
3042 }
3043
3044 @override
3045 errorUnresolvedPostfix(Send node, ErroneousElement element, IncDecOperator ope rator, arg) {
3046 // TODO: implement errorUnresolvedPostfix
3047 }
3048
3049 @override
3050 errorUnresolvedPrefix(Send node, ErroneousElement element, IncDecOperator oper ator, arg) {
3051 // TODO: implement errorUnresolvedPrefix
3052 }
3053
3054 @override
3055 errorUnresolvedSet(Send node, ErroneousElement element, Node rhs, arg) {
3056 // TODO: implement errorUnresolvedSet
3057 }
3058
3059 @override
3060 errorUndefinedBinaryExpression(Send node, Node left, Operator operator, Node r ight, arg) {
3061 // TODO: implement errorUndefinedBinaryExpression
3062 }
3063
3064 @override
3065 errorUndefinedUnaryExpression(Send node, Operator operator, Node expression, a rg) {
3066 // TODO: implement errorUndefinedUnaryExpression
3067 }
3068
3069 @override
3070 errorUnresolvedSuperBinary(Send node, ErroneousElement element, BinaryOperator operator, Node argument, arg) {
3071 // TODO: implement errorUnresolvedSuperBinary
3072 }
3073
3074 @override
3075 errorUnresolvedSuperCompoundIndexSet(Send node, ErroneousElement element, Node index, AssignmentOperator operator, Node rhs, arg) {
3076 // TODO: implement errorUnresolvedSuperCompoundIndexSet
3077 }
3078
3079 @override
3080 errorUnresolvedSuperIndexSet(Send node, ErroneousElement element, Node index, Node rhs, arg) {
3081 // TODO: implement errorUnresolvedSuperIndexSet
3082 }
3083
3084 @override
3085 errorUnresolvedSuperUnary(Send node, UnaryOperator operator, ErroneousElement element, arg) {
3086 // TODO: implement errorUnresolvedSuperUnary
3087 }
3088 }
3089
3090 enum VisitKind {
3091 VISIT_PARAMETER_GET,
3092 VISIT_PARAMETER_SET,
3093 VISIT_PARAMETER_INVOKE,
3094 VISIT_PARAMETER_COMPOUND,
3095 VISIT_PARAMETER_PREFIX,
3096 VISIT_PARAMETER_POSTFIX,
3097
3098 VISIT_LOCAL_VARIABLE_GET,
3099 VISIT_LOCAL_VARIABLE_SET,
3100 VISIT_LOCAL_VARIABLE_INVOKE,
3101 VISIT_LOCAL_VARIABLE_COMPOUND,
3102 VISIT_LOCAL_VARIABLE_PREFIX,
3103 VISIT_LOCAL_VARIABLE_POSTFIX,
3104
3105 VISIT_LOCAL_FUNCTION_GET,
3106 VISIT_LOCAL_FUNCTION_INVOKE,
3107
3108 VISIT_STATIC_FIELD_GET,
3109 VISIT_STATIC_FIELD_SET,
3110 VISIT_STATIC_FIELD_INVOKE,
3111 VISIT_STATIC_FIELD_COMPOUND,
3112 VISIT_STATIC_FIELD_PREFIX,
3113 VISIT_STATIC_FIELD_POSTFIX,
3114
3115 VISIT_STATIC_GETTER_GET,
3116 VISIT_STATIC_SETTER_SET,
3117 VISIT_STATIC_GETTER_INVOKE,
3118 VISIT_STATIC_GETTER_SETTER_COMPOUND,
3119 VISIT_STATIC_METHOD_SETTER_COMPOUND,
3120 VISIT_STATIC_GETTER_SETTER_PREFIX,
3121 VISIT_STATIC_GETTER_SETTER_POSTFIX,
3122
3123 VISIT_STATIC_FUNCTION_GET,
3124 VISIT_STATIC_FUNCTION_INVOKE,
3125
3126 VISIT_TOP_LEVEL_FIELD_GET,
3127 VISIT_TOP_LEVEL_FIELD_SET,
3128 VISIT_TOP_LEVEL_FIELD_INVOKE,
3129 VISIT_TOP_LEVEL_FIELD_COMPOUND,
3130 VISIT_TOP_LEVEL_FIELD_PREFIX,
3131 VISIT_TOP_LEVEL_FIELD_POSTFIX,
3132
3133 VISIT_TOP_LEVEL_GETTER_GET,
3134 VISIT_TOP_LEVEL_SETTER_SET,
3135 VISIT_TOP_LEVEL_GETTER_INVOKE,
3136 VISIT_TOP_LEVEL_GETTER_SETTER_COMPOUND,
3137 VISIT_TOP_LEVEL_GETTER_SETTER_PREFIX,
3138 VISIT_TOP_LEVEL_GETTER_SETTER_POSTFIX,
3139
3140 VISIT_TOP_LEVEL_FUNCTION_GET,
3141 VISIT_TOP_LEVEL_FUNCTION_INVOKE,
3142
3143 VISIT_DYNAMIC_PROPERTY_GET,
3144 VISIT_DYNAMIC_PROPERTY_SET,
3145 VISIT_DYNAMIC_PROPERTY_INVOKE,
3146 VISIT_DYNAMIC_PROPERTY_COMPOUND,
3147 VISIT_DYNAMIC_PROPERTY_PREFIX,
3148 VISIT_DYNAMIC_PROPERTY_POSTFIX,
3149
3150 VISIT_THIS_GET,
3151 VISIT_THIS_INVOKE,
3152
3153 VISIT_THIS_PROPERTY_GET,
3154 VISIT_THIS_PROPERTY_SET,
3155 VISIT_THIS_PROPERTY_INVOKE,
3156 VISIT_THIS_PROPERTY_COMPOUND,
3157 VISIT_THIS_PROPERTY_PREFIX,
3158 VISIT_THIS_PROPERTY_POSTFIX,
3159
3160 VISIT_SUPER_FIELD_GET,
3161 VISIT_SUPER_FIELD_SET,
3162 VISIT_SUPER_FIELD_INVOKE,
3163 VISIT_SUPER_FIELD_COMPOUND,
3164 VISIT_SUPER_FIELD_PREFIX,
3165 VISIT_SUPER_FIELD_POSTFIX,
3166
3167 VISIT_SUPER_GETTER_GET,
3168 VISIT_SUPER_SETTER_SET,
3169 VISIT_SUPER_GETTER_INVOKE,
3170 VISIT_SUPER_GETTER_SETTER_COMPOUND,
3171 VISIT_SUPER_GETTER_FIELD_COMPOUND,
3172 VISIT_SUPER_FIELD_SETTER_COMPOUND,
3173 VISIT_SUPER_GETTER_SETTER_PREFIX,
3174 VISIT_SUPER_GETTER_FIELD_PREFIX,
3175 VISIT_SUPER_FIELD_SETTER_PREFIX,
3176 VISIT_SUPER_GETTER_SETTER_POSTFIX,
3177 VISIT_SUPER_GETTER_FIELD_POSTFIX,
3178 VISIT_SUPER_FIELD_SETTER_POSTFIX,
3179
3180 VISIT_SUPER_METHOD_GET,
3181 VISIT_SUPER_METHOD_INVOKE,
3182
3183 VISIT_BINARY,
3184 VISIT_EQUALS,
3185 VISIT_NOT_EQUALS,
3186
3187 VISIT_SUPER_BINARY,
3188 VISIT_SUPER_EQUALS,
3189 VISIT_SUPER_NOT_EQUALS,
3190
3191 VISIT_UNARY,
3192 VISIT_SUPER_UNARY,
3193 VISIT_NOT,
3194
3195 VISIT_EXPRESSION_INVOKE,
3196
3197 VISIT_CLASS_TYPE_LITERAL_GET,
3198 VISIT_CLASS_TYPE_LITERAL_SET,
3199 VISIT_CLASS_TYPE_LITERAL_INVOKE,
3200 VISIT_CLASS_TYPE_LITERAL_BINARY,
3201 VISIT_CLASS_TYPE_LITERAL_COMPOUND,
3202 VISIT_CLASS_TYPE_LITERAL_PREFIX,
3203 VISIT_CLASS_TYPE_LITERAL_POSTFIX,
3204
3205 VISIT_TYPEDEF_TYPE_LITERAL_GET,
3206 VISIT_TYPEDEF_TYPE_LITERAL_SET,
3207 VISIT_TYPEDEF_TYPE_LITERAL_INVOKE,
3208 VISIT_TYPEDEF_TYPE_LITERAL_BINARY,
3209 VISIT_TYPEDEF_TYPE_LITERAL_COMPOUND,
3210 VISIT_TYPEDEF_TYPE_LITERAL_PREFIX,
3211 VISIT_TYPEDEF_TYPE_LITERAL_POSTFIX,
3212
3213 VISIT_TYPE_VARIABLE_TYPE_LITERAL_GET,
3214 VISIT_TYPE_VARIABLE_TYPE_LITERAL_SET,
3215 VISIT_TYPE_VARIABLE_TYPE_LITERAL_INVOKE,
3216 VISIT_TYPE_VARIABLE_TYPE_LITERAL_BINARY,
3217 VISIT_TYPE_VARIABLE_TYPE_LITERAL_COMPOUND,
3218 VISIT_TYPE_VARIABLE_TYPE_LITERAL_PREFIX,
3219 VISIT_TYPE_VARIABLE_TYPE_LITERAL_POSTFIX,
3220
3221 VISIT_DYNAMIC_TYPE_LITERAL_GET,
3222 VISIT_DYNAMIC_TYPE_LITERAL_SET,
3223 VISIT_DYNAMIC_TYPE_LITERAL_INVOKE,
3224 VISIT_DYNAMIC_TYPE_LITERAL_BINARY,
3225 VISIT_DYNAMIC_TYPE_LITERAL_COMPOUND,
3226 VISIT_DYNAMIC_TYPE_LITERAL_PREFIX,
3227 VISIT_DYNAMIC_TYPE_LITERAL_POSTFIX,
3228
3229 VISIT_INDEX_SET,
3230 VISIT_COMPOUND_INDEX_SET,
3231 VISIT_SUPER_INDEX_SET,
3232 VISIT_SUPER_COMPOUND_INDEX_SET,
3233
3234 VISIT_ASSERT,
3235 VISIT_LOGICAL_AND,
3236 VISIT_LOGICAL_OR,
3237 VISIT_IS,
3238 VISIT_IS_NOT,
3239 VISIT_AS,
3240
3241 // TODO(johnniwinther): Add tests for error cases.
3242 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698