Chromium Code Reviews| Index: tests/compiler/dart2js/semantic_visitor_test.dart |
| diff --git a/tests/compiler/dart2js/semantic_visitor_test.dart b/tests/compiler/dart2js/semantic_visitor_test.dart |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..2c6680e2ce01e42ec28e0980c36b2cf323e70373 |
| --- /dev/null |
| +++ b/tests/compiler/dart2js/semantic_visitor_test.dart |
| @@ -0,0 +1,3086 @@ |
| +// Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file |
| +// for details. All rights reserved. Use of this source code is governed by a |
| +// BSD-style license that can be found in the LICENSE file. |
| + |
| +library dart2js.semantics_visitor_test; |
| + |
| +import 'package:async_helper/async_helper.dart'; |
| +import 'package:expect/expect.dart'; |
| +import 'package:compiler/src/dart_types.dart'; |
| +import 'package:compiler/src/dart2jslib.dart'; |
| +import 'package:compiler/src/elements/elements.dart'; |
| +import 'package:compiler/src/resolution/resolution.dart'; |
| +import 'package:compiler/src/resolution/semantic_visitor.dart'; |
| +import 'package:compiler/src/resolution/operators.dart'; |
| +import 'package:compiler/src/tree/tree.dart'; |
| +import 'package:compiler/src/util/util.dart'; |
| +import 'memory_compiler.dart'; |
| + |
| +class Visit { |
| + final VisitKind method; |
| + final element; |
| + final rhs; |
| + final arguments; |
| + final receiver; |
| + final name; |
| + final expression; |
| + final left; |
| + final right; |
| + final type; |
| + final operator; |
| + final index; |
| + final getter; |
| + final setter; |
| + |
| + const Visit(this.method, |
| + {this.element, |
| + this.rhs, |
| + this.arguments, |
| + this.receiver, |
| + this.name, |
| + this.expression, |
| + this.left, |
| + this.right, |
| + this.type, |
| + this.operator, |
| + this.index, |
| + this.getter, |
| + this.setter}); |
| + |
| + int get hashCode => toString().hashCode; |
| + |
| + bool operator ==(other) => '$this' == '$other'; |
| + |
| + String toString() { |
| + StringBuffer sb = new StringBuffer(); |
| + sb.write('method=$method'); |
| + if (element != null) { |
| + sb.write(',element=$element'); |
| + } |
| + if (rhs != null) { |
| + sb.write(',rhs=$rhs'); |
| + } |
| + if (arguments != null) { |
| + sb.write(',arguments=$arguments'); |
| + } |
| + if (receiver != null) { |
| + sb.write(',receiver=$receiver'); |
| + } |
| + if (name != null) { |
| + sb.write(',name=$name'); |
| + } |
| + if (expression != null) { |
| + sb.write(',expression=$expression'); |
| + } |
| + if (left != null) { |
| + sb.write(',left=$left'); |
| + } |
| + if (right != null) { |
| + sb.write(',right=$right'); |
| + } |
| + if (type != null) { |
| + sb.write(',type=$type'); |
| + } |
| + if (operator != null) { |
| + sb.write(',operator=$operator'); |
| + } |
| + if (index != null) { |
| + sb.write(',index=$index'); |
| + } |
| + if (getter != null) { |
| + sb.write(',getter=$getter'); |
| + } |
| + if (setter != null) { |
| + sb.write(',setter=$setter'); |
| + } |
| + return sb.toString(); |
| + } |
| +} |
| + |
| +class Test { |
| + final String codeByPrefix; |
| + final String code; |
| + final /*Visit | List<Visit>*/ expectedVisits; |
| + final String cls; |
| + |
| + const Test(this.code, this.expectedVisits) |
| + : cls = null, codeByPrefix = null; |
| + const Test.clazz(this.code, this.expectedVisits) |
| + : cls = 'C', codeByPrefix = null; |
| + const Test.prefix(this.codeByPrefix, this.code, this.expectedVisits) |
| + : cls = null; |
| + |
| + String get method => 'm'; |
| + |
| + String toString() { |
| + StringBuffer sb = new StringBuffer(); |
| + sb.writeln(); |
| + sb.writeln(code); |
| + if (codeByPrefix != null) { |
| + sb.writeln('imported by prefix:'); |
| + sb.writeln(codeByPrefix); |
| + } |
| + return sb.toString(); |
| + } |
| +} |
| + |
| +const List<Test> TESTS = const [ |
| + // Parameters |
| + const Test('m(o) => o;', |
| + const Visit(VisitKind.VISIT_PARAMETER_GET, |
| + element: 'parameter(m#o)')), |
| + const Test('m(o) { o = 42; }', |
| + const Visit(VisitKind.VISIT_PARAMETER_SET, |
| + element: 'parameter(m#o)', |
| + rhs:'42')), |
| + const Test('m(o) { o(null, 42); }', |
| + const Visit(VisitKind.VISIT_PARAMETER_INVOKE, |
| + element: 'parameter(m#o)', |
| + arguments: '(null,42)')), |
| + |
| + // Local variables |
| + const Test('m() { var o; return o; }', |
| + const Visit(VisitKind.VISIT_LOCAL_VARIABLE_GET, |
| + element: 'variable(m#o)')), |
| + const Test('m() { var o; o = 42; }', |
| + const Visit(VisitKind.VISIT_LOCAL_VARIABLE_SET, |
| + element: 'variable(m#o)', |
| + rhs:'42')), |
| + const Test('m() { var o; o(null, 42); }', |
| + const Visit(VisitKind.VISIT_LOCAL_VARIABLE_INVOKE, |
| + element: 'variable(m#o)', |
| + arguments: '(null,42)')), |
| + |
| + // Local functions |
| + const Test('m() { o(a, b) {}; return o; }', |
| + const Visit(VisitKind.VISIT_LOCAL_FUNCTION_GET, |
| + element: 'function(m#o)')), |
| + const Test('m() { o(a, b) {}; o(null, 42); }', |
| + const Visit(VisitKind.VISIT_LOCAL_FUNCTION_INVOKE, |
| + element: 'function(m#o)', |
| + arguments: '(null,42)')), |
| + |
| + // Static fields |
| + const Test( |
| + ''' |
| + class C { static var o; } |
| + m() => C.o; |
| + ''', |
| + const Visit(VisitKind.VISIT_STATIC_FIELD_GET, |
| + element: 'field(C#o)')), |
| + const Test.clazz( |
| + ''' |
| + class C { |
| + static var o; |
| + m() => o; |
| + } |
| + ''', |
| + const Visit(VisitKind.VISIT_STATIC_FIELD_GET, |
| + element: 'field(C#o)')), |
| + const Test.clazz( |
| + ''' |
| + class C { |
| + static var o; |
| + m() => C.o; |
| + } |
| + ''', |
| + const Visit(VisitKind.VISIT_STATIC_FIELD_GET, |
| + element: 'field(C#o)')), |
| + const Test.prefix( |
| + ''' |
| + class C { |
| + static var o; |
| + } |
| + ''', |
| + 'm() => p.C.o;', |
| + const Visit(VisitKind.VISIT_STATIC_FIELD_GET, |
| + element: 'field(C#o)')), |
| + const Test( |
| + ''' |
| + class C { static var o; } |
| + m() { C.o = 42; } |
| + ''', |
| + const Visit(VisitKind.VISIT_STATIC_FIELD_SET, |
| + element: 'field(C#o)', |
| + rhs: '42')), |
| + const Test.clazz( |
| + ''' |
| + class C { |
| + static var o; |
| + m() { o = 42; } |
| + } |
| + ''', |
| + const Visit(VisitKind.VISIT_STATIC_FIELD_SET, |
| + element: 'field(C#o)', |
| + rhs: '42')), |
| + const Test.clazz( |
| + ''' |
| + class C { |
| + static var o; |
| + m() { C.o = 42; } |
| + } |
| + ''', |
| + const Visit(VisitKind.VISIT_STATIC_FIELD_SET, |
| + element: 'field(C#o)', |
| + rhs: '42')), |
| + const Test.prefix( |
| + ''' |
| + class C { |
| + static var o; |
| + } |
| + ''', |
| + 'm() { p.C.o = 42; }', |
| + const Visit(VisitKind.VISIT_STATIC_FIELD_SET, |
| + element: 'field(C#o)', |
| + rhs: '42')), |
| + const Test( |
| + ''' |
| + class C { static var o; } |
| + m() { C.o(null, 42); } |
| + ''', |
| + const Visit(VisitKind.VISIT_STATIC_FIELD_INVOKE, |
| + element: 'field(C#o)', |
| + arguments: '(null,42)')), |
| + const Test.clazz( |
| + ''' |
| + class C { |
| + static var o; |
| + m() { o(null, 42); } |
| + } |
| + ''', |
| + const Visit(VisitKind.VISIT_STATIC_FIELD_INVOKE, |
| + element: 'field(C#o)', |
| + arguments: '(null,42)')), |
| + const Test.clazz( |
| + ''' |
| + class C { |
| + static var o; |
| + m() { C.o(null, 42); } |
| + } |
| + ''', |
| + const Visit(VisitKind.VISIT_STATIC_FIELD_INVOKE, |
| + element: 'field(C#o)', |
| + arguments: '(null,42)')), |
| + const Test.prefix( |
| + ''' |
| + class C { |
| + static var o; |
| + } |
| + ''', |
| + 'm() { p.C.o(null, 42); }', |
| + const Visit(VisitKind.VISIT_STATIC_FIELD_INVOKE, |
| + element: 'field(C#o)', |
| + arguments: '(null,42)')), |
| + |
| + // Static properties |
| + const Test( |
| + ''' |
| + class C { |
| + static get o => null; |
| + } |
| + m() => C.o; |
| + ''', |
| + const Visit(VisitKind.VISIT_STATIC_GETTER_GET, |
| + element: 'getter(C#o)')), |
| + const Test.clazz( |
| + ''' |
| + class C { |
| + static get o => null; |
| + m() => o; |
| + } |
| + ''', |
| + const Visit(VisitKind.VISIT_STATIC_GETTER_GET, |
| + element: 'getter(C#o)')), |
| + const Test.clazz( |
| + ''' |
| + class C { |
| + static get o => null; |
| + m() => C.o; |
| + } |
| + ''', |
| + const Visit(VisitKind.VISIT_STATIC_GETTER_GET, |
| + element: 'getter(C#o)')), |
| + const Test.prefix( |
| + ''' |
| + class C { |
| + static get o => null; |
| + } |
| + ''', |
| + 'm() => p.C.o;', |
| + const Visit(VisitKind.VISIT_STATIC_GETTER_GET, |
| + element: 'getter(C#o)')), |
| + const Test( |
| + ''' |
| + class C { static set o(_) {} } |
| + m() { C.o = 42; } |
| + ''', |
| + const Visit(VisitKind.VISIT_STATIC_SETTER_SET, |
| + element: 'setter(C#o)', |
| + rhs: '42')), |
| + const Test.clazz( |
| + ''' |
| + class C { |
| + static set o(_) {} |
| + m() { o = 42; } |
| + } |
| + ''', |
| + const Visit(VisitKind.VISIT_STATIC_SETTER_SET, |
| + element: 'setter(C#o)', |
| + rhs: '42')), |
| + const Test.clazz( |
| + ''' |
| + class C { |
| + static set o(_) {} |
| + m() { C.o = 42; } |
| + } |
| + ''', |
| + const Visit(VisitKind.VISIT_STATIC_SETTER_SET, |
| + element: 'setter(C#o)', |
| + rhs: '42')), |
| + const Test.prefix( |
| + ''' |
| + class C { |
| + static set o(_) {} |
| + } |
| + ''', |
| + 'm() { p.C.o = 42; }', |
| + const Visit(VisitKind.VISIT_STATIC_SETTER_SET, |
| + element: 'setter(C#o)', |
| + rhs: '42')), |
| + const Test( |
| + ''' |
| + class C { static get o => null; } |
| + m() => C.o(null, 42); |
| + ''', |
| + const Visit(VisitKind.VISIT_STATIC_GETTER_INVOKE, |
| + element: 'getter(C#o)', |
| + arguments: '(null,42)')), |
| + const Test.clazz( |
| + ''' |
| + class C { |
| + static get o => null; |
| + m() { o(null, 42); } |
| + } |
| + ''', |
| + const Visit(VisitKind.VISIT_STATIC_GETTER_INVOKE, |
| + element: 'getter(C#o)', |
| + arguments: '(null,42)')), |
| + const Test.clazz( |
| + ''' |
| + class C { |
| + static get o => null; |
| + m() { C.o(null, 42); } |
| + } |
| + ''', |
| + const Visit(VisitKind.VISIT_STATIC_GETTER_INVOKE, |
| + element: 'getter(C#o)', |
| + arguments: '(null,42)')), |
| + const Test.prefix( |
| + ''' |
| + class C { |
| + static get o => null; |
| + } |
| + ''', |
| + 'm() { p.C.o(null, 42); }', |
| + const Visit(VisitKind.VISIT_STATIC_GETTER_INVOKE, |
| + element: 'getter(C#o)', |
| + arguments: '(null,42)')), |
| + |
| + // Static functions |
| + const Test( |
| + ''' |
| + class C { static o(a, b) {} } |
| + m() => C.o; |
| + ''', |
| + const Visit(VisitKind.VISIT_STATIC_FUNCTION_GET, |
| + element: 'function(C#o)')), |
| + const Test.clazz( |
| + ''' |
| + class C { |
| + static o(a, b) {} |
| + m() => o; |
| + } |
| + ''', |
| + const Visit(VisitKind.VISIT_STATIC_FUNCTION_GET, |
| + element: 'function(C#o)')), |
| + const Test.clazz( |
| + ''' |
| + class C { |
| + static o(a, b) {} |
| + m() => C.o; |
| + } |
| + ''', |
| + const Visit(VisitKind.VISIT_STATIC_FUNCTION_GET, |
| + element: 'function(C#o)')), |
| + const Test.prefix( |
| + ''' |
| + class C { static o(a, b) {} } |
| + ''', |
| + ''' |
| + m() => p.C.o; |
| + ''', |
| + const Visit(VisitKind.VISIT_STATIC_FUNCTION_GET, |
| + element: 'function(C#o)')), |
| + const Test( |
| + ''' |
| + class C { static o(a, b) {} } |
| + m() => C.o(null, 42); |
| + ''', |
| + const Visit(VisitKind.VISIT_STATIC_FUNCTION_INVOKE, |
| + element: 'function(C#o)', |
| + arguments: '(null,42)')), |
| + const Test.clazz( |
| + ''' |
| + class C { |
| + static o(a, b) {} |
| + m() { o(null, 42); } |
| + } |
| + ''', |
| + const Visit(VisitKind.VISIT_STATIC_FUNCTION_INVOKE, |
| + element: 'function(C#o)', |
| + arguments: '(null,42)')), |
| + const Test.clazz( |
| + ''' |
| + class C { |
| + static o(a, b) {} |
| + m() { C.o(null, 42); } |
| + } |
| + ''', |
| + const Visit(VisitKind.VISIT_STATIC_FUNCTION_INVOKE, |
| + element: 'function(C#o)', |
| + arguments: '(null,42)')), |
| + const Test.prefix( |
| + ''' |
| + class C { |
| + static o(a, b) {} |
| + } |
| + ''', |
| + 'm() { p.C.o(null, 42); }', |
| + const Visit(VisitKind.VISIT_STATIC_FUNCTION_INVOKE, |
| + element: 'function(C#o)', |
| + arguments: '(null,42)')), |
| + |
| + // Top level fields |
| + const Test( |
| + ''' |
| + var o; |
| + m() => o; |
| + ''', |
| + const Visit(VisitKind.VISIT_TOP_LEVEL_FIELD_GET, |
| + element: 'field(o)')), |
| + const Test.prefix( |
| + ''' |
| + var o; |
| + ''', |
| + 'm() => p.o;', |
| + const Visit(VisitKind.VISIT_TOP_LEVEL_FIELD_GET, |
| + element: 'field(o)')), |
| + const Test( |
| + ''' |
| + var o; |
| + m() { o = 42; } |
| + ''', |
| + const Visit(VisitKind.VISIT_TOP_LEVEL_FIELD_SET, |
| + element: 'field(o)', |
| + rhs: '42')), |
| + const Test.prefix( |
| + ''' |
| + var o; |
| + ''', |
| + 'm() { p.o = 42; }', |
| + const Visit(VisitKind.VISIT_TOP_LEVEL_FIELD_SET, |
| + element: 'field(o)', |
| + rhs: '42')), |
| + const Test( |
| + ''' |
| + var o; |
| + m() { o(null, 42); } |
| + ''', |
| + const Visit(VisitKind.VISIT_TOP_LEVEL_FIELD_INVOKE, |
| + element: 'field(o)', |
| + arguments: '(null,42)')), |
| + const Test.prefix( |
| + ''' |
| + var o; |
| + ''', |
| + 'm() { p.o(null, 42); }', |
| + const Visit(VisitKind.VISIT_TOP_LEVEL_FIELD_INVOKE, |
| + element: 'field(o)', |
| + arguments: '(null,42)')), |
| + |
| + // Top level properties |
| + const Test( |
| + ''' |
| + get o => null; |
| + m() => o; |
| + ''', |
| + const Visit(VisitKind.VISIT_TOP_LEVEL_GETTER_GET, |
| + element: 'getter(o)')), |
| + const Test.prefix( |
| + ''' |
| + get o => null; |
| + ''', |
| + ''' |
| + m() => p.o; |
| + ''', |
| + const Visit(VisitKind.VISIT_TOP_LEVEL_GETTER_GET, |
| + element: 'getter(o)')), |
| + const Test( |
| + ''' |
| + set o(_) {} |
| + m() { o = 42; } |
| + ''', |
| + const Visit(VisitKind.VISIT_TOP_LEVEL_SETTER_SET, |
| + element: 'setter(o)', |
| + rhs: '42')), |
| + const Test.prefix( |
| + ''' |
| + set o(_) {} |
| + ''', |
| + 'm() { p.o = 42; }', |
| + const Visit(VisitKind.VISIT_TOP_LEVEL_SETTER_SET, |
| + element: 'setter(o)', |
| + rhs: '42')), |
| + const Test( |
| + ''' |
| + get o => null; |
| + m() => o(null, 42); |
| + ''', |
| + const Visit(VisitKind.VISIT_TOP_LEVEL_GETTER_INVOKE, |
| + element: 'getter(o)', |
| + arguments: '(null,42)')), |
| + const Test.prefix( |
| + ''' |
| + get o => null; |
| + ''', |
| + 'm() { p.o(null, 42); }', |
| + const Visit(VisitKind.VISIT_TOP_LEVEL_GETTER_INVOKE, |
| + element: 'getter(o)', |
| + arguments: '(null,42)')), |
| + |
| + // Top level functions |
| + const Test( |
| + ''' |
| + o(a, b) {} |
| + m() => o; |
| + ''', |
| + const Visit(VisitKind.VISIT_TOP_LEVEL_FUNCTION_GET, |
| + element: 'function(o)')), |
| + const Test( |
| + ''' |
| + o(a, b) {} |
| + m() => o(null, 42); |
| + ''', |
| + const Visit(VisitKind.VISIT_TOP_LEVEL_FUNCTION_INVOKE, |
| + element: 'function(o)', |
| + arguments: '(null,42)')), |
| + const Test.prefix( |
| + ''' |
| + o(a, b) {} |
| + ''', |
| + 'm() { p.o(null, 42); }', |
| + const Visit(VisitKind.VISIT_TOP_LEVEL_FUNCTION_INVOKE, |
| + element: 'function(o)', |
| + arguments: '(null,42)')), |
| + |
| + // Dynamic properties |
| + const Test('m(o) => o.foo;', |
| + const Visit(VisitKind.VISIT_DYNAMIC_PROPERTY_GET, |
| + receiver: 'o', |
| + name: 'foo')), |
| + const Test('m(o) { o.foo = 42; }', |
| + const Visit(VisitKind.VISIT_DYNAMIC_PROPERTY_SET, |
| + receiver: 'o', |
| + name: 'foo', |
| + rhs: '42')), |
| + const Test('m(o) { o.foo(null, 42); }', |
| + const Visit(VisitKind.VISIT_DYNAMIC_PROPERTY_INVOKE, |
| + receiver: 'o', |
| + name: 'foo', |
| + arguments: '(null,42)')), |
| + |
| + // This access |
| + const Test.clazz( |
| + ''' |
| + class C { |
| + m() => this; |
| + } |
| + ''', |
| + const Visit(VisitKind.VISIT_THIS_GET)), |
| + const Test.clazz( |
| + ''' |
| + class C { |
| + call(a, b) {} |
| + m() { this(null, 42); } |
| + } |
| + ''', |
| + const Visit(VisitKind.VISIT_THIS_INVOKE, |
| + arguments: '(null,42)')), |
| + |
| + // This properties |
| + const Test.clazz( |
| + ''' |
| + class C { |
| + var foo; |
| + m() => this.foo; |
| + } |
| + ''', |
| + const Visit(VisitKind.VISIT_THIS_PROPERTY_GET, |
| + name: 'foo')), |
| + const Test.clazz( |
| + ''' |
| + class C { |
| + var foo; |
| + m() { this.foo = 42; } |
| + } |
| + ''', |
| + const Visit(VisitKind.VISIT_THIS_PROPERTY_SET, |
| + name: 'foo', |
| + rhs: '42')), |
| + const Test.clazz( |
| + ''' |
| + class C { |
| + var foo; |
| + m() { this.foo(null, 42); } |
| + } |
| + ''', |
| + const Visit(VisitKind.VISIT_THIS_PROPERTY_INVOKE, |
| + name: 'foo', |
| + arguments: '(null,42)')), |
| + |
| + // Super fields |
| + const Test.clazz( |
| + ''' |
| + class B { |
| + var o; |
| + } |
| + class C extends B { |
| + m() => super.o; |
| + } |
| + ''', |
| + const Visit(VisitKind.VISIT_SUPER_FIELD_GET, |
| + element: 'field(B#o)')), |
| + const Test.clazz( |
| + ''' |
| + class B { |
| + var o; |
| + } |
| + class C extends B { |
| + m() { super.o = 42; } |
| + } |
| + ''', |
| + const Visit(VisitKind.VISIT_SUPER_FIELD_SET, |
| + element: 'field(B#o)', |
| + rhs: '42')), |
| + const Test.clazz( |
| + ''' |
| + class B { |
| + var o; |
| + } |
| + class C extends B { |
| + m() { super.o(null, 42); } |
| + } |
| + ''', |
| + const Visit(VisitKind.VISIT_SUPER_FIELD_INVOKE, |
| + element: 'field(B#o)', |
| + arguments: '(null,42)')), |
| + |
| + // Super properties |
| + const Test.clazz( |
| + ''' |
| + class B { |
| + get o => null; |
| + } |
| + class C extends B { |
| + m() => super.o; |
| + } |
| + ''', |
| + const Visit(VisitKind.VISIT_SUPER_GETTER_GET, |
| + element: 'getter(B#o)')), |
| + const Test.clazz( |
| + ''' |
| + class B { |
| + set o(_) {} |
| + } |
| + class C extends B { |
| + m() { super.o = 42; } |
| + } |
| + ''', |
| + const Visit(VisitKind.VISIT_SUPER_SETTER_SET, |
| + element: 'setter(B#o)', |
| + rhs: '42')), |
| + const Test.clazz( |
| + ''' |
| + class B { |
| + get o => null; |
| + } |
| + class C extends B { |
| + m() { super.o(null, 42); } |
| + } |
| + ''', |
| + const Visit(VisitKind.VISIT_SUPER_GETTER_INVOKE, |
| + element: 'getter(B#o)', |
| + arguments: '(null,42)')), |
| + |
| + // Super methods |
| + const Test.clazz( |
| + ''' |
| + class B { |
| + o(a, b) {} |
| + } |
| + class C extends B { |
| + m() => super.o; |
| + } |
| + ''', |
| + const Visit(VisitKind.VISIT_SUPER_METHOD_GET, |
| + element: 'function(B#o)')), |
| + const Test.clazz( |
| + ''' |
| + class B { |
| + o(a, b) {} |
| + } |
| + class C extends B { |
| + m() { super.o(null, 42); } |
| + } |
| + ''', |
| + const Visit(VisitKind.VISIT_SUPER_METHOD_INVOKE, |
| + element: 'function(B#o)', |
| + arguments: '(null,42)')), |
| + |
| + // Expression invoke |
| + const Test('m() => (a, b){}(null, 42);', |
| + const Visit(VisitKind.VISIT_EXPRESSION_INVOKE, |
| + receiver: '(a,b){}', |
| + arguments: '(null,42)')), |
| + |
| + // Class type literals |
| + const Test( |
| + ''' |
| + class C {} |
| + m() => C; |
| + ''', |
| + const Visit(VisitKind.VISIT_CLASS_TYPE_LITERAL_GET, |
| + element: 'class(C)')), |
| + const Test( |
| + ''' |
| + class C {} |
| + m() => C(null, 42); |
| + ''', |
| + const Visit(VisitKind.VISIT_CLASS_TYPE_LITERAL_INVOKE, |
| + element: 'class(C)', |
| + arguments: '(null,42)')), |
| + |
| + // Typedef type literals |
| + const Test( |
| + ''' |
| + typedef F(); |
| + m() => F; |
| + ''', |
| + const Visit(VisitKind.VISIT_TYPEDEF_TYPE_LITERAL_GET, |
| + element: 'typedef(F)')), |
| + const Test( |
| + ''' |
| + typedef F(); |
| + m() => F(null, 42); |
| + ''', |
| + const Visit(VisitKind.VISIT_TYPEDEF_TYPE_LITERAL_INVOKE, |
| + element: 'typedef(F)', |
| + arguments: '(null,42)')), |
| + |
| + // Type variable type literals |
| + const Test.clazz( |
| + ''' |
| + class C<T> { |
| + m() => T; |
| + } |
| + ''', |
| + const Visit(VisitKind.VISIT_TYPE_VARIABLE_TYPE_LITERAL_GET, |
| + element: 'type_variable(C#T)')), |
| + const Test.clazz( |
| + ''' |
| + class C<T> { |
| + m() => T(null, 42); |
| + } |
| + ''', |
| + const Visit(VisitKind.VISIT_TYPE_VARIABLE_TYPE_LITERAL_INVOKE, |
| + element: 'type_variable(C#T)', |
| + arguments: '(null,42)')), |
| + |
| + // Dynamic type literals |
| + const Test( |
| + ''' |
| + m() => dynamic; |
| + ''', |
| + const Visit(VisitKind.VISIT_DYNAMIC_TYPE_LITERAL_GET)), |
| + const Test( |
| + ''' |
| + m() { dynamic(null, 42); } |
| + ''', |
| + const Visit(VisitKind.VISIT_DYNAMIC_TYPE_LITERAL_INVOKE, |
| + arguments: '(null,42)')), |
| + |
| + // Assert |
| + const Test( |
| + ''' |
| + m() { assert(false); } |
| + ''', |
| + const Visit(VisitKind.VISIT_ASSERT, expression: 'false')), |
| + |
| + // Lazy and |
| + const Test( |
| + ''' |
| + m() => true && false; |
| + ''', |
| + const Visit(VisitKind.VISIT_LAZY_AND, left: 'true', right: 'false')), |
| + |
| + // Lazy or |
| + const Test( |
| + ''' |
| + m() => true || false; |
| + ''', |
| + const Visit(VisitKind.VISIT_LAZY_OR, left: 'true', right: 'false')), |
| + |
| + // Is test |
| + const Test( |
| + ''' |
| + class C {} |
| + m() => 0 is C; |
| + ''', |
| + const Visit(VisitKind.VISIT_IS, expression: '0', type: 'C')), |
| + |
| + // Is not test |
| + const Test( |
| + ''' |
| + class C {} |
| + m() => 0 is! C; |
| + ''', |
| + const Visit(VisitKind.VISIT_IS_NOT, expression: '0', type: 'C')), |
| + |
| + // Is test |
| + const Test( |
| + ''' |
| + class C {} |
| + m() => 0 as C; |
| + ''', |
| + const Visit(VisitKind.VISIT_AS, expression: '0', type: 'C')), |
| + |
| + // Binary operators |
| + const Test( |
| + ''' |
| + m() => 2 + 3; |
| + ''', |
| + const Visit(VisitKind.VISIT_BINARY, |
| + left: '2', operator: '+', right: '3')), |
| + const Test( |
| + ''' |
| + m() => 2 - 3; |
| + ''', |
| + const Visit(VisitKind.VISIT_BINARY, |
| + left: '2', operator: '-', right: '3')), |
| + const Test( |
| + ''' |
| + m() => 2 * 3; |
| + ''', |
| + const Visit(VisitKind.VISIT_BINARY, |
| + left: '2', operator: '*', right: '3')), |
| + const Test( |
| + ''' |
| + m() => 2 / 3; |
| + ''', |
| + const Visit(VisitKind.VISIT_BINARY, |
| + left: '2', operator: '/', right: '3')), |
| + const Test( |
| + ''' |
| + m() => 2 ~/ 3; |
| + ''', |
| + const Visit(VisitKind.VISIT_BINARY, |
| + left: '2', operator: '~/', right: '3')), |
| + const Test( |
| + ''' |
| + m() => 2 % 3; |
| + ''', |
| + const Visit(VisitKind.VISIT_BINARY, |
| + left: '2', operator: '%', right: '3')), |
| + const Test( |
| + ''' |
| + m() => 2 << 3; |
| + ''', |
| + const Visit(VisitKind.VISIT_BINARY, |
| + left: '2', operator: '<<', right: '3')), |
| + const Test( |
| + ''' |
| + m() => 2 >> 3; |
| + ''', |
| + const Visit(VisitKind.VISIT_BINARY, |
| + left: '2', operator: '>>', right: '3')), |
| + const Test( |
| + ''' |
| + m() => 2 <= 3; |
| + ''', |
| + const Visit(VisitKind.VISIT_BINARY, |
| + left: '2', operator: '<=', right: '3')), |
| + const Test( |
| + ''' |
| + m() => 2 < 3; |
| + ''', |
| + const Visit(VisitKind.VISIT_BINARY, |
| + left: '2', operator: '<', right: '3')), |
| + const Test( |
| + ''' |
| + m() => 2 >= 3; |
| + ''', |
| + const Visit(VisitKind.VISIT_BINARY, |
| + left: '2', operator: '>=', right: '3')), |
| + const Test( |
| + ''' |
| + m() => 2 > 3; |
| + ''', |
| + const Visit(VisitKind.VISIT_BINARY, |
| + left: '2', operator: '>', right: '3')), |
| + const Test( |
| + ''' |
| + m() => 2 & 3; |
| + ''', |
| + const Visit(VisitKind.VISIT_BINARY, |
| + left: '2', operator: '&', right: '3')), |
| + const Test( |
| + ''' |
| + m() => 2 | 3; |
| + ''', |
| + const Visit(VisitKind.VISIT_BINARY, |
| + left: '2', operator: '|', right: '3')), |
| + const Test( |
| + ''' |
| + m() => 2 ^ 3; |
| + ''', |
| + const Visit(VisitKind.VISIT_BINARY, |
| + left: '2', operator: '^', right: '3')), |
| + const Test( |
| + ''' |
| + m() => 2[3]; |
| + ''', |
| + const Visit(VisitKind.VISIT_BINARY, |
| + left: '2', operator: '[]', right: '3')), |
| + const Test.clazz( |
| + ''' |
| + class B { |
| + operator +(_) => null; |
| + } |
| + class C extends B { |
| + m() => super + 42; |
| + } |
| + ''', |
| + const Visit(VisitKind.VISIT_SUPER_BINARY, |
| + element: 'function(B#+)', |
| + operator: '+', |
| + right: '42')), |
| + |
| + // Equals |
| + const Test( |
| + ''' |
| + m() => 2 == 3; |
| + ''', |
| + const Visit(VisitKind.VISIT_EQUALS, |
| + left: '2', right: '3')), |
| + const Test.clazz( |
| + ''' |
| + class B { |
| + operator ==(_) => null; |
| + } |
| + class C extends B { |
| + m() => super == 42; |
| + } |
| + ''', |
| + const Visit(VisitKind.VISIT_SUPER_EQUALS, |
| + element: 'function(B#==)', |
| + right: '42')), |
| + |
| + // Not equals |
| + const Test( |
| + ''' |
| + m() => 2 != 3; |
| + ''', |
| + const Visit(VisitKind.VISIT_NOT_EQUALS, |
| + left: '2', right: '3')), |
| + // TODO(johnniwinther): Enable this. Resolution does not store the element. |
| + /*const Test.clazz( |
| + ''' |
| + class B { |
| + operator ==(_) => null; |
| + } |
| + class C extends B { |
| + m() => super != 42; |
| + } |
| + ''', |
| + const Visit(VisitKind.VISIT_SUPER_NOT_EQUALS, |
| + element: 'function(B#==)', |
| + right: '42')),*/ |
| + |
| + // Unary expression |
| + const Test( |
| + ''' |
| + m() => -false; |
| + ''', |
| + const Visit(VisitKind.VISIT_UNARY, |
| + expression: 'false', operator: '-')), |
| + const Test( |
| + ''' |
| + m() => ~false; |
| + ''', |
| + const Visit(VisitKind.VISIT_UNARY, |
| + expression: 'false', operator: '~')), |
| + const Test.clazz( |
| + ''' |
| + class B { |
| + operator -() => null; |
| + } |
| + class C extends B { |
| + m() => -super; |
| + } |
| + ''', |
| + const Visit(VisitKind.VISIT_SUPER_UNARY, |
| + element: 'function(B#unary-)', operator: '-')), |
| + const Test.clazz( |
| + ''' |
| + class B { |
| + operator ~() => null; |
| + } |
| + class C extends B { |
| + m() => ~super; |
| + } |
| + ''', |
| + const Visit(VisitKind.VISIT_SUPER_UNARY, |
| + element: 'function(B#~)', operator: '~')), |
| + const Test( |
| + ''' |
| + m() => !0; |
| + ''', |
| + const Visit(VisitKind.VISIT_NOT, expression: '0')), |
| + |
| + // Index set |
| + const Test( |
| + ''' |
| + m() => 0[1] = 2; |
| + ''', |
| + const Visit(VisitKind.VISIT_INDEX_SET, |
| + receiver: '0', index: '1', rhs: '2')), |
| + const Test.clazz( |
| + ''' |
| + class B { |
| + operator []=(a, b) {} |
| + } |
| + class C extends B { |
| + m() => super[1] = 2; |
| + } |
| + ''', |
| + const Visit(VisitKind.VISIT_SUPER_INDEX_SET, |
| + element: 'function(B#[]=)', index: '1', rhs: '2')), |
| + |
| + // Compound assignment |
| + const Test( |
| + ''' |
| + m(a) => a.b += 42; |
| + ''', |
| + const [ |
| + const Visit(VisitKind.VISIT_DYNAMIC_PROPERTY_COMPOUND, |
| + receiver: 'a', operator: '+=', rhs: '42', |
| + getter: 'Selector(getter, b, arity=0)', |
| + setter: 'Selector(setter, b, arity=1)'), |
| + const Visit(VisitKind.VISIT_PARAMETER_GET, |
| + element: 'parameter(m#a)') |
| + ]), |
| + // TODO(johnniwinther): Enable this when type literals are recognized in |
| + // SendSet. |
| + /*const Test( |
| + ''' |
| + class C {} |
| + m(a) => C += 42; |
| + ''', |
| + const Visit(VisitKind.VISIT_CLASS_TYPE_LITERAL_COMPOUND, |
| + element: 'class(C)', operator: '+=', rhs: '42')), |
| + const Test( |
| + ''' |
| + typedef F(); |
| + m(a) => F += 42; |
| + ''', |
| + const Visit(VisitKind.VISIT_TYPEDEF_TYPE_LITERAL_COMPOUND, |
| + element: 'typedef(F)', operator: '+=', rhs: '42')), |
| + const Test.clazz( |
| + ''' |
| + class C<T> { |
| + m(a) => T += 42; |
| + } |
| + ''', |
| + const Visit(VisitKind.VISIT_TYPE_VARIABLE_TYPE_LITERAL_COMPOUND, |
| + element: 'type_variable(C#T)', operator: '+=', rhs: '42')), |
| + const Test( |
| + ''' |
| + m(a) => dynamic += 42; |
| + ''', |
| + const Visit(VisitKind.VISIT_DYNAMIC_TYPE_LITERAL_COMPOUND, |
| + operator: '+=', rhs: '42')),*/ |
| + const Test( |
| + ''' |
| + m(a) => a += 42; |
| + ''', |
| + const Visit(VisitKind.VISIT_PARAMETER_COMPOUND, |
| + element: 'parameter(m#a)', operator: '+=', rhs: '42')), |
| + const Test( |
| + ''' |
| + m() { |
| + var a; |
| + a += 42; |
| + } |
| + ''', |
| + const Visit(VisitKind.VISIT_LOCAL_VARIABLE_COMPOUND, |
| + element: 'variable(m#a)', operator: '+=', rhs: '42')), |
| + const Test( |
| + ''' |
| + var a; |
| + m() => a += 42; |
| + ''', |
| + const Visit(VisitKind.VISIT_TOP_LEVEL_FIELD_COMPOUND, |
| + element: 'field(a)', operator: '+=', rhs: '42')), |
| + const Test( |
| + ''' |
| + get a => 0; |
| + set a(_) {} |
| + m() => a += 42; |
| + ''', |
| + const Visit(VisitKind.VISIT_TOP_LEVEL_GETTER_SETTER_COMPOUND, |
| + getter: 'getter(a)', setter: 'setter(a)', |
| + operator: '+=', rhs: '42')), |
| + const Test( |
| + ''' |
| + class C { |
| + static var a; |
| + } |
| + m() => C.a += 42; |
| + ''', |
| + const Visit(VisitKind.VISIT_STATIC_FIELD_COMPOUND, |
| + element: 'field(C#a)', operator: '+=', rhs: '42')), |
| + const Test.clazz( |
| + ''' |
| + class C { |
| + static var a; |
| + m() => C.a += 42; |
| + } |
| + ''', |
| + const Visit(VisitKind.VISIT_STATIC_FIELD_COMPOUND, |
| + element: 'field(C#a)', operator: '+=', rhs: '42')), |
| + const Test.clazz( |
| + ''' |
| + class C { |
| + static var a; |
| + m() => a += 42; |
| + } |
| + ''', |
| + const Visit(VisitKind.VISIT_STATIC_FIELD_COMPOUND, |
| + element: 'field(C#a)', operator: '+=', rhs: '42')), |
| + const Test.prefix( |
| + ''' |
| + class C { |
| + static var a; |
| + } |
| + ''', |
| + ''' |
| + m() => p.C.a += 42; |
| + ''', |
| + const Visit(VisitKind.VISIT_STATIC_FIELD_COMPOUND, |
| + element: 'field(C#a)', operator: '+=', rhs: '42')), |
| + const Test( |
| + ''' |
| + class C { |
| + static get a => 0; |
| + static set a(_) {} |
| + } |
| + m() => C.a += 42; |
| + ''', |
| + const Visit(VisitKind.VISIT_STATIC_GETTER_SETTER_COMPOUND, |
| + getter: 'getter(C#a)', setter: 'setter(C#a)', |
| + operator: '+=', rhs: '42')), |
| + const Test.clazz( |
| + ''' |
| + class C { |
| + static get a => 0; |
| + static set a(_) {} |
| + m() => C.a += 42; |
| + } |
| + ''', |
| + const Visit(VisitKind.VISIT_STATIC_GETTER_SETTER_COMPOUND, |
| + getter: 'getter(C#a)', setter: 'setter(C#a)', |
| + operator: '+=', rhs: '42')), |
| + const Test.clazz( |
| + ''' |
| + class C { |
| + static get a => 0; |
| + static set a(_) {} |
| + m() => a += 42; |
| + } |
| + ''', |
| + const Visit(VisitKind.VISIT_STATIC_GETTER_SETTER_COMPOUND, |
| + getter: 'getter(C#a)', setter: 'setter(C#a)', |
| + operator: '+=', rhs: '42')), |
| + const Test.prefix( |
| + ''' |
| + class C { |
| + static get a => 0; |
| + static set a(_) {} |
| + } |
| + ''', |
| + ''' |
| + m() => p.C.a += 42; |
| + ''', |
| + const Visit(VisitKind.VISIT_STATIC_GETTER_SETTER_COMPOUND, |
| + getter: 'getter(C#a)', setter: 'setter(C#a)', |
| + operator: '+=', rhs: '42')), |
| + // TODO(johnniwinther): Enable these when dart2js supports method and setter |
| + // with the same name. |
| + /*const Test( |
| + ''' |
| + class C { |
| + static a() {} |
| + static set a(_) {} |
| + } |
| + m() => C.a += 42; |
| + ''', |
| + const Visit(VisitKind.VISIT_STATIC_METHOD_SETTER_COMPOUND, |
| + getter: 'function(C#a)', setter: 'setter(C#a)', |
| + operator: '+=', rhs: '42')), |
| + const Test.clazz( |
| + ''' |
| + class C { |
| + static a() {} |
| + static set a(_) {} |
| + m() => C.a += 42; |
| + } |
| + ''', |
| + const Visit(VisitKind.VISIT_STATIC_METHOD_SETTER_COMPOUND, |
| + getter: 'function(C#a)', setter: 'setter(C#a)', |
| + operator: '+=', rhs: '42')), |
| + const Test.clazz( |
| + ''' |
| + class C { |
| + static a() {} |
| + static set a(_) {} |
| + m() => a += 42; |
| + } |
| + ''', |
| + const Visit(VisitKind.VISIT_STATIC_METHOD_SETTER_COMPOUND, |
| + getter: 'function(C#a)', setter: 'setter(C#a)', |
| + operator: '+=', rhs: '42')), |
| + const Test.prefix( |
| + ''' |
| + class C { |
| + static a() {} |
| + static set a(_) {} |
| + } |
| + ''', |
| + ''' |
| + m() => p.C.a += 42; |
| + ''', |
| + const Visit(VisitKind.VISIT_STATIC_METHOD_SETTER_COMPOUND, |
| + getter: 'function(C#a)', setter: 'setter(C#a)', |
| + operator: '+=', rhs: '42')),*/ |
| + const Test.clazz( |
| + ''' |
| + class C { |
| + var a; |
| + m() => a += 42; |
| + } |
| + ''', |
| + const Visit(VisitKind.VISIT_THIS_PROPERTY_COMPOUND, |
| + operator: '+=', rhs: '42', |
| + getter: 'Selector(getter, a, arity=0)', |
| + setter: 'Selector(setter, a, arity=1)')), |
| + const Test.clazz( |
| + ''' |
| + class C { |
| + var a = 0; |
| + m() => this.a += 42; |
| + } |
| + ''', |
| + const Visit(VisitKind.VISIT_THIS_PROPERTY_COMPOUND, |
| + operator: '+=', rhs: '42', |
| + getter: 'Selector(getter, a, arity=0)', |
| + setter: 'Selector(setter, a, arity=1)')), |
| + const Test.clazz( |
| + ''' |
| + class B { |
| + var a = 0; |
| + } |
| + class C extends B { |
| + m() => super.a += 42; |
| + } |
| + ''', |
| + const Visit(VisitKind.VISIT_SUPER_FIELD_COMPOUND, |
| + element: 'field(B#a)', operator: '+=', rhs: '42')), |
| + const Test.clazz( |
| + ''' |
| + class B { |
| + get a => 0; |
| + set a (_) {} |
| + } |
| + class C extends B { |
| + m() => super.a += 42; |
| + } |
| + ''', |
| + const Visit(VisitKind.VISIT_SUPER_GETTER_SETTER_COMPOUND, |
| + getter: 'getter(B#a)', setter: 'setter(B#a)', |
| + operator: '+=', rhs: '42')), |
| + const Test.clazz( |
| + ''' |
| + class A { |
| + get a => 0; |
| + } |
| + class B extends A { |
| + set a (_) {} |
| + } |
| + class C extends B { |
| + m() => super.a += 42; |
| + } |
| + ''', |
| + const Visit(VisitKind.VISIT_SUPER_GETTER_SETTER_COMPOUND, |
| + getter: 'getter(A#a)', setter: 'setter(B#a)', |
| + operator: '+=', rhs: '42')), |
| + const Test.clazz( |
| + ''' |
| + class A { |
| + var a; |
| + } |
| + class B extends A { |
| + get a => 0; |
| + } |
| + |
| + class C extends B { |
| + m() => super.a += 42; |
| + } |
| + ''', |
| + const Visit(VisitKind.VISIT_SUPER_GETTER_FIELD_COMPOUND, |
| + getter: 'getter(B#a)', setter: 'field(A#a)', |
| + operator: '+=', rhs: '42')), |
| + const Test.clazz( |
| + ''' |
| + class A { |
| + var a; |
| + } |
| + class B extends A { |
| + set a(_) {} |
| + } |
| + |
| + class C extends B { |
| + m() => super.a += 42; |
| + } |
| + ''', |
| + const Visit(VisitKind.VISIT_SUPER_FIELD_SETTER_COMPOUND, |
| + getter: 'field(A#a)', setter: 'setter(B#a)', |
| + operator: '+=', rhs: '42')), |
| + // TODO(johnniwinther): Enable this when dart2js supports shadow setters. |
| + /*const Test.clazz( |
| + ''' |
| + class A { |
| + var a; |
| + } |
| + class B extends A { |
| + final a; |
| + } |
| + |
| + class C extends B { |
| + m() => super.a += 42; |
| + } |
| + ''', |
| + const Visit(VisitKind.VISIT_SUPER_FIELD_FIELD_COMPOUND, |
| + getter: 'field(B#a)', setter: 'field(A#a)', |
| + operator: '+=', rhs: '42')),*/ |
| + |
| + // Compound index assignment |
| + const Test( |
| + ''' |
| + m() => 0[1] += 42; |
| + ''', |
| + const Visit(VisitKind.VISIT_COMPOUND_INDEX_SET, |
| + receiver: '0', index: '1', operator: '+=', rhs: '42')), |
| + // TODO(johnniwinther): Enable this when the getter element is stored. |
| + /*const Test.clazz( |
| + ''' |
| + class B { |
| + operator [](_) {} |
| + operator []=(a, b) {} |
| + } |
| + class C extends B { |
| + m() => super[1] += 42; |
| + } |
| + ''', |
| + const Visit(VisitKind.VISIT_SUPER_COMPOUND_INDEX_SET, |
| + getter: 'function(B#[])', setter: 'function(B#[]=)', |
| + index: '1', operator: '+=', rhs: '42')),*/ |
| + |
| + // Prefix expression |
| + const Test( |
| + ''' |
| + m(a) => --a.b; |
| + ''', |
| + const [ |
| + const Visit(VisitKind.VISIT_DYNAMIC_PROPERTY_PREFIX, |
| + receiver: 'a', operator: '--', |
| + getter: 'Selector(getter, b, arity=0)', |
| + setter: 'Selector(setter, b, arity=1)'), |
| + const Visit(VisitKind.VISIT_PARAMETER_GET, |
| + element: 'parameter(m#a)') |
| + ]), |
| + const Test( |
| + ''' |
| + m(a) => ++a; |
| + ''', |
| + const Visit(VisitKind.VISIT_PARAMETER_PREFIX, |
| + element: 'parameter(m#a)', operator: '++')), |
| + const Test( |
| + ''' |
| + m() { |
| + var a; |
| + --a; |
| + } |
| + ''', |
| + const Visit(VisitKind.VISIT_LOCAL_VARIABLE_PREFIX, |
| + element: 'variable(m#a)', operator: '--')), |
| + const Test( |
| + ''' |
| + var a; |
| + m() => ++a; |
| + ''', |
| + const Visit(VisitKind.VISIT_TOP_LEVEL_FIELD_PREFIX, |
| + element: 'field(a)', operator: '++')), |
| + const Test( |
| + ''' |
| + get a => 0; |
| + set a(_) {} |
| + m() => --a; |
| + ''', |
| + const Visit(VisitKind.VISIT_TOP_LEVEL_GETTER_SETTER_PREFIX, |
| + getter: 'getter(a)', setter: 'setter(a)', |
| + operator: '--')), |
| + const Test( |
| + ''' |
| + class C { |
| + static var a; |
| + } |
| + m() => ++C.a; |
| + ''', |
| + const Visit(VisitKind.VISIT_STATIC_FIELD_PREFIX, |
| + element: 'field(C#a)', operator: '++')), |
| + const Test.clazz( |
| + ''' |
| + class C { |
| + static var a; |
| + m() => ++C.a; |
| + } |
| + ''', |
| + const Visit(VisitKind.VISIT_STATIC_FIELD_PREFIX, |
| + element: 'field(C#a)', operator: '++')), |
| + const Test.clazz( |
| + ''' |
| + class C { |
| + static var a; |
| + m() => --a; |
| + } |
| + ''', |
| + const Visit(VisitKind.VISIT_STATIC_FIELD_PREFIX, |
| + element: 'field(C#a)', operator: '--')), |
| + const Test.prefix( |
| + ''' |
| + class C { |
| + static var a; |
| + } |
| + ''', |
| + ''' |
| + m() => --p.C.a; |
| + ''', |
| + const Visit(VisitKind.VISIT_STATIC_FIELD_PREFIX, |
| + element: 'field(C#a)', operator: '--')), |
| + const Test( |
| + ''' |
| + class C { |
| + static get a => 0; |
| + static set a(_) {} |
| + } |
| + m() => ++C.a; |
| + ''', |
| + const Visit(VisitKind.VISIT_STATIC_GETTER_SETTER_PREFIX, |
| + getter: 'getter(C#a)', setter: 'setter(C#a)', |
| + operator: '++')), |
| + const Test.clazz( |
| + ''' |
| + class C { |
| + static get a => 0; |
| + static set a(_) {} |
| + m() => --C.a; |
| + } |
| + ''', |
| + const Visit(VisitKind.VISIT_STATIC_GETTER_SETTER_PREFIX, |
| + getter: 'getter(C#a)', setter: 'setter(C#a)', |
| + operator: '--')), |
| + const Test.clazz( |
| + ''' |
| + class C { |
| + static get a => 0; |
| + static set a(_) {} |
| + m() => --a; |
| + } |
| + ''', |
| + const Visit(VisitKind.VISIT_STATIC_GETTER_SETTER_PREFIX, |
| + getter: 'getter(C#a)', setter: 'setter(C#a)', |
| + operator: '--')), |
| + const Test.prefix( |
| + ''' |
| + class C { |
| + static get a => 0; |
| + static set a(_) {} |
| + } |
| + ''', |
| + ''' |
| + m() => ++p.C.a; |
| + ''', |
| + const Visit(VisitKind.VISIT_STATIC_GETTER_SETTER_PREFIX, |
| + getter: 'getter(C#a)', setter: 'setter(C#a)', |
| + operator: '++')), |
| + const Test.clazz( |
| + ''' |
| + class C { |
| + var a; |
| + m() => --a; |
| + } |
| + ''', |
| + const Visit(VisitKind.VISIT_THIS_PROPERTY_PREFIX, |
| + operator: '--', |
| + getter: 'Selector(getter, a, arity=0)', |
| + setter: 'Selector(setter, a, arity=1)')), |
| + const Test.clazz( |
| + ''' |
| + class C { |
| + var a = 0; |
| + m() => ++this.a; |
| + } |
| + ''', |
| + const Visit(VisitKind.VISIT_THIS_PROPERTY_PREFIX, |
| + operator: '++', |
| + getter: 'Selector(getter, a, arity=0)', |
| + setter: 'Selector(setter, a, arity=1)')), |
| + const Test.clazz( |
| + ''' |
| + class B { |
| + var a = 0; |
| + } |
| + class C extends B { |
| + m() => --super.a; |
| + } |
| + ''', |
| + const Visit(VisitKind.VISIT_SUPER_FIELD_PREFIX, |
| + element: 'field(B#a)', operator: '--')), |
| + const Test.clazz( |
| + ''' |
| + class B { |
| + get a => 0; |
| + set a (_) {} |
| + } |
| + class C extends B { |
| + m() => --super.a; |
| + } |
| + ''', |
| + const Visit(VisitKind.VISIT_SUPER_GETTER_SETTER_PREFIX, |
| + getter: 'getter(B#a)', setter: 'setter(B#a)', |
| + operator: '--')), |
| + const Test.clazz( |
| + ''' |
| + class A { |
| + get a => 0; |
| + } |
| + class B extends A { |
| + set a (_) {} |
| + } |
| + class C extends B { |
| + m() => ++super.a; |
| + } |
| + ''', |
| + const Visit(VisitKind.VISIT_SUPER_GETTER_SETTER_PREFIX, |
| + getter: 'getter(A#a)', setter: 'setter(B#a)', |
| + operator: '++')), |
| + const Test.clazz( |
| + ''' |
| + class A { |
| + var a; |
| + } |
| + class B extends A { |
| + get a => 0; |
| + } |
| + |
| + class C extends B { |
| + m() => --super.a; |
| + } |
| + ''', |
| + const Visit(VisitKind.VISIT_SUPER_GETTER_FIELD_PREFIX, |
| + getter: 'getter(B#a)', setter: 'field(A#a)', |
| + operator: '--')), |
| + const Test.clazz( |
| + ''' |
| + class A { |
| + var a; |
| + } |
| + class B extends A { |
| + set a(_) {} |
| + } |
| + |
| + class C extends B { |
| + m() => ++super.a; |
| + } |
| + ''', |
| + const Visit(VisitKind.VISIT_SUPER_FIELD_SETTER_PREFIX, |
| + getter: 'field(A#a)', setter: 'setter(B#a)', |
| + operator: '++')), |
| + |
| + // Prefix expression |
| + const Test( |
| + ''' |
| + m(a) => a.b--; |
| + ''', |
| + const [ |
| + const Visit(VisitKind.VISIT_DYNAMIC_PROPERTY_POSTFIX, |
| + receiver: 'a', operator: '--', |
| + getter: 'Selector(getter, b, arity=0)', |
| + setter: 'Selector(setter, b, arity=1)'), |
| + const Visit(VisitKind.VISIT_PARAMETER_GET, |
| + element: 'parameter(m#a)') |
| + ]), |
| + const Test( |
| + ''' |
| + m(a) => a++; |
| + ''', |
| + const Visit(VisitKind.VISIT_PARAMETER_POSTFIX, |
| + element: 'parameter(m#a)', operator: '++')), |
| + const Test( |
| + ''' |
| + m() { |
| + var a; |
| + a--; |
| + } |
| + ''', |
| + const Visit(VisitKind.VISIT_LOCAL_VARIABLE_POSTFIX, |
| + element: 'variable(m#a)', operator: '--')), |
| + const Test( |
| + ''' |
| + var a; |
| + m() => a++; |
| + ''', |
| + const Visit(VisitKind.VISIT_TOP_LEVEL_FIELD_POSTFIX, |
| + element: 'field(a)', operator: '++')), |
| + const Test( |
| + ''' |
| + get a => 0; |
| + set a(_) {} |
| + m() => a--; |
| + ''', |
| + const Visit(VisitKind.VISIT_TOP_LEVEL_GETTER_SETTER_POSTFIX, |
| + getter: 'getter(a)', setter: 'setter(a)', |
| + operator: '--')), |
| + const Test( |
| + ''' |
| + class C { |
| + static var a; |
| + } |
| + m() => C.a++; |
| + ''', |
| + const Visit(VisitKind.VISIT_STATIC_FIELD_POSTFIX, |
| + element: 'field(C#a)', operator: '++')), |
| + const Test.clazz( |
| + ''' |
| + class C { |
| + static var a; |
| + m() => C.a++; |
| + } |
| + ''', |
| + const Visit(VisitKind.VISIT_STATIC_FIELD_POSTFIX, |
| + element: 'field(C#a)', operator: '++')), |
| + const Test.clazz( |
| + ''' |
| + class C { |
| + static var a; |
| + m() => a--; |
| + } |
| + ''', |
| + const Visit(VisitKind.VISIT_STATIC_FIELD_POSTFIX, |
| + element: 'field(C#a)', operator: '--')), |
| + const Test.prefix( |
| + ''' |
| + class C { |
| + static var a; |
| + } |
| + ''', |
| + ''' |
| + m() => p.C.a--; |
| + ''', |
| + const Visit(VisitKind.VISIT_STATIC_FIELD_POSTFIX, |
| + element: 'field(C#a)', operator: '--')), |
| + const Test( |
| + ''' |
| + class C { |
| + static get a => 0; |
| + static set a(_) {} |
| + } |
| + m() => C.a++; |
| + ''', |
| + const Visit(VisitKind.VISIT_STATIC_GETTER_SETTER_POSTFIX, |
| + getter: 'getter(C#a)', setter: 'setter(C#a)', |
| + operator: '++')), |
| + const Test.clazz( |
| + ''' |
| + class C { |
| + static get a => 0; |
| + static set a(_) {} |
| + m() => C.a--; |
| + } |
| + ''', |
| + const Visit(VisitKind.VISIT_STATIC_GETTER_SETTER_POSTFIX, |
| + getter: 'getter(C#a)', setter: 'setter(C#a)', |
| + operator: '--')), |
| + const Test.clazz( |
| + ''' |
| + class C { |
| + static get a => 0; |
| + static set a(_) {} |
| + m() => a--; |
| + } |
| + ''', |
| + const Visit(VisitKind.VISIT_STATIC_GETTER_SETTER_POSTFIX, |
| + getter: 'getter(C#a)', setter: 'setter(C#a)', |
| + operator: '--')), |
| + const Test.prefix( |
| + ''' |
| + class C { |
| + static get a => 0; |
| + static set a(_) {} |
| + } |
| + ''', |
| + ''' |
| + m() => p.C.a++; |
| + ''', |
| + const Visit(VisitKind.VISIT_STATIC_GETTER_SETTER_POSTFIX, |
| + getter: 'getter(C#a)', setter: 'setter(C#a)', |
| + operator: '++')), |
| + const Test.clazz( |
| + ''' |
| + class C { |
| + var a; |
| + m() => a--; |
| + } |
| + ''', |
| + const Visit(VisitKind.VISIT_THIS_PROPERTY_POSTFIX, |
| + operator: '--', |
| + getter: 'Selector(getter, a, arity=0)', |
| + setter: 'Selector(setter, a, arity=1)')), |
| + const Test.clazz( |
| + ''' |
| + class C { |
| + var a = 0; |
| + m() => this.a++; |
| + } |
| + ''', |
| + const Visit(VisitKind.VISIT_THIS_PROPERTY_POSTFIX, |
| + operator: '++', |
| + getter: 'Selector(getter, a, arity=0)', |
| + setter: 'Selector(setter, a, arity=1)')), |
| + const Test.clazz( |
| + ''' |
| + class B { |
| + var a = 0; |
| + } |
| + class C extends B { |
| + m() => super.a--; |
| + } |
| + ''', |
| + const Visit(VisitKind.VISIT_SUPER_FIELD_POSTFIX, |
| + element: 'field(B#a)', operator: '--')), |
| + const Test.clazz( |
| + ''' |
| + class B { |
| + get a => 0; |
| + set a (_) {} |
| + } |
| + class C extends B { |
| + m() => super.a--; |
| + } |
| + ''', |
| + const Visit(VisitKind.VISIT_SUPER_GETTER_SETTER_POSTFIX, |
| + getter: 'getter(B#a)', setter: 'setter(B#a)', |
| + operator: '--')), |
| + const Test.clazz( |
| + ''' |
| + class A { |
| + get a => 0; |
| + } |
| + class B extends A { |
| + set a (_) {} |
| + } |
| + class C extends B { |
| + m() => super.a++; |
| + } |
| + ''', |
| + const Visit(VisitKind.VISIT_SUPER_GETTER_SETTER_POSTFIX, |
| + getter: 'getter(A#a)', setter: 'setter(B#a)', |
| + operator: '++')), |
| + const Test.clazz( |
| + ''' |
| + class A { |
| + var a; |
| + } |
| + class B extends A { |
| + get a => 0; |
| + } |
| + |
| + class C extends B { |
| + m() => super.a--; |
| + } |
| + ''', |
| + const Visit(VisitKind.VISIT_SUPER_GETTER_FIELD_POSTFIX, |
| + getter: 'getter(B#a)', setter: 'field(A#a)', |
| + operator: '--')), |
| + const Test.clazz( |
| + ''' |
| + class A { |
| + var a; |
| + } |
| + class B extends A { |
| + set a(_) {} |
| + } |
| + |
| + class C extends B { |
| + m() => super.a++; |
| + } |
| + ''', |
| + const Visit(VisitKind.VISIT_SUPER_FIELD_SETTER_POSTFIX, |
| + getter: 'field(A#a)', setter: 'setter(B#a)', |
| + operator: '++')), |
| + |
| +]; |
| + |
| +main() { |
| + Map<String, String> sourceFiles = {}; |
| + Map<String, Test> testMap = {}; |
| + StringBuffer mainSource = new StringBuffer(); |
| + int index = 0; |
| + TESTS.forEach((Test test) { |
| + StringBuffer testSource = new StringBuffer(); |
| + if (test.codeByPrefix != null) { |
| + String prefixFilename = 'pre$index.dart'; |
| + sourceFiles[prefixFilename] = test.codeByPrefix; |
| + testSource.writeln("import '$prefixFilename' as p;"); |
| + } |
| + |
| + String filename = 'lib$index.dart'; |
| + testSource.writeln(test.code); |
| + sourceFiles[filename] = testSource.toString(); |
| + mainSource.writeln("import '$filename';"); |
| + testMap[filename] = test; |
| + index++; |
| + }); |
| + mainSource.writeln("main() {}"); |
| + sourceFiles['main.dart'] = mainSource.toString(); |
| + |
| + asyncTest(() { |
| + Compiler compiler = compilerFor(sourceFiles, |
| + options: ['--analyze-all', '--analyze-only']); |
| + return compiler.run(Uri.parse('memory:main.dart')).then((_) { |
| + testMap.forEach((String filename, Test test) { |
| + LibraryElement library = compiler.libraryLoader.lookupLibrary( |
| + Uri.parse('memory:$filename')); |
| + var expectedVisits = test.expectedVisits; |
| + if (expectedVisits is! List) { |
| + expectedVisits = [expectedVisits]; |
| + } |
| + AstElement element; |
| + String cls = test.cls; |
| + String method = test.method; |
| + if (cls == null) { |
| + element = library.find(method); |
| + } else { |
| + ClassElement classElement = library.find(cls); |
| + Expect.isNotNull(classElement, |
| + "Class '$cls' not found in:\n" |
| + "${library.compilationUnit.script.text}"); |
| + element = classElement.localLookup(method); |
| + } |
| + Expect.isNotNull(element, "Element '$method' not found in:\n" |
| + "${library.compilationUnit.script.text}"); |
| + ResolvedAst resolvedAst = element.resolvedAst; |
| + SemanticTestVisitor visitor = |
| + new SemanticTestVisitor(resolvedAst.elements); |
| + try { |
| + compiler.withCurrentElement(resolvedAst.element, () { |
| + //print(resolvedAst.node.toDebugString()); |
| + resolvedAst.node.accept(visitor); |
| + }); |
| + } catch (e, s) { |
| + Expect.fail("$e:\n$s\nIn test:\n" |
| + "${library.compilationUnit.script.text}"); |
| + } |
| + Expect.listEquals(expectedVisits, visitor.visits, |
| + "In test:\n" |
| + "${library.compilationUnit.script.text}"); |
| + }); |
| + }); |
| + }); |
| +} |
| + |
| + |
| +class SemanticTestVisitor extends SemanticVisitor with SemanticSendVisitor { |
| + List<Visit> visits = <Visit>[]; |
| + |
| + SemanticTestVisitor(TreeElements elements) : super(elements); |
| + |
| + apply(Node node, arg) => node.accept(this); |
| + |
| + internalError(Spannable spannable, String message) { |
| + throw new SpannableAssertionFailure(spannable, message); |
| + } |
| + |
| + SemanticSendVisitor get sendVisitor => this; |
| + |
| + @override |
| + visitNode(Node node) { |
| + node.visitChildren(this); |
| + } |
| + |
| + @override |
| + visitAs(Send node, Node expression, DartType type, arg) { |
| + visits.add(new Visit(VisitKind.VISIT_AS, |
| + expression: expression, type: type)); |
| + apply(expression, arg); |
| + } |
| + |
| + @override |
| + visitAssert(Send node, Node expression, arg) { |
| + visits.add(new Visit(VisitKind.VISIT_ASSERT, expression: expression)); |
| + apply(expression, arg); |
| + } |
| + |
| + @override |
| + visitBinary(Send node, Node left, BinaryOperator operator, Node right, arg) { |
| + visits.add(new Visit(VisitKind.VISIT_BINARY, |
| + left: left, operator: operator, right: right)); |
| + apply(left, arg); |
| + apply(right, arg); |
| + } |
| + |
| + @override |
| + visitClassTypeLiteralGet(Send node, ClassElement element, arg) { |
| + visits.add(new Visit(VisitKind.VISIT_CLASS_TYPE_LITERAL_GET, |
| + element: element)); |
| + } |
| + |
| + @override |
| + visitClassTypeLiteralInvoke(Send node, ClassElement element, NodeList arguments, Selector selector, arg) { |
|
Johnni Winther
2015/02/20 14:41:15
Generated long lines. Will Fix.
Johnni Winther
2015/03/11 09:14:47
Done.
|
| + visits.add(new Visit(VisitKind.VISIT_CLASS_TYPE_LITERAL_INVOKE, |
| + element: element, arguments: arguments)); |
| + apply(arguments, arg); |
| + } |
| + |
| + @override |
| + errorClassTypeLiteralSet(SendSet node, ClassElement element, Node rhs, arg) { |
| + visits.add(new Visit(VisitKind.VISIT_CLASS_TYPE_LITERAL_INVOKE, |
| + element: element, rhs: rhs)); |
| + apply(rhs, arg); |
| + } |
| + |
| + @override |
| + visitNotEquals(Send node, Node left, Node right, arg) { |
| + visits.add(new Visit(VisitKind.VISIT_NOT_EQUALS, |
| + left: left, right: right)); |
| + apply(left, arg); |
| + apply(right, arg); |
| + } |
| + |
| + @override |
| + visitDynamicPropertyPrefix(Send node, Node receiver, IncDecOperator operator, Selector getterSelector, Selector setterSelector, arg) { |
| + visits.add(new Visit(VisitKind.VISIT_DYNAMIC_PROPERTY_PREFIX, |
| + receiver: receiver, operator: operator, |
| + getter: getterSelector, setter: setterSelector)); |
| + apply(receiver, arg); |
| + } |
| + |
| + @override |
| + visitDynamicPropertyPostfix(Send node, Node receiver, IncDecOperator operator, Selector getterSelector, Selector setterSelector, arg) { |
| + visits.add(new Visit(VisitKind.VISIT_DYNAMIC_PROPERTY_POSTFIX, |
| + receiver: receiver, operator: operator, |
| + getter: getterSelector, setter: setterSelector)); |
| + apply(receiver, arg); |
| + } |
| + |
| + @override |
| + visitDynamicPropertyGet(Send node, Node receiver, Selector selector, arg) { |
| + visits.add(new Visit(VisitKind.VISIT_DYNAMIC_PROPERTY_GET, |
| + receiver: receiver, name: selector.name)); |
| + } |
| + |
| + @override |
| + visitDynamicPropertyInvoke(Send node, Node receiver, NodeList arguments, Selector selector, arg) { |
| + visits.add(new Visit(VisitKind.VISIT_DYNAMIC_PROPERTY_INVOKE, |
| + receiver: receiver, name: selector.name, arguments: arguments)); |
| + apply(arguments, arg); |
| + } |
| + |
| + @override |
| + visitDynamicPropertySet(SendSet node, Node receiver, Selector selector, Node rhs, arg) { |
| + visits.add(new Visit(VisitKind.VISIT_DYNAMIC_PROPERTY_SET, |
| + receiver: receiver, name: selector.name, rhs: rhs)); |
| + } |
| + |
| + @override |
| + visitDynamicTypeLiteralGet(Send node, arg) { |
| + visits.add(new Visit(VisitKind.VISIT_DYNAMIC_TYPE_LITERAL_GET)); |
| + } |
| + |
| + @override |
| + visitDynamicTypeLiteralInvoke(Send node, NodeList arguments, Selector selector, arg) { |
| + visits.add(new Visit(VisitKind.VISIT_DYNAMIC_TYPE_LITERAL_INVOKE, |
| + arguments: arguments)); |
| + } |
| + |
| + @override |
| + errorDynamicTypeLiteralSet(Send node, Node rhs, arg) { |
| + visits.add(new Visit(VisitKind.VISIT_DYNAMIC_TYPE_LITERAL_SET, |
| + rhs: rhs)); |
| + apply(rhs, arg); |
| + } |
| + |
| + @override |
| + visitExpressionInvoke(Send node, Node expression, NodeList arguments, Selector selector, arg) { |
| + visits.add(new Visit(VisitKind.VISIT_EXPRESSION_INVOKE, |
| + receiver: expression, arguments: arguments)); |
| + } |
| + |
| + @override |
| + visitIs(Send node, Node expression, DartType type, arg) { |
| + visits.add(new Visit(VisitKind.VISIT_IS, |
| + expression: expression, type: type)); |
| + apply(expression, arg); |
| + } |
| + |
| + @override |
| + visitIsNot(Send node, Node expression, DartType type, arg) { |
| + visits.add(new Visit(VisitKind.VISIT_IS_NOT, |
| + expression: expression, type: type)); |
| + apply(expression, arg); |
| + } |
| + |
| + @override |
| + visitLazyAnd(Send node, Node left, Node right, arg) { |
| + visits.add(new Visit(VisitKind.VISIT_LAZY_AND, |
| + left: left, right: right)); |
| + apply(left, arg); |
| + apply(right, arg); |
| + } |
| + |
| + @override |
| + visitLazyOr(Send node, Node left, Node right, arg) { |
| + visits.add(new Visit(VisitKind.VISIT_LAZY_OR, |
| + left: left, right: right)); |
| + apply(left, arg); |
| + apply(right, arg); |
| + } |
| + |
| + @override |
| + visitLocalFunctionGet(Send node, LocalFunctionElement function, arg) { |
| + visits.add(new Visit(VisitKind.VISIT_LOCAL_FUNCTION_GET, element: function)); |
| + } |
| + |
| + @override |
| + visitLocalFunctionInvoke(Send node, LocalFunctionElement function, NodeList arguments, Selector selector, arg) { |
| + visits.add(new Visit(VisitKind.VISIT_LOCAL_FUNCTION_INVOKE, |
| + element: function, arguments: arguments)); |
| + apply(arguments, arg); |
| + } |
| + |
| + @override |
| + visitLocalVariableGet(Send node, LocalVariableElement variable, arg) { |
| + visits.add(new Visit(VisitKind.VISIT_LOCAL_VARIABLE_GET, element: variable)); |
| + } |
| + |
| + @override |
| + visitLocalVariableInvoke(Send node, LocalVariableElement variable, NodeList arguments, Selector selector, arg) { |
| + visits.add(new Visit(VisitKind.VISIT_LOCAL_VARIABLE_INVOKE, |
| + element: variable, arguments: arguments)); |
| + apply(arguments, arg); |
| + } |
| + |
| + @override |
| + visitLocalVariableSet(SendSet node, LocalVariableElement variable, Node rhs, arg) { |
| + visits.add(new Visit(VisitKind.VISIT_LOCAL_VARIABLE_SET, |
| + element: variable, rhs: rhs)); |
| + apply(rhs, arg); |
| + } |
| + |
| + @override |
| + visitParameterGet(Send node, ParameterElement parameter, arg) { |
| + visits.add(new Visit(VisitKind.VISIT_PARAMETER_GET, element: parameter)); |
| + } |
| + |
| + @override |
| + visitParameterInvoke(Send node, ParameterElement parameter, NodeList arguments, Selector selector, arg) { |
| + visits.add(new Visit(VisitKind.VISIT_PARAMETER_INVOKE, |
| + element: parameter, arguments: arguments)); |
| + apply(arguments, arg); |
| + } |
| + |
| + @override |
| + visitParameterSet(SendSet node, ParameterElement parameter, Node rhs, arg) { |
| + visits.add(new Visit(VisitKind.VISIT_PARAMETER_SET, element: parameter, rhs: rhs)); |
| + apply(rhs, arg); |
| + } |
| + |
| + @override |
| + visitStaticFieldGet(Send node, FieldElement field, arg) { |
| + visits.add(new Visit(VisitKind.VISIT_STATIC_FIELD_GET, element: field)); |
| + } |
| + |
| + @override |
| + visitStaticFieldInvoke(Send node, FieldElement field, NodeList arguments, Selector selector, arg) { |
| + visits.add(new Visit(VisitKind.VISIT_STATIC_FIELD_INVOKE, |
| + element: field, arguments: arguments)); |
| + apply(arguments, arg); |
| + } |
| + |
| + @override |
| + visitStaticFieldSet(SendSet node, FieldElement field, Node rhs, arg) { |
| + visits.add(new Visit(VisitKind.VISIT_STATIC_FIELD_SET, |
| + element: field, rhs: rhs)); |
| + apply(rhs, arg); |
| + } |
| + |
| + @override |
| + visitStaticFunctionGet(Send node, MethodElement function, arg) { |
| + visits.add(new Visit(VisitKind.VISIT_STATIC_FUNCTION_GET, |
| + element: function)); |
| + } |
| + |
| + @override |
| + visitStaticFunctionInvoke(Send node, MethodElement function, NodeList arguments, Selector selector, arg) { |
| + visits.add(new Visit(VisitKind.VISIT_STATIC_FUNCTION_INVOKE, |
| + element: function, arguments: arguments)); |
| + apply(arguments, arg); |
| + } |
| + |
| + @override |
| + visitStaticGetterGet(Send node, FunctionElement getter, arg) { |
| + visits.add(new Visit(VisitKind.VISIT_STATIC_GETTER_GET, |
| + element: getter)); |
| + } |
| + |
| + @override |
| + visitStaticGetterInvoke(Send node, FunctionElement getter, NodeList arguments, Selector selector, arg) { |
| + visits.add(new Visit(VisitKind.VISIT_STATIC_GETTER_INVOKE, |
| + element: getter, arguments: arguments)); |
| + apply(arguments, arg); |
| + } |
| + |
| + @override |
| + visitStaticSetterSet(SendSet node, FunctionElement setter, Node rhs, arg) { |
| + visits.add(new Visit(VisitKind.VISIT_STATIC_SETTER_SET, |
| + element: setter, rhs: rhs)); |
| + apply(rhs, arg); |
| + } |
| + |
| + @override |
| + visitSuperBinary(Send node, FunctionElement function, BinaryOperator operator, Node argument, arg) { |
| + visits.add(new Visit(VisitKind.VISIT_SUPER_BINARY, |
| + element: function, operator: operator, right: argument)); |
| + apply(argument, arg); |
| + } |
| + |
| + @override |
| + visitSuperNotEquals(Send node, FunctionElement function, Node argument, arg) { |
| + visits.add(new Visit(VisitKind.VISIT_SUPER_NOT_EQUALS, |
| + element: function, right: argument)); |
| + apply(argument, arg); |
| + } |
| + |
| + @override |
| + visitThisGet(Identifier node, arg) { |
| + visits.add(new Visit(VisitKind.VISIT_THIS_GET)); |
| + } |
| + |
| + @override |
| + visitThisInvoke(Send node, NodeList arguments, Selector selector, arg) { |
| + visits.add(new Visit(VisitKind.VISIT_THIS_INVOKE, arguments: arguments)); |
| + apply(arguments, arg); |
| + } |
| + |
| + @override |
| + visitThisPropertyGet(Send node, Selector selector, arg) { |
| + visits.add(new Visit(VisitKind.VISIT_THIS_PROPERTY_GET, |
| + name: selector.name)); |
| + } |
| + |
| + @override |
| + visitThisPropertyInvoke(Send node, NodeList arguments, Selector selector, arg) { |
| + visits.add(new Visit(VisitKind.VISIT_THIS_PROPERTY_INVOKE, |
| + name: selector.name, arguments: arguments)); |
| + apply(arguments, arg); |
| + } |
| + |
| + @override |
| + visitThisPropertySet(SendSet node, Selector selector, Node rhs, arg) { |
| + visits.add(new Visit(VisitKind.VISIT_THIS_PROPERTY_SET, |
| + name: selector.name, rhs: rhs)); |
| + apply(rhs, arg); |
| + } |
| + |
| + @override |
| + visitTopLevelFieldGet(Send node, FieldElement field, arg) { |
| + visits.add(new Visit(VisitKind.VISIT_TOP_LEVEL_FIELD_GET, element: field)); |
| + } |
| + |
| + @override |
| + visitTopLevelFieldInvoke(Send node, FieldElement field, NodeList arguments, Selector selector, arg) { |
| + visits.add(new Visit(VisitKind.VISIT_TOP_LEVEL_FIELD_INVOKE, |
| + element: field, arguments: arguments)); |
| + apply(arguments, arg); |
| + } |
| + |
| + @override |
| + visitTopLevelFieldSet(SendSet node, FieldElement field, Node rhs, arg) { |
| + visits.add(new Visit(VisitKind.VISIT_TOP_LEVEL_FIELD_SET, |
| + element: field, rhs: rhs)); |
| + apply(rhs, arg); |
| + } |
| + |
| + @override |
| + visitTopLevelFunctionGet(Send node, MethodElement function, arg) { |
| + visits.add(new Visit(VisitKind.VISIT_TOP_LEVEL_FUNCTION_GET, |
| + element: function)); |
| + } |
| + |
| + @override |
| + visitTopLevelFunctionInvoke(Send node, MethodElement function, NodeList arguments, Selector selector, arg) { |
| + visits.add(new Visit(VisitKind.VISIT_TOP_LEVEL_FUNCTION_INVOKE, |
| + element: function, arguments: arguments)); |
| + apply(arguments, arg); |
| + } |
| + |
| + @override |
| + visitTopLevelGetterGet(Send node, FunctionElement getter, arg) { |
| + visits.add(new Visit(VisitKind.VISIT_TOP_LEVEL_GETTER_GET, |
| + element: getter)); |
| + } |
| + |
| + @override |
| + visitTopLevelGetterInvoke(Send node, FunctionElement getter, NodeList arguments, Selector selector, arg) { |
| + visits.add(new Visit(VisitKind.VISIT_TOP_LEVEL_GETTER_INVOKE, |
| + element: getter, arguments: arguments)); |
| + apply(arguments, arg); |
| + } |
| + |
| + @override |
| + visitTopLevelSetterSet(SendSet node, FunctionElement setter, Node rhs, arg) { |
| + visits.add(new Visit(VisitKind.VISIT_TOP_LEVEL_SETTER_SET, |
| + element: setter, rhs: rhs)); |
| + apply(rhs, arg); |
| + } |
| + |
| + @override |
| + visitTypeVariableTypeLiteralGet(Send node, TypeVariableElement element, arg) { |
| + visits.add(new Visit(VisitKind.VISIT_TYPE_VARIABLE_TYPE_LITERAL_GET, |
| + element: element)); |
| + } |
| + |
| + @override |
| + visitTypeVariableTypeLiteralInvoke(Send node, TypeVariableElement element, NodeList arguments, Selector selector, arg) { |
| + visits.add(new Visit(VisitKind.VISIT_TYPE_VARIABLE_TYPE_LITERAL_INVOKE, |
| + element: element, arguments: arguments)); |
| + apply(arguments, arg); |
| + } |
| + |
| + @override |
| + errorTypeVariableTypeLiteralSet(SendSet node, TypeVariableElement element, Node rhs, arg) { |
| + visits.add(new Visit(VisitKind.VISIT_TYPE_VARIABLE_TYPE_LITERAL_SET, |
| + element: element, rhs: rhs)); |
| + apply(rhs, arg); |
| + } |
| + |
| + @override |
| + visitTypedefTypeLiteralGet(Send node, TypedefElement element, arg) { |
| + visits.add(new Visit(VisitKind.VISIT_TYPEDEF_TYPE_LITERAL_GET, |
| + element: element)); |
| + } |
| + |
| + @override |
| + visitTypedefTypeLiteralInvoke(Send node, TypedefElement element, NodeList arguments, Selector selector, arg) { |
| + visits.add(new Visit(VisitKind.VISIT_TYPEDEF_TYPE_LITERAL_INVOKE, |
| + element: element, arguments: arguments)); |
| + apply(arguments, arg); |
| + } |
| + |
| + @override |
| + errorTypedefTypeLiteralSet(SendSet node, TypedefElement element, Node rhs, arg) { |
| + visits.add(new Visit(VisitKind.VISIT_TYPEDEF_TYPE_LITERAL_SET, |
| + element: element, rhs: rhs)); |
| + apply(rhs, arg); |
| + } |
| + |
| + @override |
| + visitUnary(Send node, UnaryOperator operator, Node expression, arg) { |
| + visits.add(new Visit(VisitKind.VISIT_UNARY, |
| + expression: expression, operator: operator)); |
| + apply(expression, arg); |
| + } |
| + |
| + @override |
| + visitNot(Send node, Node expression, arg) { |
| + visits.add(new Visit(VisitKind.VISIT_NOT, expression: expression)); |
| + apply(expression, arg); |
| + } |
| + |
| + @override |
| + visitSuperFieldGet(Send node, FieldElement field, arg) { |
| + visits.add(new Visit(VisitKind.VISIT_SUPER_FIELD_GET, element: field)); |
| + } |
| + |
| + @override |
| + visitSuperFieldInvoke(Send node, FieldElement field, NodeList arguments, Selector selector, arg) { |
| + visits.add(new Visit(VisitKind.VISIT_SUPER_FIELD_INVOKE, |
| + element: field, arguments: arguments)); |
| + apply(arguments, arg); |
| + } |
| + |
| + @override |
| + visitSuperFieldSet(SendSet node, FieldElement field, Node rhs, arg) { |
| + visits.add(new Visit(VisitKind.VISIT_SUPER_FIELD_SET, |
| + element: field, rhs: rhs)); |
| + apply(rhs, arg); |
| + } |
| + |
| + @override |
| + visitSuperMethodGet(Send node, MethodElement method, arg) { |
| + visits.add(new Visit(VisitKind.VISIT_SUPER_METHOD_GET, element: method)); |
| + } |
| + |
| + @override |
| + visitSuperMethodInvoke(Send node, MethodElement method, NodeList arguments, Selector selector, arg) { |
| + visits.add(new Visit(VisitKind.VISIT_SUPER_METHOD_INVOKE, |
| + element: method, arguments: arguments)); |
| + apply(arguments, arg); |
| + } |
| + |
| + @override |
| + visitSuperGetterGet(Send node, FunctionElement getter, arg) { |
| + visits.add(new Visit(VisitKind.VISIT_SUPER_GETTER_GET, element: getter)); |
| + } |
| + |
| + @override |
| + visitSuperGetterInvoke(Send node, FunctionElement getter, NodeList arguments, Selector selector, arg) { |
| + visits.add(new Visit(VisitKind.VISIT_SUPER_GETTER_INVOKE, |
| + element: getter, arguments: arguments)); |
| + apply(arguments, arg); |
| + } |
| + |
| + @override |
| + visitSuperSetterSet(SendSet node, FunctionElement setter, Node rhs, arg) { |
| + visits.add(new Visit(VisitKind.VISIT_SUPER_SETTER_SET, |
| + element: setter, rhs: rhs)); |
| + apply(rhs, arg); |
| + } |
| + |
| + @override |
| + visitSuperUnary(Send node, UnaryOperator operator, FunctionElement function, arg) { |
| + visits.add(new Visit(VisitKind.VISIT_SUPER_UNARY, |
| + element: function, operator: operator)); |
| + } |
| + |
| + @override |
| + visitEquals(Send node, Node left, Node right, arg) { |
| + visits.add(new Visit(VisitKind.VISIT_EQUALS, left: left, right: right)); |
| + apply(left, arg); |
| + apply(right, arg); |
| + } |
| + |
| + @override |
| + visitSuperEquals(Send node, FunctionElement function, Node argument, arg) { |
| + visits.add(new Visit(VisitKind.VISIT_SUPER_EQUALS, |
| + element: function, right: argument)); |
| + apply(argument, arg); |
| + } |
| + |
| + @override |
| + visitIndexSet(Send node, Node receiver, Node index, Node rhs, arg) { |
| + visits.add(new Visit(VisitKind.VISIT_INDEX_SET, |
| + receiver: receiver, index: index, rhs: rhs)); |
| + apply(receiver, arg); |
| + apply(index, arg); |
| + apply(rhs, arg); |
| + } |
| + |
| + @override |
| + visitSuperIndexSet(Send node, FunctionElement function, Node index, Node rhs, arg) { |
| + visits.add(new Visit(VisitKind.VISIT_SUPER_INDEX_SET, |
| + element: function, index: index, rhs: rhs)); |
| + apply(index, arg); |
| + apply(rhs, arg); |
| + } |
| + |
| + @override |
| + errorFinalLocalVariableSet(SendSet node, LocalVariableElement variable, Node rhs, arg) { |
| + // TODO: implement errorFinalLocalVariableSet |
| + } |
| + |
| + @override |
| + errorFinalParameterSet(SendSet node, ParameterElement parameter, Node rhs, arg) { |
| + // TODO: implement errorFinalParameterSet |
| + } |
| + |
| + @override |
| + errorFinalStaticFieldSet(SendSet node, FieldElement field, Node rhs, arg) { |
| + // TODO: implement errorFinalStaticFieldSet |
| + } |
| + |
| + @override |
| + errorFinalSuperFieldSet(SendSet node, FieldElement field, Node rhs, arg) { |
| + // TODO: implement errorFinalSuperFieldSet |
| + } |
| + |
| + @override |
| + errorFinalTopLevelFieldSet(SendSet node, FieldElement field, Node rhs, arg) { |
| + // TODO: implement errorFinalTopLevelFieldSet |
| + } |
| + |
| + @override |
| + errorLocalFunctionSet(SendSet node, LocalFunctionElement function, Node rhs, arg) { |
| + // TODO: implement errorLocalFunctionSet |
| + } |
| + |
| + @override |
| + errorStaticFunctionSet(Send node, MethodElement function, Node rhs, arg) { |
| + // TODO: implement errorStaticFunctionSet |
| + } |
| + |
| + @override |
| + errorStaticGetterSet(SendSet node, FunctionElement getter, Node rhs, arg) { |
| + // TODO: implement errorStaticGetterSet |
| + } |
| + |
| + @override |
| + errorStaticSetterGet(Send node, FunctionElement setter, arg) { |
| + // TODO: implement errorStaticSetterGet |
| + } |
| + |
| + @override |
| + errorStaticSetterInvoke(Send node, FunctionElement setter, NodeList arguments, Selector selector, arg) { |
| + // TODO: implement errorStaticSetterInvoke |
| + } |
| + |
| + @override |
| + errorSuperGetterSet(SendSet node, FunctionElement getter, Node rhs, arg) { |
| + // TODO: implement errorSuperGetterSet |
| + } |
| + |
| + @override |
| + errorSuperMethodSet(Send node, MethodElement method, Node rhs, arg) { |
| + // TODO: implement errorSuperMethodSet |
| + } |
| + |
| + @override |
| + errorSuperSetterGet(Send node, FunctionElement setter, arg) { |
| + // TODO: implement errorSuperSetterGet |
| + } |
| + |
| + @override |
| + errorSuperSetterInvoke(Send node, FunctionElement setter, NodeList arguments, Selector selector, arg) { |
| + // TODO: implement errorSuperSetterInvoke |
| + } |
| + |
| + @override |
| + errorTopLevelFunctionSet(Send node, MethodElement function, Node rhs, arg) { |
| + // TODO: implement errorTopLevelFunctionSet |
| + } |
| + |
| + @override |
| + errorTopLevelGetterSet(SendSet node, FunctionElement getter, Node rhs, arg) { |
| + // TODO: implement errorTopLevelGetterSet |
| + } |
| + |
| + @override |
| + errorTopLevelSetterGet(Send node, FunctionElement setter, arg) { |
| + // TODO: implement errorTopLevelSetterGet |
| + } |
| + |
| + @override |
| + errorTopLevelSetterInvoke(Send node, FunctionElement setter, NodeList arguments, Selector selector, arg) { |
| + // TODO: implement errorTopLevelSetterInvoke |
| + } |
| + |
| + @override |
| + visitDynamicPropertyCompound(Send node, Node receiver, AssignmentOperator operator, Node rhs, Selector getterSelector, Selector setterSelector, arg) { |
| + visits.add(new Visit(VisitKind.VISIT_DYNAMIC_PROPERTY_COMPOUND, |
| + receiver: receiver, operator: operator, rhs: rhs, |
| + getter: getterSelector, setter: setterSelector)); |
| + apply(receiver, arg); |
| + apply(rhs, arg); |
| + } |
| + |
| + @override |
| + errorFinalLocalVariableCompound(Send node, LocalVariableElement variable, AssignmentOperator operator, Node rhs, arg) { |
| + // TODO: implement errorFinalLocalVariableCompound |
| + } |
| + |
| + @override |
| + errorFinalParameterCompound(Send node, ParameterElement parameter, AssignmentOperator operator, Node rhs, arg) { |
| + // TODO: implement errorFinalParameterCompound |
| + } |
| + |
| + @override |
| + errorFinalStaticFieldCompound(Send node, FieldElement field, AssignmentOperator operator, Node rhs, arg) { |
| + // TODO: implement errorFinalStaticFieldCompound |
| + } |
| + |
| + @override |
| + errorFinalSuperFieldCompound(Send node, FieldElement field, AssignmentOperator operator, Node rhs, arg) { |
| + // TODO: implement errorFinalSuperFieldCompound |
| + } |
| + |
| + @override |
| + errorFinalTopLevelFieldCompound(Send node, FieldElement field, AssignmentOperator operator, Node rhs, arg) { |
| + // TODO: implement errorFinalTopLevelFieldCompound |
| + } |
| + |
| + @override |
| + errorLocalFunctionCompound(Send node, LocalFunctionElement function, AssignmentOperator operator, Node rhs, arg) { |
| + // TODO: implement errorLocalFunctionCompound |
| + } |
| + |
| + @override |
| + visitLocalVariableCompound(Send node, LocalVariableElement variable, AssignmentOperator operator, Node rhs, arg) { |
| + visits.add(new Visit(VisitKind.VISIT_LOCAL_VARIABLE_COMPOUND, |
| + element: variable, operator: operator, rhs: rhs)); |
| + apply(rhs, arg); |
| + } |
| + |
| + @override |
| + visitParameterCompound(Send node, ParameterElement parameter, AssignmentOperator operator, Node rhs, arg) { |
| + visits.add(new Visit(VisitKind.VISIT_PARAMETER_COMPOUND, |
| + element: parameter, operator: operator, rhs: rhs)); |
| + apply(rhs, arg); |
| + } |
| + |
| + @override |
| + visitStaticFieldCompound(Send node, FieldElement field, AssignmentOperator operator, Node rhs, arg) { |
| + visits.add(new Visit(VisitKind.VISIT_STATIC_FIELD_COMPOUND, |
| + element: field, operator: operator, rhs: rhs)); |
| + apply(rhs, arg); |
| + } |
| + |
| + @override |
| + visitStaticGetterSetterCompound(Send node, FunctionElement getter, FunctionElement setter, AssignmentOperator operator, Node rhs, arg) { |
| + visits.add(new Visit(VisitKind.VISIT_STATIC_GETTER_SETTER_COMPOUND, |
| + operator: operator, rhs: rhs, |
| + getter: getter, setter: setter)); |
| + apply(rhs, arg); |
| + } |
| + |
| + @override |
| + visitSuperFieldCompound(Send node, FieldElement field, AssignmentOperator operator, Node rhs, arg) { |
| + visits.add(new Visit(VisitKind.VISIT_SUPER_FIELD_COMPOUND, |
| + element: field, operator: operator, rhs: rhs)); |
| + apply(rhs, arg); |
| + } |
| + |
| + @override |
| + visitSuperGetterSetterCompound(Send node, FunctionElement getter, FunctionElement setter, AssignmentOperator operator, Node rhs, arg) { |
| + visits.add(new Visit(VisitKind.VISIT_SUPER_GETTER_SETTER_COMPOUND, |
| + operator: operator, rhs: rhs, |
| + getter: getter, setter: setter)); |
| + apply(rhs, arg); |
| + } |
| + |
| + @override |
| + visitThisPropertyCompound(Send node, AssignmentOperator operator, Node rhs, Selector getterSelector, Selector setterSelector, arg) { |
| + visits.add(new Visit(VisitKind.VISIT_THIS_PROPERTY_COMPOUND, |
| + operator: operator, rhs: rhs, |
| + getter: getterSelector, setter: setterSelector)); |
| + apply(rhs, arg); |
| + } |
| + |
| + @override |
| + visitTopLevelFieldCompound(Send node, FieldElement field, AssignmentOperator operator, Node rhs, arg) { |
| + visits.add(new Visit(VisitKind.VISIT_TOP_LEVEL_FIELD_COMPOUND, |
| + element: field, operator: operator, rhs: rhs)); |
| + apply(rhs, arg); |
| + } |
| + |
| + @override |
| + visitTopLevelGetterSetterCompound(Send node, FunctionElement getter, FunctionElement setter, AssignmentOperator operator, Node rhs, arg) { |
| + visits.add(new Visit(VisitKind.VISIT_TOP_LEVEL_GETTER_SETTER_COMPOUND, |
| + operator: operator, rhs: rhs, |
| + getter: getter, setter: setter)); |
| + apply(rhs, arg); |
| + } |
| + |
| + @override |
| + visitStaticMethodSetterCompound(Send node, FunctionElement method, FunctionElement setter, AssignmentOperator operator, Node rhs, arg) { |
| + visits.add(new Visit(VisitKind.VISIT_STATIC_METHOD_SETTER_COMPOUND, |
| + operator: operator, rhs: rhs, |
| + getter: method, setter: setter)); |
| + apply(rhs, arg); |
| + } |
| + |
| + @override |
| + visitSuperFieldSetterCompound(Send node, FieldElement field, FunctionElement setter, AssignmentOperator operator, Node rhs, arg) { |
| + visits.add(new Visit(VisitKind.VISIT_SUPER_FIELD_SETTER_COMPOUND, |
| + operator: operator, rhs: rhs, |
| + getter: field, setter: setter)); |
| + apply(rhs, arg); |
| + } |
| + |
| + @override |
| + visitSuperGetterFieldCompound(Send node, FunctionElement getter, FieldElement field, AssignmentOperator operator, Node rhs, arg) { |
| + visits.add(new Visit(VisitKind.VISIT_SUPER_GETTER_FIELD_COMPOUND, |
| + operator: operator, rhs: rhs, |
| + getter: getter, setter: field)); |
| + apply(rhs, arg); |
| + } |
| + |
| + @override |
| + visitSuperMethodSetterCompound(Send node, FunctionElement method, FunctionElement setter, AssignmentOperator operator, Node rhs, arg) { |
| + // TODO: implement visitSuperMethodSetterCompound |
| + } |
| + |
| + @override |
| + visitTopLevelMethodSetterCompound(Send node, FunctionElement method, FunctionElement setter, AssignmentOperator operator, Node rhs, arg) { |
| + // TODO: implement visitTopLevelMethodSetterCompound |
| + } |
| + |
| + @override |
| + visitCompoundIndexSet(Send node, Node receiver, Node index, AssignmentOperator operator, Node rhs, arg) { |
| + visits.add(new Visit(VisitKind.VISIT_COMPOUND_INDEX_SET, |
| + receiver: receiver, index: index, rhs: rhs, operator: operator)); |
| + apply(receiver, arg); |
| + apply(index, arg); |
| + apply(rhs, arg); |
| + } |
| + |
| + @override |
| + visitSuperCompoundIndexSet(Send node, FunctionElement getter, FunctionElement setter, Node index, AssignmentOperator operator, Node rhs, arg) { |
| + visits.add(new Visit(VisitKind.VISIT_SUPER_COMPOUND_INDEX_SET, |
| + getter: getter, setter: setter, |
| + index: index, rhs: rhs, operator: operator)); |
| + apply(index, arg); |
| + apply(rhs, arg); |
| + } |
| + |
| + @override |
| + visitClassTypeLiteralCompound(Send node, ClassElement element, AssignmentOperator operator, Node rhs, arg) { |
| + visits.add(new Visit(VisitKind.VISIT_CLASS_TYPE_LITERAL_COMPOUND, |
| + element: element, operator: operator, rhs: rhs)); |
| + apply(rhs, arg); |
| + } |
| + |
| + @override |
| + visitDynamicTypeLiteralCompound(Send node, AssignmentOperator operator, Node rhs, arg) { |
| + visits.add(new Visit(VisitKind.VISIT_DYNAMIC_TYPE_LITERAL_COMPOUND, |
| + operator: operator, rhs: rhs)); |
| + apply(rhs, arg); |
| + } |
| + |
| + @override |
| + visitTypeVariableTypeLiteralCompound(Send node, TypeVariableElement element, AssignmentOperator operator, Node rhs, arg) { |
| + visits.add(new Visit(VisitKind.VISIT_TYPE_VARIABLE_TYPE_LITERAL_COMPOUND, |
| + element: element, operator: operator, rhs: rhs)); |
| + apply(rhs, arg); |
| + } |
| + |
| + @override |
| + visitTypedefTypeLiteralCompound(Send node, TypedefElement element, AssignmentOperator operator, Node rhs, arg) { |
| + visits.add(new Visit(VisitKind.VISIT_TYPEDEF_TYPE_LITERAL_COMPOUND, |
| + element: element, operator: operator, rhs: rhs)); |
| + apply(rhs, arg); |
| + } |
| + |
| + @override |
| + errorLocalFunctionPrefix(Send node, LocalFunctionElement function, IncDecOperator operator, arg) { |
| + // TODO: implement errorLocalFunctionPrefix |
| + } |
| + |
| + @override |
| + visitClassTypeLiteralPrefix(Send node, ClassElement element, IncDecOperator operator, arg) { |
| + visits.add(new Visit(VisitKind.VISIT_CLASS_TYPE_LITERAL_PREFIX, |
| + element: element, operator: operator)); |
| + } |
| + |
| + @override |
| + visitDynamicTypeLiteralPrefix(Send node, IncDecOperator operator, arg) { |
| + visits.add(new Visit(VisitKind.VISIT_DYNAMIC_TYPE_LITERAL_PREFIX, |
| + operator: operator)); |
| + } |
| + |
| + @override |
| + visitLocalVariablePrefix(Send node, LocalVariableElement variable, IncDecOperator operator, arg) { |
| + visits.add(new Visit(VisitKind.VISIT_LOCAL_VARIABLE_PREFIX, |
| + element: variable, operator: operator)); |
| + } |
| + |
| + @override |
| + visitParameterPrefix(Send node, ParameterElement parameter, IncDecOperator operator, arg) { |
| + visits.add(new Visit(VisitKind.VISIT_PARAMETER_PREFIX, |
| + element: parameter, operator: operator)); |
| + } |
| + |
| + @override |
| + visitStaticFieldPrefix(Send node, FieldElement field, IncDecOperator operator, arg) { |
| + visits.add(new Visit(VisitKind.VISIT_STATIC_FIELD_PREFIX, |
| + element: field, operator: operator)); |
| + } |
| + |
| + @override |
| + visitStaticGetterSetterPrefix(Send node, FunctionElement getter, FunctionElement setter, IncDecOperator operator, arg) { |
| + visits.add(new Visit(VisitKind.VISIT_STATIC_GETTER_SETTER_PREFIX, |
| + getter: getter, setter: setter, operator: operator)); |
| + } |
| + |
| + @override |
| + visitStaticMethodSetterPrefix(Send node, FunctionElement getter, FunctionElement setter, IncDecOperator operator, arg) { |
| + // TODO: implement visitStaticMethodSetterPrefix |
| + } |
| + |
| + @override |
| + visitSuperFieldFieldPrefix(Send node, FieldElement readField, FieldElement writtenField, IncDecOperator operator, arg) { |
| + // TODO: implement visitSuperFieldFieldPrefix |
| + } |
| + |
| + @override |
| + visitSuperFieldPrefix(Send node, FieldElement field, IncDecOperator operator, arg) { |
| + visits.add(new Visit(VisitKind.VISIT_SUPER_FIELD_PREFIX, |
| + element: field, operator: operator)); |
| + } |
| + |
| + @override |
| + visitSuperFieldSetterPrefix(Send node, FieldElement field, FunctionElement setter, IncDecOperator operator, arg) { |
| + visits.add(new Visit(VisitKind.VISIT_SUPER_FIELD_SETTER_PREFIX, |
| + getter: field, setter: setter, operator: operator)); |
| + } |
| + |
| + @override |
| + visitSuperGetterFieldPrefix(Send node, FunctionElement getter, FieldElement field, IncDecOperator operator, arg) { |
| + visits.add(new Visit(VisitKind.VISIT_SUPER_GETTER_FIELD_PREFIX, |
| + getter: getter, setter: field, operator: operator)); |
| + } |
| + |
| + @override |
| + visitSuperGetterSetterPrefix(Send node, FunctionElement getter, FunctionElement setter, IncDecOperator operator, arg) { |
| + visits.add(new Visit(VisitKind.VISIT_SUPER_GETTER_SETTER_PREFIX, |
| + getter: getter, setter: setter, operator: operator)); |
| + } |
| + |
| + @override |
| + visitSuperMethodSetterPrefix(Send node, FunctionElement method, FunctionElement setter, IncDecOperator operator, arg) { |
| + // TODO: implement visitSuperMethodSetterPrefix |
| + } |
| + |
| + @override |
| + visitThisPropertyPrefix(Send node, IncDecOperator operator, Selector getterSelector, Selector setterSelector, arg) { |
| + visits.add(new Visit(VisitKind.VISIT_THIS_PROPERTY_PREFIX, |
| + operator: operator, |
| + getter: getterSelector, setter: setterSelector)); |
| + } |
| + |
| + @override |
| + visitTopLevelFieldPrefix(Send node, FieldElement field, IncDecOperator operator, arg) { |
| + visits.add(new Visit(VisitKind.VISIT_TOP_LEVEL_FIELD_PREFIX, |
| + element: field, operator: operator)); |
| + } |
| + |
| + @override |
| + visitTopLevelGetterSetterPrefix(Send node, FunctionElement getter, FunctionElement setter, IncDecOperator operator, arg) { |
| + visits.add(new Visit(VisitKind.VISIT_TOP_LEVEL_GETTER_SETTER_PREFIX, |
| + getter: getter, setter: setter, operator: operator)); |
| + } |
| + |
| + @override |
| + visitTopLevelMethodSetterPrefix(Send node, FunctionElement method, FunctionElement setter, IncDecOperator operator, arg) { |
| + // TODO: implement visitTopLevelMethodSetterPrefix |
| + } |
| + |
| + @override |
| + visitTypeVariableTypeLiteralPrefix(Send node, TypeVariableElement element, IncDecOperator operator, arg) { |
| + visits.add(new Visit(VisitKind.VISIT_TYPE_VARIABLE_TYPE_LITERAL_PREFIX, |
| + element: element, operator: operator)); |
| + } |
| + |
| + @override |
| + visitTypedefTypeLiteralPrefix(Send node, TypedefElement element, IncDecOperator operator, arg) { |
| + visits.add(new Visit(VisitKind.VISIT_TYPEDEF_TYPE_LITERAL_PREFIX, |
| + element: element, operator: operator)); |
| + } |
| + |
| + @override |
| + errorLocalFunctionPostfix(Send node, LocalFunctionElement function, IncDecOperator operator, arg) { |
| + // TODO: implement errorLocalFunctionPostfix |
| + } |
| + |
| + @override |
| + visitClassTypeLiteralPostfix(Send node, ClassElement element, IncDecOperator operator, arg) { |
| + visits.add(new Visit(VisitKind.VISIT_CLASS_TYPE_LITERAL_POSTFIX, |
| + element: element, operator: operator)); |
| + } |
| + |
| + @override |
| + visitDynamicTypeLiteralPostfix(Send node, IncDecOperator operator, arg) { |
| + visits.add(new Visit(VisitKind.VISIT_DYNAMIC_TYPE_LITERAL_POSTFIX, |
| + operator: operator)); |
| + } |
| + |
| + @override |
| + visitLocalVariablePostfix(Send node, LocalVariableElement variable, IncDecOperator operator, arg) { |
| + visits.add(new Visit(VisitKind.VISIT_LOCAL_VARIABLE_POSTFIX, |
| + element: variable, operator: operator)); |
| + } |
| + |
| + @override |
| + visitParameterPostfix(Send node, ParameterElement parameter, IncDecOperator operator, arg) { |
| + visits.add(new Visit(VisitKind.VISIT_PARAMETER_POSTFIX, |
| + element: parameter, operator: operator)); |
| + } |
| + |
| + @override |
| + visitStaticFieldPostfix(Send node, FieldElement field, IncDecOperator operator, arg) { |
| + visits.add(new Visit(VisitKind.VISIT_STATIC_FIELD_POSTFIX, |
| + element: field, operator: operator)); |
| + } |
| + |
| + @override |
| + visitStaticGetterSetterPostfix(Send node, FunctionElement getter, FunctionElement setter, IncDecOperator operator, arg) { |
| + visits.add(new Visit(VisitKind.VISIT_STATIC_GETTER_SETTER_POSTFIX, |
| + getter: getter, setter: setter, operator: operator)); |
| + } |
| + |
| + @override |
| + visitStaticMethodSetterPostfix(Send node, FunctionElement getter, FunctionElement setter, IncDecOperator operator, arg) { |
| + // TODO: implement visitStaticMethodSetterPostfix |
| + } |
| + |
| + @override |
| + visitSuperFieldFieldPostfix(Send node, FieldElement readField, FieldElement writtenField, IncDecOperator operator, arg) { |
| + // TODO: implement visitSuperFieldFieldPostfix |
| + } |
| + |
| + @override |
| + visitSuperFieldPostfix(Send node, FieldElement field, IncDecOperator operator, arg) { |
| + visits.add(new Visit(VisitKind.VISIT_SUPER_FIELD_POSTFIX, |
| + element: field, operator: operator)); |
| + } |
| + |
| + @override |
| + visitSuperFieldSetterPostfix(Send node, FieldElement field, FunctionElement setter, IncDecOperator operator, arg) { |
| + visits.add(new Visit(VisitKind.VISIT_SUPER_FIELD_SETTER_POSTFIX, |
| + getter: field, setter: setter, operator: operator)); |
| + } |
| + |
| + @override |
| + visitSuperGetterFieldPostfix(Send node, FunctionElement getter, FieldElement field, IncDecOperator operator, arg) { |
| + visits.add(new Visit(VisitKind.VISIT_SUPER_GETTER_FIELD_POSTFIX, |
| + getter: getter, setter: field, operator: operator)); |
| + } |
| + |
| + @override |
| + visitSuperGetterSetterPostfix(Send node, FunctionElement getter, FunctionElement setter, IncDecOperator operator, arg) { |
| + visits.add(new Visit(VisitKind.VISIT_SUPER_GETTER_SETTER_POSTFIX, |
| + getter: getter, setter: setter, operator: operator)); |
| + } |
| + |
| + @override |
| + visitSuperMethodSetterPostfix(Send node, FunctionElement method, FunctionElement setter, IncDecOperator operator, arg) { |
| + // TODO: implement visitSuperMethodSetterPostfix |
| + } |
| + |
| + @override |
| + visitThisPropertyPostfix(Send node, IncDecOperator operator, Selector getterSelector, Selector setterSelector, arg) { |
| + visits.add(new Visit(VisitKind.VISIT_THIS_PROPERTY_POSTFIX, |
| + operator: operator, |
| + getter: getterSelector, setter: setterSelector)); |
| + } |
| + |
| + @override |
| + visitTopLevelFieldPostfix(Send node, FieldElement field, IncDecOperator operator, arg) { |
| + visits.add(new Visit(VisitKind.VISIT_TOP_LEVEL_FIELD_POSTFIX, |
| + element: field, operator: operator)); |
| + } |
| + |
| + @override |
| + visitTopLevelGetterSetterPostfix(Send node, FunctionElement getter, FunctionElement setter, IncDecOperator operator, arg) { |
| + visits.add(new Visit(VisitKind.VISIT_TOP_LEVEL_GETTER_SETTER_POSTFIX, |
| + getter: getter, setter: setter, operator: operator)); |
| + } |
| + |
| + @override |
| + visitTopLevelMethodSetterPostfix(Send node, FunctionElement method, FunctionElement setter, IncDecOperator operator, arg) { |
| + // TODO: implement visitTopLevelMethodSetterPostfix |
| + } |
| + |
| + @override |
| + visitTypeVariableTypeLiteralPostfix(Send node, TypeVariableElement element, IncDecOperator operator, arg) { |
| + visits.add(new Visit(VisitKind.VISIT_TYPE_VARIABLE_TYPE_LITERAL_POSTFIX, |
| + element: element, operator: operator)); |
| + } |
| + |
| + @override |
| + visitTypedefTypeLiteralPostfix(Send node, TypedefElement element, IncDecOperator operator, arg) { |
| + visits.add(new Visit(VisitKind.VISIT_TYPEDEF_TYPE_LITERAL_POSTFIX, |
| + element: element, operator: operator)); |
| + } |
| +} |
| + |
| +enum VisitKind { |
| + VISIT_PARAMETER_GET, |
| + VISIT_PARAMETER_SET, |
| + VISIT_PARAMETER_INVOKE, |
| + VISIT_PARAMETER_COMPOUND, |
| + VISIT_PARAMETER_PREFIX, |
| + VISIT_PARAMETER_POSTFIX, |
| + |
| + VISIT_LOCAL_VARIABLE_GET, |
| + VISIT_LOCAL_VARIABLE_SET, |
| + VISIT_LOCAL_VARIABLE_INVOKE, |
| + VISIT_LOCAL_VARIABLE_COMPOUND, |
| + VISIT_LOCAL_VARIABLE_PREFIX, |
| + VISIT_LOCAL_VARIABLE_POSTFIX, |
| + |
| + VISIT_LOCAL_FUNCTION_GET, |
| + VISIT_LOCAL_FUNCTION_INVOKE, |
| + |
| + VISIT_STATIC_FIELD_GET, |
| + VISIT_STATIC_FIELD_SET, |
| + VISIT_STATIC_FIELD_INVOKE, |
| + VISIT_STATIC_FIELD_COMPOUND, |
| + VISIT_STATIC_FIELD_PREFIX, |
| + VISIT_STATIC_FIELD_POSTFIX, |
| + |
| + VISIT_STATIC_GETTER_GET, |
| + VISIT_STATIC_SETTER_SET, |
| + VISIT_STATIC_GETTER_INVOKE, |
| + VISIT_STATIC_GETTER_SETTER_COMPOUND, |
| + VISIT_STATIC_METHOD_SETTER_COMPOUND, |
| + VISIT_STATIC_GETTER_SETTER_PREFIX, |
| + VISIT_STATIC_GETTER_SETTER_POSTFIX, |
| + |
| + VISIT_STATIC_FUNCTION_GET, |
| + VISIT_STATIC_FUNCTION_INVOKE, |
| + |
| + VISIT_TOP_LEVEL_FIELD_GET, |
| + VISIT_TOP_LEVEL_FIELD_SET, |
| + VISIT_TOP_LEVEL_FIELD_INVOKE, |
| + VISIT_TOP_LEVEL_FIELD_COMPOUND, |
| + VISIT_TOP_LEVEL_FIELD_PREFIX, |
| + VISIT_TOP_LEVEL_FIELD_POSTFIX, |
| + |
| + VISIT_TOP_LEVEL_GETTER_GET, |
| + VISIT_TOP_LEVEL_SETTER_SET, |
| + VISIT_TOP_LEVEL_GETTER_INVOKE, |
| + VISIT_TOP_LEVEL_GETTER_SETTER_COMPOUND, |
| + VISIT_TOP_LEVEL_GETTER_SETTER_PREFIX, |
| + VISIT_TOP_LEVEL_GETTER_SETTER_POSTFIX, |
| + |
| + VISIT_TOP_LEVEL_FUNCTION_GET, |
| + VISIT_TOP_LEVEL_FUNCTION_INVOKE, |
| + |
| + VISIT_DYNAMIC_PROPERTY_GET, |
| + VISIT_DYNAMIC_PROPERTY_SET, |
| + VISIT_DYNAMIC_PROPERTY_INVOKE, |
| + VISIT_DYNAMIC_PROPERTY_COMPOUND, |
| + VISIT_DYNAMIC_PROPERTY_PREFIX, |
| + VISIT_DYNAMIC_PROPERTY_POSTFIX, |
| + |
| + VISIT_THIS_GET, |
| + VISIT_THIS_INVOKE, |
| + |
| + VISIT_THIS_PROPERTY_GET, |
| + VISIT_THIS_PROPERTY_SET, |
| + VISIT_THIS_PROPERTY_INVOKE, |
| + VISIT_THIS_PROPERTY_COMPOUND, |
| + VISIT_THIS_PROPERTY_PREFIX, |
| + VISIT_THIS_PROPERTY_POSTFIX, |
| + |
| + VISIT_SUPER_FIELD_GET, |
| + VISIT_SUPER_FIELD_SET, |
| + VISIT_SUPER_FIELD_INVOKE, |
| + VISIT_SUPER_FIELD_COMPOUND, |
| + VISIT_SUPER_FIELD_PREFIX, |
| + VISIT_SUPER_FIELD_POSTFIX, |
| + |
| + VISIT_SUPER_GETTER_GET, |
| + VISIT_SUPER_SETTER_SET, |
| + VISIT_SUPER_GETTER_INVOKE, |
| + VISIT_SUPER_GETTER_SETTER_COMPOUND, |
| + VISIT_SUPER_GETTER_FIELD_COMPOUND, |
| + VISIT_SUPER_FIELD_SETTER_COMPOUND, |
| + VISIT_SUPER_GETTER_SETTER_PREFIX, |
| + VISIT_SUPER_GETTER_FIELD_PREFIX, |
| + VISIT_SUPER_FIELD_SETTER_PREFIX, |
| + VISIT_SUPER_GETTER_SETTER_POSTFIX, |
| + VISIT_SUPER_GETTER_FIELD_POSTFIX, |
| + VISIT_SUPER_FIELD_SETTER_POSTFIX, |
| + |
| + VISIT_SUPER_METHOD_GET, |
| + VISIT_SUPER_METHOD_INVOKE, |
| + |
| + VISIT_BINARY, |
| + VISIT_EQUALS, |
| + VISIT_NOT_EQUALS, |
| + |
| + VISIT_SUPER_BINARY, |
| + VISIT_SUPER_EQUALS, |
| + VISIT_SUPER_NOT_EQUALS, |
| + |
| + VISIT_UNARY, |
| + VISIT_SUPER_UNARY, |
| + VISIT_NOT, |
| + |
| + VISIT_EXPRESSION_INVOKE, |
| + |
| + VISIT_CLASS_TYPE_LITERAL_GET, |
| + VISIT_CLASS_TYPE_LITERAL_SET, |
| + VISIT_CLASS_TYPE_LITERAL_INVOKE, |
| + VISIT_CLASS_TYPE_LITERAL_BINARY, |
| + VISIT_CLASS_TYPE_LITERAL_COMPOUND, |
| + VISIT_CLASS_TYPE_LITERAL_PREFIX, |
| + VISIT_CLASS_TYPE_LITERAL_POSTFIX, |
| + |
| + VISIT_TYPEDEF_TYPE_LITERAL_GET, |
| + VISIT_TYPEDEF_TYPE_LITERAL_SET, |
| + VISIT_TYPEDEF_TYPE_LITERAL_INVOKE, |
| + VISIT_TYPEDEF_TYPE_LITERAL_BINARY, |
| + VISIT_TYPEDEF_TYPE_LITERAL_COMPOUND, |
| + VISIT_TYPEDEF_TYPE_LITERAL_PREFIX, |
| + VISIT_TYPEDEF_TYPE_LITERAL_POSTFIX, |
| + |
| + VISIT_TYPE_VARIABLE_TYPE_LITERAL_GET, |
| + VISIT_TYPE_VARIABLE_TYPE_LITERAL_SET, |
| + VISIT_TYPE_VARIABLE_TYPE_LITERAL_INVOKE, |
| + VISIT_TYPE_VARIABLE_TYPE_LITERAL_BINARY, |
| + VISIT_TYPE_VARIABLE_TYPE_LITERAL_COMPOUND, |
| + VISIT_TYPE_VARIABLE_TYPE_LITERAL_PREFIX, |
| + VISIT_TYPE_VARIABLE_TYPE_LITERAL_POSTFIX, |
| + |
| + VISIT_DYNAMIC_TYPE_LITERAL_GET, |
| + VISIT_DYNAMIC_TYPE_LITERAL_SET, |
| + VISIT_DYNAMIC_TYPE_LITERAL_INVOKE, |
| + VISIT_DYNAMIC_TYPE_LITERAL_BINARY, |
| + VISIT_DYNAMIC_TYPE_LITERAL_COMPOUND, |
| + VISIT_DYNAMIC_TYPE_LITERAL_PREFIX, |
| + VISIT_DYNAMIC_TYPE_LITERAL_POSTFIX, |
| + |
| + VISIT_INDEX_SET, |
| + VISIT_COMPOUND_INDEX_SET, |
| + VISIT_SUPER_INDEX_SET, |
| + VISIT_SUPER_COMPOUND_INDEX_SET, |
| + |
| + VISIT_ASSERT, |
| + VISIT_LAZY_AND, |
| + VISIT_LAZY_OR, |
| + VISIT_IS, |
| + VISIT_IS_NOT, |
| + VISIT_AS, |
| +} |