// 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/constants/expressions.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; | |
final constant; | |
final selector; | |
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, | |
this.constant, | |
this.selector}); | |
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'); | |
} | |
if (constant != null) { | |
sb.write(',constant=$constant'); | |
} | |
if (selector != null) { | |
sb.write(',selector=$selector'); | |
} | |
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)', | |
selector: 'Selector(call, call, arity=2)')), | |
// 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)', | |
selector: 'Selector(call, call, arity=2)')), | |
// 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)', | |
selector: 'Selector(call, call, arity=2)')), | |
// 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() => foo; | |
} | |
''', | |
const Visit(VisitKind.VISIT_THIS_PROPERTY_GET, | |
name: 'foo')), | |
const Test.clazz( | |
''' | |
class C { | |
var foo; | |
m() => this.foo; | |
} | |
''', | |
const Visit(VisitKind.VISIT_THIS_PROPERTY_GET, | |
name: 'foo')), | |
const Test.clazz( | |
''' | |
class C { | |
get foo => null; | |
m() => foo; | |
} | |
''', | |
const Visit(VisitKind.VISIT_THIS_PROPERTY_GET, | |
name: 'foo')), | |
const Test.clazz( | |
''' | |
class C { | |
get foo => null; | |
m() => this.foo; | |
} | |
''', | |
const Visit(VisitKind.VISIT_THIS_PROPERTY_GET, | |
name: 'foo')), | |
const Test.clazz( | |
''' | |
class C { | |
var foo; | |
m() { foo = 42; } | |
} | |
''', | |
const Visit(VisitKind.VISIT_THIS_PROPERTY_SET, | |
name: 'foo', | |
rhs: '42')), | |
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 { | |
set foo(_) {} | |
m() { foo = 42; } | |
} | |
''', | |
const Visit(VisitKind.VISIT_THIS_PROPERTY_SET, | |
name: 'foo', | |
rhs: '42')), | |
const Test.clazz( | |
''' | |
class C { | |
set foo(_) {} | |
m() { this.foo = 42; } | |
} | |
''', | |
const Visit(VisitKind.VISIT_THIS_PROPERTY_SET, | |
name: 'foo', | |
rhs: '42')), | |
const Test.clazz( | |
''' | |
class C { | |
var foo; | |
m() { foo(null, 42); } | |
} | |
''', | |
const Visit(VisitKind.VISIT_THIS_PROPERTY_INVOKE, | |
name: 'foo', | |
arguments: '(null,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, | |
constant: 'C')), | |
const Test( | |
''' | |
class C {} | |
m() => C(null, 42); | |
''', | |
const Visit(VisitKind.VISIT_CLASS_TYPE_LITERAL_INVOKE, | |
constant: 'C', | |
arguments: '(null,42)')), | |
// Typedef type literals | |
const Test( | |
''' | |
typedef F(); | |
m() => F; | |
''', | |
const Visit(VisitKind.VISIT_TYPEDEF_TYPE_LITERAL_GET, | |
constant: 'F')), | |
const Test( | |
''' | |
typedef F(); | |
m() => F(null, 42); | |
''', | |
const Visit(VisitKind.VISIT_TYPEDEF_TYPE_LITERAL_INVOKE, | |
constant: '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, | |
constant: 'dynamic')), | |
// TODO(johnniwinther): Enable this when we pass the right constant. | |
// Currently we generated the constant for `Type` instead of `dynamic`. | |
/*const Test( | |
''' | |
m() { dynamic(null, 42); } | |
''', | |
const Visit(VisitKind.VISIT_DYNAMIC_TYPE_LITERAL_INVOKE, | |
constant: 'dynamic', | |
arguments: '(null,42)')),*/ | |
// Assert | |
const Test( | |
''' | |
m() { assert(false); } | |
''', | |
const Visit(VisitKind.VISIT_ASSERT, expression: 'false')), | |
// Logical and | |
const Test( | |
''' | |
m() => true && false; | |
''', | |
const Visit(VisitKind.VISIT_LOGICAL_AND, left: 'true', right: 'false')), | |
// Logical or | |
const Test( | |
''' | |
m() => true || false; | |
''', | |
const Visit(VisitKind.VISIT_LOGICAL_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.clazz( | |
''' | |
class B { | |
operator +(_) => null; | |
} | |
class C extends B { | |
m() => super + 42; | |
} | |
''', | |
const Visit(VisitKind.VISIT_SUPER_BINARY, | |
element: 'function(B#+)', | |
operator: '+', | |
right: '42')), | |
// Index | |
const Test( | |
''' | |
m() => 2[3]; | |
''', | |
const Visit(VisitKind.VISIT_INDEX, | |
receiver: '2', index: '3')), | |
const Test( | |
''' | |
m() => --2[3]; | |
''', | |
const Visit(VisitKind.VISIT_INDEX_PREFIX, | |
receiver: '2', index: '3', operator: '--')), | |
const Test( | |
''' | |
m() => 2[3]++; | |
''', | |
const Visit(VisitKind.VISIT_INDEX_POSTFIX, | |
receiver: '2', index: '3', operator: '++')), | |
const Test.clazz( | |
''' | |
class B { | |
operator [](_) => null; | |
} | |
class C extends B { | |
m() => super[42]; | |
} | |
''', | |
const Visit(VisitKind.VISIT_SUPER_INDEX, | |
element: 'function(B#[])', | |
index: '42')), | |
const Test.clazz( | |
''' | |
class B { | |
operator [](_) => null; | |
operator []=(a, b) {} | |
} | |
class C extends B { | |
m() => ++super[42]; | |
} | |
''', | |
const Visit(VisitKind.VISIT_SUPER_INDEX_PREFIX, | |
getter: 'function(B#[])', | |
setter: 'function(B#[]=)', | |
index: '42', | |
operator: '++')), | |
const Test.clazz( | |
''' | |
class B { | |
operator [](_) => null; | |
operator []=(a, b) {} | |
} | |
class C extends B { | |
m() => super[42]--; | |
} | |
''', | |
const Visit(VisitKind.VISIT_SUPER_INDEX_POSTFIX, | |
getter: 'function(B#[])', | |
setter: 'function(B#[]=)', | |
index: '42', | |
operator: '--')), | |
// 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, | |
constant: 'C', operator: '+=', rhs: '42')), | |
const Test( | |
''' | |
typedef F(); | |
m(a) => F += 42; | |
''', | |
const Visit(VisitKind.VISIT_TYPEDEF_TYPE_LITERAL_COMPOUND, | |
constant: '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, | |
constant: 'dynamic', | |
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 | |
errorInvalidAssert( | |
Send node, | |
NodeList arguments, | |
arg) { | |
// TODO: implement errorAssert | |
} | |
@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 | |
visitIndex( | |
Send node, | |
Node receiver, | |
Node index, | |
arg) { | |
visits.add(new Visit(VisitKind.VISIT_INDEX, | |
receiver: receiver, index: index)); | |
apply(receiver, arg); | |
apply(index, arg); | |
} | |
@override | |
visitClassTypeLiteralGet( | |
Send node, | |
TypeConstantExpression constant, | |
arg) { | |
visits.add(new Visit(VisitKind.VISIT_CLASS_TYPE_LITERAL_GET, | |
constant: constant.getText())); | |
} | |
@override | |
visitClassTypeLiteralInvoke( | |
Send node, | |
TypeConstantExpression constant, | |
NodeList arguments, | |
Selector selector, | |
arg) { | |
visits.add(new Visit(VisitKind.VISIT_CLASS_TYPE_LITERAL_INVOKE, | |
constant: constant.getText(), arguments: arguments)); | |
apply(arguments, arg); | |
} | |
@override | |
errorClassTypeLiteralSet( | |
SendSet node, | |
TypeConstantExpression constant, | |
Node rhs, | |
arg) { | |
visits.add(new Visit(VisitKind.VISIT_CLASS_TYPE_LITERAL_INVOKE, | |
constant: constant.getText(), 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, | |
TypeConstantExpression constant, | |
arg) { | |
visits.add(new Visit(VisitKind.VISIT_DYNAMIC_TYPE_LITERAL_GET, | |
constant: constant.getText())); | |
} | |
@override | |
visitDynamicTypeLiteralInvoke( | |
Send node, | |
TypeConstantExpression constant, | |
NodeList arguments, | |
Selector selector, | |
arg) { | |
visits.add(new Visit(VisitKind.VISIT_DYNAMIC_TYPE_LITERAL_INVOKE, | |
constant: constant.getText(), arguments: arguments)); | |
} | |
@override | |
errorDynamicTypeLiteralSet( | |
Send node, | |
TypeConstantExpression constant, | |
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 | |
visitLogicalAnd( | |
Send node, | |
Node left, | |
Node right, | |
arg) { | |
visits.add(new Visit(VisitKind.VISIT_LOGICAL_AND, | |
left: left, right: right)); | |
apply(left, arg); | |
apply(right, arg); | |
} | |
@override | |
visitLogicalOr( | |
Send node, | |
Node left, | |
Node right, | |
arg) { | |
visits.add(new Visit(VisitKind.VISIT_LOGICAL_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, selector: selector)); | |
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, selector: selector)); | |
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, selector: selector)); | |
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 | |
visitSuperIndex( | |
Send node, | |
FunctionElement function, | |
Node index, | |
arg) { | |
visits.add(new Visit(VisitKind.VISIT_SUPER_INDEX, | |
element: function, index: index)); | |
apply(index, 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, | |
TypeConstantExpression constant, | |
arg) { | |
visits.add(new Visit(VisitKind.VISIT_TYPEDEF_TYPE_LITERAL_GET, | |
constant: constant.getText())); | |
} | |
@override | |
visitTypedefTypeLiteralInvoke( | |
Send node, | |
TypeConstantExpression constant, | |
NodeList arguments, | |
Selector selector, | |
arg) { | |
visits.add(new Visit(VisitKind.VISIT_TYPEDEF_TYPE_LITERAL_INVOKE, | |
constant: constant.getText(), arguments: arguments)); | |
apply(arguments, arg); | |
} | |
@override | |
errorTypedefTypeLiteralSet( | |
SendSet node, | |
TypeConstantExpression constant, | |
Node rhs, | |
arg) { | |
visits.add(new Visit(VisitKind.VISIT_TYPEDEF_TYPE_LITERAL_SET, | |
constant: constant.getText(), 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 | |
errorClassTypeLiteralCompound( | |
Send node, | |
TypeConstantExpression constant, | |
AssignmentOperator operator, | |
Node rhs, | |
arg) { | |
visits.add(new Visit(VisitKind.ERROR_CLASS_TYPE_LITERAL_COMPOUND, | |
constant: constant.getText(), operator: operator, rhs: rhs)); | |
apply(rhs, arg); | |
} | |
@override | |
errorDynamicTypeLiteralCompound( | |
Send node, | |
TypeConstantExpression constant, | |
AssignmentOperator operator, | |
Node rhs, | |
arg) { | |
visits.add(new Visit(VisitKind.ERROR_DYNAMIC_TYPE_LITERAL_COMPOUND, | |
constant: constant.getText(), operator: operator, rhs: rhs)); | |
apply(rhs, arg); | |
} | |
@override | |
errorTypeVariableTypeLiteralCompound( | |
Send node, | |
TypeVariableElement element, | |
AssignmentOperator operator, | |
Node rhs, | |
arg) { | |
visits.add(new Visit(VisitKind.ERROR_TYPE_VARIABLE_TYPE_LITERAL_COMPOUND, | |
element: element, operator: operator, rhs: rhs)); | |
apply(rhs, arg); | |
} | |
@override | |
errorTypedefTypeLiteralCompound( | |
Send node, | |
TypeConstantExpression constant, | |
AssignmentOperator operator, | |
Node rhs, | |
arg) { | |
visits.add(new Visit(VisitKind.ERROR_TYPEDEF_TYPE_LITERAL_COMPOUND, | |
constant: constant.getText(), operator: operator, rhs: rhs)); | |
apply(rhs, arg); | |
} | |
@override | |
errorLocalFunctionPrefix( | |
Send node, | |
LocalFunctionElement function, | |
IncDecOperator operator, | |
arg) { | |
// TODO: implement errorLocalFunctionPrefix | |
} | |
@override | |
errorClassTypeLiteralPrefix( | |
Send node, | |
TypeConstantExpression constant, | |
IncDecOperator operator, | |
arg) { | |
visits.add(new Visit(VisitKind.ERROR_CLASS_TYPE_LITERAL_PREFIX, | |
constant: constant.getText(), operator: operator)); | |
} | |
@override | |
errorDynamicTypeLiteralPrefix( | |
Send node, | |
TypeConstantExpression constant, | |
IncDecOperator operator, | |
arg) { | |
visits.add(new Visit(VisitKind.ERROR_DYNAMIC_TYPE_LITERAL_PREFIX, | |
constant: constant.getText(), 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 | |
errorTypeVariableTypeLiteralPrefix( | |
Send node, | |
TypeVariableElement element, | |
IncDecOperator operator, | |
arg) { | |
visits.add(new Visit(VisitKind.ERROR_TYPE_VARIABLE_TYPE_LITERAL_PREFIX, | |
element: element, operator: operator)); | |
} | |
@override | |
errorTypedefTypeLiteralPrefix( | |
Send node, | |
TypeConstantExpression constant, | |
IncDecOperator operator, | |
arg) { | |
visits.add(new Visit(VisitKind.ERROR_TYPEDEF_TYPE_LITERAL_PREFIX, | |
constant: constant.getText(), operator: operator)); | |
} | |
@override | |
errorLocalFunctionPostfix( | |
Send node, | |
LocalFunctionElement function, | |
IncDecOperator operator, | |
arg) { | |
// TODO: implement errorLocalFunctionPostfix | |
} | |
@override | |
errorClassTypeLiteralPostfix( | |
Send node, | |
TypeConstantExpression constant, | |
IncDecOperator operator, | |
arg) { | |
visits.add(new Visit(VisitKind.ERROR_CLASS_TYPE_LITERAL_POSTFIX, | |
constant: constant.getText(), operator: operator)); | |
} | |
@override | |
errorDynamicTypeLiteralPostfix( | |
Send node, | |
TypeConstantExpression constant, | |
IncDecOperator operator, | |
arg) { | |
visits.add(new Visit(VisitKind.ERROR_DYNAMIC_TYPE_LITERAL_POSTFIX, | |
constant: constant.getText(), 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 | |
errorTypeVariableTypeLiteralPostfix( | |
Send node, | |
TypeVariableElement element, | |
IncDecOperator operator, | |
arg) { | |
visits.add(new Visit(VisitKind.ERROR_TYPE_VARIABLE_TYPE_LITERAL_POSTFIX, | |
element: element, operator: operator)); | |
} | |
@override | |
errorTypedefTypeLiteralPostfix( | |
Send node, | |
TypeConstantExpression constant, | |
IncDecOperator operator, | |
arg) { | |
visits.add(new Visit(VisitKind.ERROR_TYPEDEF_TYPE_LITERAL_POSTFIX, | |
constant: constant.getText(), operator: operator)); | |
} | |
@override | |
visitConstantGet( | |
Send node, | |
ConstantExpression constant, | |
arg) { | |
// TODO: implement visitConstantGet | |
} | |
@override | |
visitConstantInvoke( | |
Send node, | |
ConstantExpression constant, | |
NodeList arguments, | |
Selector selector, | |
arg) { | |
// TODO: implement visitConstantInvoke | |
} | |
@override | |
errorUnresolvedCompound( | |
Send node, | |
ErroneousElement element, | |
AssignmentOperator operator, | |
Node rhs, | |
arg) { | |
// TODO: implement errorUnresolvedCompound | |
} | |
@override | |
errorUnresolvedGet( | |
Send node, | |
ErroneousElement element, | |
arg) { | |
// TODO: implement errorUnresolvedGet | |
} | |
@override | |
errorUnresolvedInvoke( | |
Send node, | |
ErroneousElement element, | |
NodeList arguments, | |
Selector selector, | |
arg) { | |
// TODO: implement errorUnresolvedInvoke | |
} | |
@override | |
errorUnresolvedPostfix( | |
Send node, | |
ErroneousElement element, | |
IncDecOperator operator, | |
arg) { | |
// TODO: implement errorUnresolvedPostfix | |
} | |
@override | |
errorUnresolvedPrefix( | |
Send node, | |
ErroneousElement element, | |
IncDecOperator operator, | |
arg) { | |
// TODO: implement errorUnresolvedPrefix | |
} | |
@override | |
errorUnresolvedSet( | |
Send node, | |
ErroneousElement element, | |
Node rhs, | |
arg) { | |
// TODO: implement errorUnresolvedSet | |
} | |
@override | |
errorUndefinedBinaryExpression( | |
Send node, | |
Node left, | |
Operator operator, | |
Node right, | |
arg) { | |
// TODO: implement errorUndefinedBinaryExpression | |
} | |
@override | |
errorUndefinedUnaryExpression( | |
Send node, | |
Operator operator, | |
Node expression, | |
arg) { | |
// TODO: implement errorUndefinedUnaryExpression | |
} | |
@override | |
errorUnresolvedSuperBinary( | |
Send node, | |
ErroneousElement element, | |
BinaryOperator operator, | |
Node argument, | |
arg) { | |
// TODO: implement errorUnresolvedSuperBinary | |
} | |
@override | |
errorUnresolvedSuperCompoundIndexSet( | |
Send node, | |
ErroneousElement element, | |
Node index, | |
AssignmentOperator operator, | |
Node rhs, | |
arg) { | |
// TODO: implement errorUnresolvedSuperCompoundIndexSet | |
} | |
@override | |
errorUnresolvedSuperIndexSet( | |
Send node, | |
ErroneousElement element, | |
Node index, | |
Node rhs, | |
arg) { | |
// TODO: implement errorUnresolvedSuperIndexSet | |
} | |
@override | |
errorUnresolvedSuperUnary( | |
Send node, | |
UnaryOperator operator, | |
ErroneousElement element, | |
arg) { | |
// TODO: implement errorUnresolvedSuperUnary | |
} | |
@override | |
errorUnresolvedSuperIndex( | |
Send node, | |
Element element, | |
Node index, | |
arg) { | |
// TODO: implement errorUnresolvedSuperIndex | |
} | |
@override | |
errorUnresolvedSuperIndexPostfix( | |
Send node, | |
Element function, | |
Node index, | |
IncDecOperator operator, | |
arg) { | |
// TODO: implement errorUnresolvedSuperIndexPostfix | |
} | |
@override | |
errorUnresolvedSuperIndexPrefix( | |
Send node, | |
Element function, | |
Node index, | |
IncDecOperator operator, | |
arg) { | |
// TODO: implement errorUnresolvedSuperIndexPrefix | |
} | |
@override | |
visitIndexPostfix( | |
Send node, | |
Node receiver, | |
Node index, | |
IncDecOperator operator, | |
arg) { | |
visits.add(new Visit(VisitKind.VISIT_INDEX_POSTFIX, | |
receiver: receiver, index: index, operator: operator)); | |
apply(receiver, arg); | |
apply(index, arg); | |
} | |
@override | |
visitIndexPrefix( | |
Send node, | |
Node receiver, | |
Node index, | |
IncDecOperator operator, | |
arg) { | |
visits.add(new Visit(VisitKind.VISIT_INDEX_PREFIX, | |
receiver: receiver, index: index, operator: operator)); | |
apply(receiver, arg); | |
apply(index, arg); | |
} | |
@override | |
visitSuperIndexPostfix( | |
Send node, | |
FunctionElement indexFunction, | |
FunctionElement indexSetFunction, | |
Node index, | |
IncDecOperator operator, | |
arg) { | |
visits.add(new Visit(VisitKind.VISIT_SUPER_INDEX_POSTFIX, | |
getter: indexFunction, setter: indexSetFunction, | |
index: index, operator: operator)); | |
apply(index, arg); | |
} | |
@override | |
visitSuperIndexPrefix( | |
Send node, | |
FunctionElement indexFunction, | |
FunctionElement indexSetFunction, | |
Node index, | |
IncDecOperator operator, | |
arg) { | |
visits.add(new Visit(VisitKind.VISIT_SUPER_INDEX_PREFIX, | |
getter: indexFunction, setter: indexSetFunction, | |
index: index, operator: operator)); | |
apply(index, arg); | |
} | |
} | |
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_INDEX, | |
VISIT_EQUALS, | |
VISIT_NOT_EQUALS, | |
VISIT_INDEX_PREFIX, | |
VISIT_INDEX_POSTFIX, | |
VISIT_SUPER_BINARY, | |
VISIT_SUPER_INDEX, | |
VISIT_SUPER_EQUALS, | |
VISIT_SUPER_NOT_EQUALS, | |
VISIT_SUPER_INDEX_PREFIX, | |
VISIT_SUPER_INDEX_POSTFIX, | |
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, | |
ERROR_CLASS_TYPE_LITERAL_COMPOUND, | |
ERROR_CLASS_TYPE_LITERAL_PREFIX, | |
ERROR_CLASS_TYPE_LITERAL_POSTFIX, | |
VISIT_TYPEDEF_TYPE_LITERAL_GET, | |
VISIT_TYPEDEF_TYPE_LITERAL_SET, | |
VISIT_TYPEDEF_TYPE_LITERAL_INVOKE, | |
VISIT_TYPEDEF_TYPE_LITERAL_BINARY, | |
ERROR_TYPEDEF_TYPE_LITERAL_COMPOUND, | |
ERROR_TYPEDEF_TYPE_LITERAL_PREFIX, | |
ERROR_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, | |
ERROR_TYPE_VARIABLE_TYPE_LITERAL_COMPOUND, | |
ERROR_TYPE_VARIABLE_TYPE_LITERAL_PREFIX, | |
ERROR_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, | |
ERROR_DYNAMIC_TYPE_LITERAL_COMPOUND, | |
ERROR_DYNAMIC_TYPE_LITERAL_PREFIX, | |
ERROR_DYNAMIC_TYPE_LITERAL_POSTFIX, | |
VISIT_INDEX_SET, | |
VISIT_COMPOUND_INDEX_SET, | |
VISIT_SUPER_INDEX_SET, | |
VISIT_SUPER_COMPOUND_INDEX_SET, | |
VISIT_ASSERT, | |
VISIT_LOGICAL_AND, | |
VISIT_LOGICAL_OR, | |
VISIT_IS, | |
VISIT_IS_NOT, | |
VISIT_AS, | |
// TODO(johnniwinther): Add tests for error cases. | |
} |