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

Unified Diff: tests/compiler/dart2js/semantic_visitor_test_send_data.dart

Issue 1168393003: Enforce LF line endings in the git database. (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: rebase Created 5 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: tests/compiler/dart2js/semantic_visitor_test_send_data.dart
diff --git a/tests/compiler/dart2js/semantic_visitor_test_send_data.dart b/tests/compiler/dart2js/semantic_visitor_test_send_data.dart
index ebad7892b46f2814d3035d043e93c5f93366b0f8..514aa2a37aaf1da074cf8db57784ea1b6cb61853 100644
--- a/tests/compiler/dart2js/semantic_visitor_test_send_data.dart
+++ b/tests/compiler/dart2js/semantic_visitor_test_send_data.dart
@@ -1,3567 +1,3567 @@
-// 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.
-
-part of dart2js.semantics_visitor_test;
-
-const Map<String, List<Test>> SEND_TESTS = const {
- 'Parameters': 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: 'CallStructure(arity=2)')),
- // TODO(johnniwinther): Expect [VISIT_FINAL_PARAMETER_SET] instead.
- const Test('m(final o) { o = 42; }',
- const Visit(VisitKind.VISIT_UNRESOLVED_SET,
- name: 'o',
- rhs:'42')),
- ],
- 'Local variables': const [
- // 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: 'CallStructure(arity=2)')),
- // TODO(johnniwinther): Expect [VISIT_FINAL_LOCAL_VARIABLE_SET] instead.
- const Test('m() { final o = 0; o = 42; }',
- const Visit(VisitKind.VISIT_UNRESOLVED_SET,
- name: 'o',
- rhs:'42')),
- // TODO(johnniwinther): Expect [VISIT_FINAL_LOCAL_VARIABLE_SET] instead.
- const Test('m() { const o = 0; o = 42; }',
- const Visit(VisitKind.VISIT_UNRESOLVED_SET,
- name: 'o',
- rhs:'42')),
- ],
- 'Local functions': const [
- // 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: 'CallStructure(arity=2)')),
- const Test('m() { o(a) {}; o(null, 42); }',
- const Visit(VisitKind.VISIT_LOCAL_FUNCTION_INCOMPATIBLE_INVOKE,
- element: 'function(m#o)',
- arguments: '(null,42)',
- selector: 'CallStructure(arity=2)')),
- // TODO(johnniwinther): Expect [VISIT_LOCAL_FUNCTION_SET] instead.
- const Test('m() { o(a, b) {}; o = 42; }',
- const Visit(VisitKind.VISIT_UNRESOLVED_SET,
- name: 'o',
- rhs: '42')),
- ],
- 'Static fields': const [
- // 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 {
- var o;
- }
- m() => C.o;
- ''',
- const Visit(VisitKind.VISIT_UNRESOLVED_GET,
- name: 'o')),
- const Test(
- '''
- class C {
- C.o();
- }
- m() => C.o;
- ''',
- const Visit(VisitKind.VISIT_UNRESOLVED_GET,
- name: 'o')),
- const Test(
- '''
- class C {}
- m() => C.this;
- ''',
- null),
- 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)')),
- const Test(
- '''
- class C {}
- m() => C.this(null, 42);
- ''',
- const Visit(VisitKind.VISIT_UNRESOLVED_INVOKE,
- name: 'this', arguments: '(null,42)')),
- // TODO(johnniwinther): Expect [VISIT_FINAL_STATIC_FIELD_SET] instead.
- const Test(
- '''
- class C { static final o = 0; }
- m() { C.o = 42; }
- ''',
- const Visit(VisitKind.VISIT_UNRESOLVED_SET,
- name: 'o',
- rhs: '42')),
- const Test.clazz(
- '''
- class C {
- static final o = 0;
- m() { o = 42; }
- }
- ''',
- const Visit(VisitKind.VISIT_UNRESOLVED_SET,
- name: 'o',
- rhs: '42')),
- const Test.clazz(
- '''
- class C {
- static final o = 0;
- m() { C.o = 42; }
- }
- ''',
- const Visit(VisitKind.VISIT_UNRESOLVED_SET,
- name: 'o',
- rhs: '42')),
- const Test.prefix(
- '''
- class C {
- static final o = 0;
- }
- ''',
- 'm() { p.C.o = 42; }',
- const Visit(VisitKind.VISIT_UNRESOLVED_SET,
- name: 'o',
- rhs: '42')),
- const Test(
- '''
- class C { static const o = 0; }
- m() { C.o = 42; }
- ''',
- const Visit(VisitKind.VISIT_UNRESOLVED_SET,
- name: 'o',
- rhs: '42')),
- const Test.clazz(
- '''
- class C {
- static const o = 0;
- m() { o = 42; }
- }
- ''',
- const Visit(VisitKind.VISIT_UNRESOLVED_SET,
- name: 'o',
- rhs: '42')),
- const Test.clazz(
- '''
- class C {
- static const o = 0;
- m() { C.o = 42; }
- }
- ''',
- const Visit(VisitKind.VISIT_UNRESOLVED_SET,
- name: 'o',
- rhs: '42')),
- const Test.prefix(
- '''
- class C {
- static const o = 0;
- }
- ''',
- 'm() { p.C.o = 42; }',
- const Visit(VisitKind.VISIT_UNRESOLVED_SET,
- name: 'o',
- rhs: '42')),
- ],
- 'Static properties': const [
- // 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)')),
- // TODO(johnniwinther): Expected [VISIT_STATIC_GETTER_SET] instead.
- const Test(
- '''
- class C { static get o => 42; }
- m() { C.o = 42; }
- ''',
- const Visit(VisitKind.VISIT_UNRESOLVED_SET,
- name: 'o',
- rhs: '42')),
- const Test.clazz(
- '''
- class C {
- static get o => 42;
- m() { o = 42; }
- }
- ''',
- const Visit(VisitKind.VISIT_UNRESOLVED_SET,
- name: 'o',
- rhs: '42')),
- const Test.clazz(
- '''
- class C {
- static get o => 42;
- m() { C.o = 42; }
- }
- ''',
- const Visit(VisitKind.VISIT_UNRESOLVED_SET,
- name: 'o',
- rhs: '42')),
- const Test.prefix(
- '''
- class C {
- static get o => 42;
- }
- ''',
- 'm() { p.C.o = 42; }',
- const Visit(VisitKind.VISIT_UNRESOLVED_SET,
- name: 'o',
- rhs: '42')),
- const Test(
- '''
- class C {
- static set o(_) {}
- }
- m() => C.o;
- ''',
- const Visit(VisitKind.VISIT_STATIC_SETTER_GET,
- element: 'setter(C#o)')),
- const Test.clazz(
- '''
- class C {
- static set o(_) {}
- m() => o;
- }
- ''',
- const Visit(VisitKind.VISIT_STATIC_SETTER_GET,
- element: 'setter(C#o)')),
-
- const Test.clazz(
- '''
- class C {
- static set o(_) {}
- m() => C.o;
- }
- ''',
- const Visit(VisitKind.VISIT_STATIC_SETTER_GET,
- element: 'setter(C#o)')),
- const Test.prefix(
- '''
- class C {
- static set o(_) {}
- }
- ''',
- 'm() => p.C.o;',
- const Visit(VisitKind.VISIT_STATIC_SETTER_GET,
- element: 'setter(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)')),
- const Test(
- '''
- class C { static set o(_) {} }
- m() => C.o(null, 42);
- ''',
- const Visit(VisitKind.VISIT_STATIC_SETTER_INVOKE,
- element: 'setter(C#o)',
- arguments: '(null,42)')),
- const Test.clazz(
- '''
- class C {
- static set o(_) {}
- m() { o(null, 42); }
- }
- ''',
- const Visit(VisitKind.VISIT_STATIC_SETTER_INVOKE,
- element: 'setter(C#o)',
- arguments: '(null,42)')),
- const Test.clazz(
- '''
- class C {
- static set o(_) {}
- m() { C.o(null, 42); }
- }
- ''',
- const Visit(VisitKind.VISIT_STATIC_SETTER_INVOKE,
- element: 'setter(C#o)',
- arguments: '(null,42)')),
- const Test.prefix(
- '''
- class C {
- static set o(_) {}
- }
- ''',
- 'm() { p.C.o(null, 42); }',
- const Visit(VisitKind.VISIT_STATIC_SETTER_INVOKE,
- element: 'setter(C#o)',
- arguments: '(null,42)')),
- ],
- 'Static functions': const [
- // 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)')),
- // TODO(johnniwinther): Expect [VISIT_STATIC_FUNCTION_SET] instead.
- const Test(
- '''
- class C { static o(a, b) {} }
- m() { C.o = 42; }
- ''',
- const Visit(VisitKind.VISIT_UNRESOLVED_SET,
- name: 'o',
- rhs: '42')),
- const Test.clazz(
- '''
- class C {
- static o(a, b) {}
- m() { o = 42; }
- }
- ''',
- const Visit(VisitKind.VISIT_UNRESOLVED_SET,
- name: 'o',
- rhs: '42')),
- const Test.clazz(
- '''
- class C {
- static o(a, b) {}
- m() { C.o = 42; }
- }
- ''',
- const Visit(VisitKind.VISIT_UNRESOLVED_SET,
- name: 'o',
- rhs: '42')),
- const Test.prefix(
- '''
- class C { static o(a, b) {} }
- ''',
- '''
- m() { p.C.o = 42; }
- ''',
- const Visit(VisitKind.VISIT_UNRESOLVED_SET,
- name: 'o',
- rhs: '42')),
- 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)')),
- const Test(
- '''
- class C { static o(a, b) {} }
- m() => C.o(null);
- ''',
- const Visit(VisitKind.VISIT_STATIC_FUNCTION_INCOMPATIBLE_INVOKE,
- element: 'function(C#o)',
- arguments: '(null)')),
- ],
- 'Top level fields': const [
- // 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')),
- // TODO(johnniwinther): Expect [VISIT_FINAL_TOP_LEVEL_FIELD_SET] instead.
- const Test(
- '''
- final o = 0;
- m() { o = 42; }
- ''',
- const Visit(VisitKind.VISIT_UNRESOLVED_SET,
- name: 'o',
- rhs: '42')),
- const Test.prefix(
- '''
- final o = 0;
- ''',
- 'm() { p.o = 42; }',
- const Visit(VisitKind.VISIT_UNRESOLVED_SET,
- name: 'o',
- rhs: '42')),
- const Test(
- '''
- const o = 0;
- m() { o = 42; }
- ''',
- const Visit(VisitKind.VISIT_UNRESOLVED_SET,
- name: 'o',
- rhs: '42')),
- const Test.prefix(
- '''
- const o = 0;
- ''',
- 'm() { p.o = 42; }',
- const Visit(VisitKind.VISIT_UNRESOLVED_SET,
- name: '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)')),
- const Test(
- '''
- m() => o;
- ''',
- const Visit(VisitKind.VISIT_UNRESOLVED_GET,
- name: 'o')),
- ],
- 'Top level properties': const [
- // 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)')),
- // TODO(johnniwinther): Expect [VISIT_TOP_LEVEL_SETTER_GET] instead.
- const Test(
- '''
- set o(_) {}
- m() => o;
- ''',
- const Visit(VisitKind.VISIT_TOP_LEVEL_SETTER_GET,
- element: 'setter(o)')),
- const Test.prefix(
- '''
- set o(_) {}
- ''',
- '''
- m() => p.o;
- ''',
- const Visit(VisitKind.VISIT_UNRESOLVED_GET,
- name: 'o')),
- // TODO(johnniwinther): Expect [VISIT_TOP_LEVEL_GETTER_SET] instead.
- const Test(
- '''
- get o => null;
- m() { o = 42; }
- ''',
- const Visit(VisitKind.VISIT_UNRESOLVED_SET,
- name: 'o',
- rhs: '42')),
- const Test.prefix(
- '''
- get o => null;
- ''',
- 'm() { p.o = 42; }',
- const Visit(VisitKind.VISIT_UNRESOLVED_SET,
- name: 'o',
- rhs: '42')),
- 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)')),
- // TODO(johnniwinther): Expected [VISIT_TOP_LEVEL_SETTER_INVOKE] instead.
- const Test(
- '''
- set o(_) {}
- m() => o(null, 42);
- ''',
- const Visit(VisitKind.VISIT_TOP_LEVEL_SETTER_INVOKE,
- element: 'setter(o)',
- arguments: '(null,42)')),
- const Test.prefix(
- '''
- set o(_) {}
- ''',
- 'm() { p.o(null, 42); }',
- const Visit(VisitKind.VISIT_UNRESOLVED_INVOKE,
- name: 'o',
- arguments: '(null,42)')),
- ],
- 'Top level functions': const [
- // 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(
- '''
- o(a, b) {}
- m() => o(null);
- ''',
- const Visit(VisitKind.VISIT_TOP_LEVEL_FUNCTION_INCOMPATIBLE_INVOKE,
- element: 'function(o)',
- arguments: '(null)')),
- 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)')),
- const Test(
- '''
- m() => o(null, 42);
- ''',
- const Visit(VisitKind.VISIT_UNRESOLVED_INVOKE,
- name: 'o',
- arguments: '(null,42)')),
- // TODO(johnniwinther): Expect [VISIT_TOP_LEVEL_FUNCTION_SET] instead.
- const Test(
- '''
- o(a, b) {}
- m() { o = 42; }
- ''',
- const Visit(VisitKind.VISIT_UNRESOLVED_SET,
- name: 'o',
- rhs: '42')),
- const Test.prefix(
- '''
- o(a, b) {}
- ''',
- 'm() { p.o = 42; }',
- const Visit(VisitKind.VISIT_UNRESOLVED_SET,
- name: 'o',
- rhs: '42')),
- ],
- 'Dynamic properties': const [
- // Dynamic properties
- const Test('m(o) => o.foo;',
- const [
- const Visit(VisitKind.VISIT_DYNAMIC_PROPERTY_GET,
- receiver: 'o',
- name: 'foo'),
- const Visit(VisitKind.VISIT_PARAMETER_GET,
- element: 'parameter(m#o)'),
- ]),
- const Test('m(o) { o.foo = 42; }',
- const [
- const Visit(VisitKind.VISIT_DYNAMIC_PROPERTY_SET,
- receiver: 'o',
- name: 'foo',
- rhs: '42'),
- const Visit(VisitKind.VISIT_PARAMETER_GET,
- element: 'parameter(m#o)'),
- ]),
- const Test('m(o) { o.foo(null, 42); }',
- const [
- const Visit(VisitKind.VISIT_DYNAMIC_PROPERTY_INVOKE,
- receiver: 'o',
- name: 'foo',
- arguments: '(null,42)'),
- const Visit(VisitKind.VISIT_PARAMETER_GET,
- element: 'parameter(m#o)'),
- ]),
- ],
- 'This access': const [
- // 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 [
- // 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 [
- // 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')),
- // TODO(johnniwinther): Expect [VISIT_FINAL_SUPER_FIELD_SET] instead.
- const Test.clazz(
- '''
- class B {
- final o = 0;
- }
- class C extends B {
- m() { super.o = 42; }
- }
- ''',
- const Visit(VisitKind.VISIT_UNRESOLVED_SET,
- name: '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)')),
- const Test.clazz(
- '''
- class B {
- }
- class C extends B {
- m() => super.o;
- }
- ''',
- const Visit(VisitKind.VISIT_UNRESOLVED_SUPER_GET)),
- ],
- 'Super properties': const [
- // 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;
- }
- ''',
- const Visit(VisitKind.VISIT_SUPER_SETTER_GET,
- element: 'setter(B#o)')),
- // TODO(johnniwinther): Expect [VISIT_SUPER_GETTER_SET] instead.
- const Test.clazz(
- '''
- class B {
- get o => 0;
- }
- class C extends B {
- m() { super.o = 42; }
- }
- ''',
- const Visit(VisitKind.VISIT_UNRESOLVED_SET,
- name: 'o',
- rhs: '42')),
- 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)')),
- const Test.clazz(
- '''
- class B {
- set o(_) {}
- }
- class C extends B {
- m() { super.o(null, 42); }
- }
- ''',
- const Visit(VisitKind.VISIT_SUPER_SETTER_INVOKE,
- element: 'setter(B#o)',
- arguments: '(null,42)')),
- ],
- 'Super methods': const [
- // 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)')),
- const Test.clazz(
- '''
- class B {
- o(a, b) {}
- }
- class C extends B {
- m() { super.o(null); }
- }
- ''',
- const Visit(VisitKind.VISIT_SUPER_METHOD_INCOMPATIBLE_INVOKE,
- element: 'function(B#o)',
- arguments: '(null)')),
- const Test.clazz(
- '''
- class B {
- }
- class C extends B {
- m() => super.o(null, 42);
- }
- ''',
- const Visit(VisitKind.VISIT_UNRESOLVED_SUPER_INVOKE,
- arguments: '(null,42)')),
- ],
- 'Expression invoke': const [
- // 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 [
- // 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)')),
- const Test(
- '''
- class C {}
- m() => C += 42;
- ''',
- const Visit(VisitKind.VISIT_CLASS_TYPE_LITERAL_COMPOUND,
- constant: 'C',
- operator: '+=',
- rhs: '42')),
- const Test(
- '''
- class C {}
- m() => ++C;
- ''',
- const Visit(VisitKind.VISIT_CLASS_TYPE_LITERAL_PREFIX,
- constant: 'C',
- operator: '++')),
- const Test(
- '''
- class C {}
- m() => C--;
- ''',
- const Visit(VisitKind.VISIT_CLASS_TYPE_LITERAL_POSTFIX,
- constant: 'C',
- operator: '--')),
- const Test(
- '''
- class C {}
- m() => (C).hashCode;
- ''',
- const [
- const Visit(VisitKind.VISIT_DYNAMIC_PROPERTY_GET,
- receiver: '(C)', name: 'hashCode'),
- const Visit(VisitKind.VISIT_CLASS_TYPE_LITERAL_GET,
- constant: 'C'),
- ]),
- ],
- 'Typedef type literals': const [
- // 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)')),
- const Test(
- '''
- typedef F();
- m() => F += 42;
- ''',
- const Visit(VisitKind.VISIT_TYPEDEF_TYPE_LITERAL_COMPOUND,
- constant: 'F',
- operator: '+=',
- rhs: '42')),
- const Test(
- '''
- typedef F();
- m() => ++F;
- ''',
- const Visit(VisitKind.VISIT_TYPEDEF_TYPE_LITERAL_PREFIX,
- constant: 'F',
- operator: '++')),
- const Test(
- '''
- typedef F();
- m() => F--;
- ''',
- const Visit(VisitKind.VISIT_TYPEDEF_TYPE_LITERAL_POSTFIX,
- constant: 'F',
- operator: '--')),
- ],
- 'Type variable type literals': const [
- // 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)')),
- const Test.clazz(
- '''
- class C<T> {
- m() => T += 42;
- }
- ''',
- const Visit(VisitKind.VISIT_TYPE_VARIABLE_TYPE_LITERAL_COMPOUND,
- element: 'type_variable(C#T)',
- operator: '+=',
- rhs: '42')),
- const Test.clazz(
- '''
- class C<T> {
- m() => ++T;
- }
- ''',
- const Visit(VisitKind.VISIT_TYPE_VARIABLE_TYPE_LITERAL_PREFIX,
- element: 'type_variable(C#T)',
- operator: '++')),
- const Test.clazz(
- '''
- class C<T> {
- m() => T--;
- }
- ''',
- const Visit(VisitKind.VISIT_TYPE_VARIABLE_TYPE_LITERAL_POSTFIX,
- element: 'type_variable(C#T)',
- operator: '--')),
-
- ],
- 'Dynamic type literals': const [
- // Dynamic type literals
- const Test(
- '''
- m() => dynamic;
- ''',
- const Visit(VisitKind.VISIT_DYNAMIC_TYPE_LITERAL_GET,
- constant: 'dynamic')),
- // TODO(johnniwinther): Update these to expect the constant to be `dynamic`
- // instead of `Type`. Currently the compile time constant evaluator cannot
- // detect `dynamic` as a constant subexpression.
- const Test(
- '''
- m() { dynamic(null, 42); }
- ''',
- const Visit(VisitKind.VISIT_DYNAMIC_TYPE_LITERAL_INVOKE,
- constant: 'Type',
- arguments: '(null,42)')),
- const Test(
- '''
- m() => dynamic += 42;
- ''',
- const Visit(VisitKind.VISIT_DYNAMIC_TYPE_LITERAL_COMPOUND,
- constant: 'Type',
- operator: '+=',
- rhs: '42')),
- const Test(
- '''
- m() => ++dynamic;
- ''',
- const Visit(VisitKind.VISIT_DYNAMIC_TYPE_LITERAL_PREFIX,
- constant: 'Type',
- operator: '++')),
- const Test(
- '''
- m() => dynamic--;
- ''',
- const Visit(VisitKind.VISIT_DYNAMIC_TYPE_LITERAL_POSTFIX,
- constant: 'Type',
- operator: '--')),
- ],
- 'Assert': const [
- // Assert
- const Test(
- '''
- m() { assert(false); }
- ''',
- const Visit(VisitKind.VISIT_ASSERT, expression: 'false')),
- const Test(
- '''
- m() { assert(); }
- ''',
- const Visit(VisitKind.ERROR_INVALID_ASSERT, arguments: '()')),
- const Test(
- '''
- m() { assert(42, true); }
- ''',
- const Visit(VisitKind.ERROR_INVALID_ASSERT, arguments: '(42,true)')),
- ],
- 'Logical and': const [
- // Logical and
- const Test(
- '''
- m() => true && false;
- ''',
- const Visit(VisitKind.VISIT_LOGICAL_AND, left: 'true', right: 'false')),
- ],
- 'Logical or': const [
- // Logical or
- const Test(
- '''
- m() => true || false;
- ''',
- const Visit(VisitKind.VISIT_LOGICAL_OR, left: 'true', right: 'false')),
- ],
- 'Is test': const [
- // Is test
- const Test(
- '''
- class C {}
- m() => 0 is C;
- ''',
- const Visit(VisitKind.VISIT_IS, expression: '0', type: 'C')),
- ],
- 'Is not test': const [
- // Is not test
- const Test(
- '''
- class C {}
- m() => 0 is! C;
- ''',
- const Visit(VisitKind.VISIT_IS_NOT, expression: '0', type: 'C')),
- ],
- 'As test': const [
- // As test
- const Test(
- '''
- class C {}
- m() => 0 as C;
- ''',
- const Visit(VisitKind.VISIT_AS, expression: '0', type: 'C')),
- ],
- 'Binary operators': const [
- // 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')),
- const Test.clazz(
- '''
- class B {}
- class C extends B {
- m() => super + 42;
- }
- ''',
- const Visit(VisitKind.VISIT_UNRESOLVED_SUPER_BINARY,
- operator: '+',
- right: '42')),
- const Test(
- '''
- m() => 2 === 3;
- ''',
- const Visit(VisitKind.ERROR_UNDEFINED_BINARY_EXPRESSION,
- left: '2', operator: '===', right: '3')),
- const Test(
- '''
- m() => 2 !== 3;
- ''',
- const Visit(VisitKind.ERROR_UNDEFINED_BINARY_EXPRESSION,
- left: '2', operator: '!==', right: '3')),
- ],
- 'Index': const [
- // 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 {
- }
- class C extends B {
- m() => super[42];
- }
- ''',
- const Visit(VisitKind.VISIT_UNRESOLVED_SUPER_INDEX,
- 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 []=(a, b) {}
- }
- class C extends B {
- m() => ++super[42];
- }
- ''',
- const Visit(VisitKind.VISIT_UNRESOLVED_SUPER_GETTER_INDEX_PREFIX,
- setter: 'function(B#[]=)',
- index: '42',
- operator: '++')),
- const Test.clazz(
- '''
- class B {
- }
- class C extends B {
- m() => ++super[42];
- }
- ''',
- const Visit(VisitKind.VISIT_UNRESOLVED_SUPER_INDEX_PREFIX,
- index: '42',
- operator: '++')),
- const Test.clazz(
- '''
- class B {
- operator [](_) => null;
- }
- class C extends B {
- m() => ++super[42];
- }
- ''',
- const Visit(VisitKind.VISIT_UNRESOLVED_SUPER_SETTER_INDEX_PREFIX,
- getter: '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: '--')),
- const Test.clazz(
- '''
- class B {
- operator []=(a, b) {}
- }
- class C extends B {
- m() => super[42]--;
- }
- ''',
- const Visit(VisitKind.VISIT_UNRESOLVED_SUPER_GETTER_INDEX_POSTFIX,
- setter: 'function(B#[]=)',
- index: '42',
- operator: '--')),
- const Test.clazz(
- '''
- class B {
- }
- class C extends B {
- m() => super[42]--;
- }
- ''',
- const Visit(VisitKind.VISIT_UNRESOLVED_SUPER_INDEX_POSTFIX,
- index: '42',
- operator: '--')),
- const Test.clazz(
- '''
- class B {
- operator [](_) => null;
- }
- class C extends B {
- m() => super[42]--;
- }
- ''',
- const Visit(VisitKind.VISIT_UNRESOLVED_SUPER_SETTER_INDEX_POSTFIX,
- getter: 'function(B#[])',
- index: '42',
- operator: '--')),
- ],
- 'Equals': const [
- // 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 [
- // Not equals
- const Test(
- '''
- m() => 2 != 3;
- ''',
- const Visit(VisitKind.VISIT_NOT_EQUALS,
- left: '2', right: '3')),
- 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 [
- // 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 {
- }
- class C extends B {
- m() => -super;
- }
- ''',
- const Visit(VisitKind.VISIT_UNRESOLVED_SUPER_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')),
- const Test(
- '''
- m() => +false;
- ''',
- // TODO(johnniwinther): Should this be an
- // ERROR_UNDEFINED_UNARY_EXPRESSION? Currently the parser just skips
- // the `+`.
- const []),
- ],
- 'Index set': const [
- // 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')),
- const Test.clazz(
- '''
- class B {
- }
- class C extends B {
- m() => super[1] = 2;
- }
- ''',
- const Visit(VisitKind.VISIT_UNRESOLVED_SUPER_INDEX_SET,
- index: '1', rhs: '2')),
- ],
- 'Compound assignment': const [
- // 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)')
- ]),
- const Test(
- '''
- m(a) => a += 42;
- ''',
- const Visit(VisitKind.VISIT_PARAMETER_COMPOUND,
- element: 'parameter(m#a)', operator: '+=', rhs: '42')),
- const Test(
- '''
- m(final a) => a += 42;
- ''',
- const Visit(VisitKind.VISIT_FINAL_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(
- '''
- m() {
- final a = 0;
- a += 42;
- }
- ''',
- const Visit(VisitKind.VISIT_FINAL_LOCAL_VARIABLE_COMPOUND,
- element: 'variable(m#a)', operator: '+=', rhs: '42')),
- const Test(
- '''
- m() {
- a() {}
- a += 42;
- }
- ''',
- const Visit(VisitKind.VISIT_LOCAL_FUNCTION_COMPOUND,
- element: 'function(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 {
- final a = 0;
- }
- class C extends B {
- m() => super.a += 42;
- }
- ''',
- const Visit(VisitKind.VISIT_SUPER_FINAL_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 = 0;
- }
-
- 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')),*/
- const Test.clazz(
- '''
- class B {
- a() {}
- }
- class C extends B {
- m() => super.a += 42;
- }
- ''',
- const Visit(VisitKind.VISIT_SUPER_METHOD_COMPOUND,
- element: 'function(B#a)',
- operator: '+=', rhs: '42')),
- const Test.clazz(
- '''
- class B {
- }
- class C extends B {
- m() => super.a += 42;
- }
- ''',
- const Visit(VisitKind.VISIT_UNRESOLVED_SUPER_COMPOUND,
- operator: '+=', rhs: '42')),
- const Test.clazz(
- '''
- class B {
- set a(_) {}
- }
- class C extends B {
- m() => super.a += 42;
- }
- ''',
- const Visit(VisitKind.VISIT_UNRESOLVED_SUPER_GETTER_COMPOUND,
- setter: 'setter(B#a)', operator: '+=', rhs: '42')),
- const Test.clazz(
- '''
- class B {
- get a => 42;
- }
- class C extends B {
- m() => super.a += 42;
- }
- ''',
- const Visit(VisitKind.VISIT_UNRESOLVED_SUPER_SETTER_COMPOUND,
- getter: 'getter(B#a)', operator: '+=', rhs: '42')),
-
- const Test.clazz(
- '''
- class C {
- static set a(var value) { }
- m() => a += 42;
- }
- ''',
- const Visit(VisitKind.VISIT_UNRESOLVED_STATIC_GETTER_COMPOUND,
- setter: 'setter(C#a)', operator: '+=', rhs: '42')),
-
- const Test.clazz(
- '''
- class C {
- static get a => 42;
- m() => C.a += 42;
- }
- ''',
- const Visit(VisitKind.VISIT_UNRESOLVED_STATIC_SETTER_COMPOUND,
- getter: 'getter(C#a)', operator: '+=', rhs: '42')),
-
- const Test.clazz(
- '''
- class C {
- static final a = 42;
- m() => C.a += 42;
- }
- ''',
- const Visit(VisitKind.VISIT_STATIC_FINAL_FIELD_COMPOUND,
- element: 'field(C#a)', operator: '+=', rhs: '42')),
-
- const Test(
- '''
- class C {
- static a(var value) { }
- }
- m() => C.a += 42;
- ''',
- const Visit(VisitKind.VISIT_STATIC_METHOD_COMPOUND,
- element: 'function(C#a)', operator: '+=', rhs: '42')),
-
- const Test(
- '''
- set a(var value) { }
- m() => a += 42;
- ''',
- const Visit(VisitKind.VISIT_UNRESOLVED_TOP_LEVEL_GETTER_COMPOUND,
- setter: 'setter(a)', operator: '+=', rhs: '42')),
-
- const Test(
- '''
- get a => 42;
- m() => a += 42;
- ''',
- const Visit(VisitKind.VISIT_UNRESOLVED_TOP_LEVEL_SETTER_COMPOUND,
- getter: 'getter(a)', operator: '+=', rhs: '42')),
-
- const Test(
- '''
- a(var value) { }
- m() => a += 42;
- ''',
- const Visit(VisitKind.VISIT_TOP_LEVEL_METHOD_COMPOUND,
- element: 'function(a)', operator: '+=', rhs: '42')),
-
- const Test(
- '''
- final a = 42;
- m() => a += 42;
- ''',
- const Visit(VisitKind.VISIT_TOP_LEVEL_FINAL_FIELD_COMPOUND,
- element: 'field(a)', operator: '+=', rhs: '42')),
-
- const Test(
- '''
- m() => unresolved += 42;
- ''',
- const Visit(VisitKind.VISIT_UNRESOLVED_COMPOUND,
- operator: '+=', rhs: '42')),
- ],
- 'Compound index assignment': const [
- // Compound index assignment
- const Test(
- '''
- m() => 0[1] += 42;
- ''',
- const Visit(VisitKind.VISIT_COMPOUND_INDEX_SET,
- receiver: '0', index: '1', operator: '+=', rhs: '42')),
- 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')),
- const Test.clazz(
- '''
- class B {
- operator []=(a, b) {}
- }
- class C extends B {
- m() => super[1] += 42;
- }
- ''',
- const Visit(VisitKind.VISIT_UNRESOLVED_SUPER_GETTER_COMPOUND_INDEX_SET,
- setter: 'function(B#[]=)',
- index: '1', operator: '+=', rhs: '42')),
- const Test.clazz(
- '''
- class B {
- }
- class C extends B {
- m() => super[1] += 42;
- }
- ''',
- const Visit(VisitKind.VISIT_UNRESOLVED_SUPER_COMPOUND_INDEX_SET,
- index: '1', operator: '+=', rhs: '42')),
- const Test.clazz(
- '''
- class B {
- operator [](_) {}
- }
- class C extends B {
- m() => super[1] += 42;
- }
- ''',
- const Visit(VisitKind.VISIT_UNRESOLVED_SUPER_SETTER_COMPOUND_INDEX_SET,
- getter: 'function(B#[])',
- index: '1', operator: '+=', rhs: '42')),
- ],
- 'Prefix expression': const [
- // 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(final a) => ++a;
- ''',
- const Visit(VisitKind.VISIT_FINAL_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(
- '''
- m() {
- final a = 42;
- --a;
- }
- ''',
- const Visit(VisitKind.VISIT_FINAL_LOCAL_VARIABLE_PREFIX,
- element: 'variable(m#a)', operator: '--')),
- const Test(
- '''
- m() {
- a() {}
- --a;
- }
- ''',
- const Visit(VisitKind.VISIT_LOCAL_FUNCTION_PREFIX,
- element: 'function(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 {
- final a = 0;
- }
- class C extends B {
- m() => --super.a;
- }
- ''',
- const Visit(VisitKind.VISIT_SUPER_FINAL_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: '++')),
- const Test.clazz(
- '''
- class B {
- a() {}
- }
- class C extends B {
- m() => ++super.a;
- }
- ''',
- const Visit(VisitKind.VISIT_SUPER_METHOD_PREFIX,
- element: 'function(B#a)',
- operator: '++')),
- const Test.clazz(
- '''
- class B {
- }
- class C extends B {
- m() => ++super.a;
- }
- ''',
- const Visit(VisitKind.VISIT_UNRESOLVED_SUPER_PREFIX,
- operator: '++')),
- const Test.clazz(
- '''
- class B {
- set a(_) {}
- }
- class C extends B {
- m() => ++super.a;
- }
- ''',
- const Visit(VisitKind.VISIT_UNRESOLVED_SUPER_GETTER_PREFIX,
- setter: 'setter(B#a)', operator: '++')),
- const Test.clazz(
- '''
- class B {
- get a => 42;
- }
- class C extends B {
- m() => ++super.a;
- }
- ''',
- const Visit(VisitKind.VISIT_UNRESOLVED_SUPER_SETTER_PREFIX,
- getter: 'getter(B#a)', operator: '++')),
-
- const Test.clazz(
- '''
- class C {
- static set a(var value) { }
- m() => ++a;
- }
- ''',
- const Visit(VisitKind.VISIT_UNRESOLVED_STATIC_GETTER_PREFIX,
- setter: 'setter(C#a)', operator: '++')),
-
- const Test.clazz(
- '''
- class C {
- static get a => 42;
- m() => ++C.a;
- }
- ''',
- const Visit(VisitKind.VISIT_UNRESOLVED_STATIC_SETTER_PREFIX,
- getter: 'getter(C#a)', operator: '++')),
-
- const Test.clazz(
- '''
- class C {
- static final a = 42;
- m() => ++C.a;
- }
- ''',
- const Visit(VisitKind.VISIT_STATIC_FINAL_FIELD_PREFIX,
- element: 'field(C#a)', operator: '++')),
-
- const Test(
- '''
- class C {
- static a(var value) { }
- }
- m() => ++C.a;
- ''',
- const Visit(VisitKind.VISIT_STATIC_METHOD_PREFIX,
- element: 'function(C#a)', operator: '++')),
-
- const Test(
- '''
- set a(var value) { }
- m() => ++a;
- ''',
- const Visit(VisitKind.VISIT_UNRESOLVED_TOP_LEVEL_GETTER_PREFIX,
- setter: 'setter(a)', operator: '++')),
-
- const Test(
- '''
- get a => 42;
- m() => ++a;
- ''',
- const Visit(VisitKind.VISIT_UNRESOLVED_TOP_LEVEL_SETTER_PREFIX,
- getter: 'getter(a)', operator: '++')),
-
- const Test(
- '''
- a(var value) { }
- m() => ++a;
- ''',
- const Visit(VisitKind.VISIT_TOP_LEVEL_METHOD_PREFIX,
- element: 'function(a)', operator: '++')),
-
- const Test(
- '''
- final a = 42;
- m() => ++a;
- ''',
- const Visit(VisitKind.VISIT_TOP_LEVEL_FINAL_FIELD_PREFIX,
- element: 'field(a)', operator: '++')),
-
- const Test(
- '''
- m() => ++unresolved;
- ''',
- const Visit(VisitKind.VISIT_UNRESOLVED_PREFIX,
- operator: '++')),
- ],
- 'Postfix expression': const [
- // Postfix 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(final a) => a++;
- ''',
- const Visit(VisitKind.VISIT_FINAL_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(
- '''
- m() {
- final a = 42;
- a--;
- }
- ''',
- const Visit(VisitKind.VISIT_FINAL_LOCAL_VARIABLE_POSTFIX,
- element: 'variable(m#a)', operator: '--')),
- const Test(
- '''
- m() {
- a() {}
- a--;
- }
- ''',
- const Visit(VisitKind.VISIT_LOCAL_FUNCTION_POSTFIX,
- element: 'function(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 {
- final a = 0;
- }
- class C extends B {
- m() => super.a--;
- }
- ''',
- const Visit(VisitKind.VISIT_SUPER_FINAL_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: '++')),
- const Test.clazz(
- '''
- class B {
- a() {}
- }
- class C extends B {
- m() => super.a++;
- }
- ''',
- const Visit(VisitKind.VISIT_SUPER_METHOD_POSTFIX,
- element: 'function(B#a)',
- operator: '++')),
- const Test.clazz(
- '''
- class B {
- }
- class C extends B {
- m() => super.a++;
- }
- ''',
- const Visit(VisitKind.VISIT_UNRESOLVED_SUPER_POSTFIX,
- operator: '++')),
- const Test.clazz(
- '''
- class B {
- set a(_) {}
- }
- class C extends B {
- m() => super.a++;
- }
- ''',
- const Visit(VisitKind.VISIT_UNRESOLVED_SUPER_GETTER_POSTFIX,
- setter: 'setter(B#a)', operator: '++')),
- const Test.clazz(
- '''
- class B {
- get a => 42;
- }
- class C extends B {
- m() => super.a++;
- }
- ''',
- const Visit(VisitKind.VISIT_UNRESOLVED_SUPER_SETTER_POSTFIX,
- getter: 'getter(B#a)', operator: '++')),
-
- const Test.clazz(
- '''
- class C {
- static set a(var value) { }
- m() => a++;
- }
- ''',
- const Visit(VisitKind.VISIT_UNRESOLVED_STATIC_GETTER_POSTFIX,
- setter: 'setter(C#a)', operator: '++')),
-
- const Test.clazz(
- '''
- class C {
- static get a => 42;
- m() => C.a++;
- }
- ''',
- const Visit(VisitKind.VISIT_UNRESOLVED_STATIC_SETTER_POSTFIX,
- getter: 'getter(C#a)', operator: '++')),
-
- const Test.clazz(
- '''
- class C {
- static final a = 42;
- m() => C.a++;
- }
- ''',
- const Visit(VisitKind.VISIT_STATIC_FINAL_FIELD_POSTFIX,
- element: 'field(C#a)', operator: '++')),
-
- const Test(
- '''
- class C {
- static a(var value) { }
- }
- m() => C.a++;
- ''',
- const Visit(VisitKind.VISIT_STATIC_METHOD_POSTFIX,
- element: 'function(C#a)', operator: '++')),
-
- const Test(
- '''
- set a(var value) { }
- m() => a++;
- ''',
- const Visit(VisitKind.VISIT_UNRESOLVED_TOP_LEVEL_GETTER_POSTFIX,
- setter: 'setter(a)', operator: '++')),
-
- const Test(
- '''
- get a => 42;
- m() => a++;
- ''',
- const Visit(VisitKind.VISIT_UNRESOLVED_TOP_LEVEL_SETTER_POSTFIX,
- getter: 'getter(a)', operator: '++')),
-
- const Test(
- '''
- a(var value) { }
- m() => a++;
- ''',
- const Visit(VisitKind.VISIT_TOP_LEVEL_METHOD_POSTFIX,
- element: 'function(a)', operator: '++')),
-
- const Test(
- '''
- final a = 42;
- m() => a++;
- ''',
- const Visit(VisitKind.VISIT_TOP_LEVEL_FINAL_FIELD_POSTFIX,
- element: 'field(a)', operator: '++')),
-
- const Test(
- '''
- m() => unresolved++;
- ''',
- const Visit(VisitKind.VISIT_UNRESOLVED_POSTFIX,
- operator: '++')),
- ],
- 'Constructor invocations': const [
- const Test(
- '''
- class Class {
- const Class(a, b);
- }
- m() => const Class(true, 42);
- ''',
- const Visit(VisitKind.VISIT_CONST_CONSTRUCTOR_INVOKE,
- constant: 'const Class(true, 42)')),
- const Test(
- '''
- m() => const bool.fromEnvironment('foo');
- ''',
- const Visit(VisitKind.VISIT_BOOL_FROM_ENVIRONMENT_CONSTRUCTOR_INVOKE,
- constant:
- 'const bool.fromEnvironment("foo")')),
- const Test(
- '''
- m() => const bool.fromEnvironment('foo', defaultValue: true);
- ''',
- const Visit(VisitKind.VISIT_BOOL_FROM_ENVIRONMENT_CONSTRUCTOR_INVOKE,
- constant: 'const bool.fromEnvironment("foo", defaultValue: true)')),
- const Test(
- '''
- m() => const int.fromEnvironment('foo');
- ''',
- const Visit(VisitKind.VISIT_INT_FROM_ENVIRONMENT_CONSTRUCTOR_INVOKE,
- constant: 'const int.fromEnvironment("foo")')),
- const Test(
- '''
- m() => const String.fromEnvironment('foo');
- ''',
- const Visit(VisitKind.VISIT_STRING_FROM_ENVIRONMENT_CONSTRUCTOR_INVOKE,
- constant:
- 'const String.fromEnvironment("foo")')),
- const Test(
- '''
- class Class {
- Class(a, b);
- }
- m() => const Class(true, 42);
- ''',
- const Visit(VisitKind.ERROR_NON_CONSTANT_CONSTRUCTOR_INVOKE,
- element: 'generative_constructor(Class#)',
- arguments: '(true,42)',
- type: 'Class',
- selector: 'CallStructure(arity=2)')),
- const Test(
- '''
- class Class {}
- m() => new Class();
- ''',
- const Visit(VisitKind.VISIT_GENERATIVE_CONSTRUCTOR_INVOKE,
- element: 'generative_constructor(Class#)',
- arguments: '()',
- type: 'Class',
- selector: 'CallStructure(arity=0)')),
- const Test(
- '''
- class Class {
- Class(a, b);
- }
- m() => new Class(true, 42);
- ''',
- const Visit(VisitKind.VISIT_GENERATIVE_CONSTRUCTOR_INVOKE,
- element: 'generative_constructor(Class#)',
- arguments: '(true,42)',
- type: 'Class',
- selector: 'CallStructure(arity=2)')),
- const Test(
- '''
- class Class {
- Class.named(a, b);
- }
- m() => new Class.named(true, 42);
- ''',
- const Visit(VisitKind.VISIT_GENERATIVE_CONSTRUCTOR_INVOKE,
- element: 'generative_constructor(Class#named)',
- arguments: '(true,42)',
- type: 'Class',
- selector: 'CallStructure(arity=2)')),
- const Test(
- '''
- class Class {}
- m() => new Class(true, 42);
- ''',
- const Visit(VisitKind.VISIT_CONSTRUCTOR_INCOMPATIBLE_INVOKE,
- element: 'generative_constructor(Class#)',
- arguments: '(true,42)',
- type: 'Class',
- selector: 'CallStructure(arity=2)')),
- const Test(
- '''
- class Class {
- Class(a, b) : this._(a, b);
- Class._(a, b);
- }
- m() => new Class(true, 42);
- ''',
- const Visit(VisitKind.VISIT_REDIRECTING_GENERATIVE_CONSTRUCTOR_INVOKE,
- element: 'generative_constructor(Class#)',
- arguments: '(true,42)',
- type: 'Class',
- selector: 'CallStructure(arity=2)')),
- const Test(
- '''
- class Class {
- Class() : this._(true, 42);
- Class._(a, b);
- }
- m() => new Class(true, 42);
- ''',
- const Visit(VisitKind.VISIT_CONSTRUCTOR_INCOMPATIBLE_INVOKE,
- element: 'generative_constructor(Class#)',
- arguments: '(true,42)',
- type: 'Class',
- selector: 'CallStructure(arity=2)')),
- const Test(
- '''
- class Class {
- factory Class(a, b) => new Class._(a, b);
- Class._(a, b);
- }
- m() => new Class(true, 42);
- ''',
- const Visit(VisitKind.VISIT_FACTORY_CONSTRUCTOR_INVOKE,
- element: 'function(Class#)',
- arguments: '(true,42)',
- type: 'Class',
- selector: 'CallStructure(arity=2)')),
- const Test(
- '''
- class Class {
- factory Class() => new Class._(true, 42);
- Class._(a, b);
- }
- m() => new Class(true, 42);
- ''',
- const Visit(VisitKind.VISIT_CONSTRUCTOR_INCOMPATIBLE_INVOKE,
- element: 'function(Class#)',
- arguments: '(true,42)',
- type: 'Class',
- selector: 'CallStructure(arity=2)')),
- const Test(
- '''
- class Class<T> {
- factory Class(a, b) = Class<int>.a;
- factory Class.a(a, b) = Class<Class<T>>.b;
- Class.b(a, b);
- }
- m() => new Class<double>(true, 42);
- ''',
- const Visit(VisitKind.VISIT_REDIRECTING_FACTORY_CONSTRUCTOR_INVOKE,
- element: 'function(Class#)',
- arguments: '(true,42)',
- type: 'Class<double>',
- target: 'generative_constructor(Class#b)',
- targetType: 'Class<Class<int>>',
- selector: 'CallStructure(arity=2)')),
- const Test(
- '''
- class Class<T> {
- factory Class(a) = Class<int>.a;
- factory Class.a(a, [b]) = Class<Class<T>>.b;
- Class.b(a, [b]);
- }
- m() => new Class<double>(true, 42);
- ''',
- const Visit(VisitKind.VISIT_REDIRECTING_FACTORY_CONSTRUCTOR_INVOKE,
- element: 'function(Class#)',
- arguments: '(true,42)',
- type: 'Class<double>',
- target: 'generative_constructor(Class#b)',
- targetType: 'Class<Class<int>>',
- selector: 'CallStructure(arity=2)')),
- const Test(
- '''
- class Class {
- factory Class() = Class._;
- Class._();
- }
- m() => new Class(true, 42);
- ''',
- const Visit(
- VisitKind.VISIT_UNRESOLVED_REDIRECTING_FACTORY_CONSTRUCTOR_INVOKE,
- element: 'function(Class#)',
- arguments: '(true,42)',
- type: 'Class',
- selector: 'CallStructure(arity=2)')),
- const Test(
- '''
- class Class<T> {
- factory Class(a, b) = Class<int>.a;
- factory Class.a(a, b) = Class<Class<T>>.b;
- Class.b(a);
- }
- m() => new Class<double>(true, 42);
- ''',
- const Visit(
- VisitKind.VISIT_UNRESOLVED_REDIRECTING_FACTORY_CONSTRUCTOR_INVOKE,
- element: 'function(Class#)',
- arguments: '(true,42)',
- type: 'Class<double>',
- selector: 'CallStructure(arity=2)')),
- const Test(
- '''
- class Class {
- Class(a, b);
- }
- m() => new Class.unresolved(true, 42);
- ''',
- const Visit(
- VisitKind.VISIT_UNRESOLVED_CONSTRUCTOR_INVOKE,
- arguments: '(true,42)')),
- const Test(
- '''
- m() => new Unresolved(true, 42);
- ''',
- const Visit(
- VisitKind.VISIT_UNRESOLVED_CLASS_CONSTRUCTOR_INVOKE,
- arguments: '(true,42)')),
- const Test(
- '''
- abstract class AbstractClass {}
- m() => new AbstractClass();
- ''',
- const Visit(
- VisitKind.VISIT_ABSTRACT_CLASS_CONSTRUCTOR_INVOKE,
- element: 'generative_constructor(AbstractClass#)',
- type: 'AbstractClass',
- arguments: '()',
- selector: 'CallStructure(arity=0)')),
- const Test(
- '''
- class Class {
- factory Class(a, b) = Unresolved;
- }
- m() => new Class(true, 42);
- ''',
- const Visit(
- VisitKind.VISIT_UNRESOLVED_REDIRECTING_FACTORY_CONSTRUCTOR_INVOKE,
- element: 'function(Class#)',
- arguments: '(true,42)',
- type: 'Class',
- selector: 'CallStructure(arity=2)')),
- const Test(
- '''
- class Class {
- factory Class(a, b) = Class.named;
- }
- m() => new Class(true, 42);
- ''',
- const Visit(
- VisitKind.VISIT_UNRESOLVED_REDIRECTING_FACTORY_CONSTRUCTOR_INVOKE,
- element: 'function(Class#)',
- arguments: '(true,42)',
- type: 'Class',
- selector: 'CallStructure(arity=2)')),
- const Test(
- '''
- class Class {
- factory Class(a, b) = Class.named;
- factory Class.named(a, b) = Class.unresolved;
- }
- m() => new Class(true, 42);
- ''',
- const Visit(
- VisitKind.VISIT_UNRESOLVED_REDIRECTING_FACTORY_CONSTRUCTOR_INVOKE,
- element: 'function(Class#)',
- arguments: '(true,42)',
- type: 'Class',
- selector: 'CallStructure(arity=2)')),
- const Test(
- '''
- abstract class AbstractClass {
- AbstractClass(a, b);
- }
- class Class {
- factory Class(a, b) = AbstractClass;
- }
- m() => new Class(true, 42);
- ''',
- const Visit(
- VisitKind.VISIT_UNRESOLVED_REDIRECTING_FACTORY_CONSTRUCTOR_INVOKE,
- element: 'function(Class#)',
- arguments: '(true,42)',
- type: 'Class',
- selector: 'CallStructure(arity=2)')),
- ],
- 'If not null expressions': const [
- const Test(
- '''
- m(a) => a?.b;
- ''',
- const [
- const Visit(
- VisitKind.VISIT_IF_NOT_NULL_DYNAMIC_PROPERTY_GET,
- receiver: 'a',
- name: 'b'),
- const Visit(
- VisitKind.VISIT_PARAMETER_GET,
- element: 'parameter(m#a)'),
- ]),
- const Test(
- '''
- class C {
- static var b;
- }
- m(a) => C?.b;
- ''',
- const [
- const Visit(
- VisitKind.VISIT_IF_NOT_NULL_DYNAMIC_PROPERTY_GET,
- receiver: 'C',
- name: 'b'),
- const Visit(
- VisitKind.VISIT_CLASS_TYPE_LITERAL_GET,
- constant: 'C'),
- ]),
- const Test(
- '''
- m(a) => a?.b = 42;
- ''',
- const [
- const Visit(
- VisitKind.VISIT_IF_NOT_NULL_DYNAMIC_PROPERTY_SET,
- receiver: 'a',
- name: 'b',
- rhs: '42'),
- const Visit(
- VisitKind.VISIT_PARAMETER_GET,
- element: 'parameter(m#a)'),
- ]),
- const Test(
- '''
- m(a) => a?.b(42, true);
- ''',
- const [
- const Visit(
- VisitKind.VISIT_IF_NOT_NULL_DYNAMIC_PROPERTY_INVOKE,
- receiver: 'a',
- arguments: '(42,true)',
- selector: 'Selector(call, b, arity=2)'),
- const Visit(
- VisitKind.VISIT_PARAMETER_GET,
- element: 'parameter(m#a)'),
- ]),
- const Test(
- '''
- m(a) => ++a?.b;
- ''',
- const [
- const Visit(
- VisitKind.VISIT_IF_NOT_NULL_DYNAMIC_PROPERTY_PREFIX,
- receiver: 'a',
- getter: 'Selector(getter, b, arity=0)',
- setter: 'Selector(setter, b, arity=1)',
- operator: '++'),
- const Visit(
- VisitKind.VISIT_PARAMETER_GET,
- element: 'parameter(m#a)'),
- ]),
- const Test(
- '''
- m(a) => a?.b--;
- ''',
- const [
- const Visit(
- VisitKind.VISIT_IF_NOT_NULL_DYNAMIC_PROPERTY_POSTFIX,
- receiver: 'a',
- getter: 'Selector(getter, b, arity=0)',
- setter: 'Selector(setter, b, arity=1)',
- operator: '--'),
- const Visit(
- VisitKind.VISIT_PARAMETER_GET,
- element: 'parameter(m#a)'),
- ]),
- const Test(
- '''
- m(a) => a?.b *= 42;
- ''',
- const [
- const Visit(
- VisitKind.VISIT_IF_NOT_NULL_DYNAMIC_PROPERTY_COMPOUND,
- receiver: 'a',
- getter: 'Selector(getter, b, arity=0)',
- setter: 'Selector(setter, b, arity=1)',
- operator: '*=',
- rhs: '42'),
- const Visit(
- VisitKind.VISIT_PARAMETER_GET,
- element: 'parameter(m#a)'),
- ]),
- const Test(
- '''
- m(a, b) => a ?? b;
- ''',
- const [
- const Visit(VisitKind.VISIT_IF_NULL,
- left: 'a', right: 'b'),
- const Visit(
- VisitKind.VISIT_PARAMETER_GET,
- element: 'parameter(m#a)'),
- const Visit(
- VisitKind.VISIT_PARAMETER_GET,
- element: 'parameter(m#b)'),
- ]),
- const Test(
- '''
- m(a) => a ??= 42;
- ''',
- const Visit(
- VisitKind.VISIT_PARAMETER_COMPOUND,
- element: 'parameter(m#a)',
- operator: '??=',
- rhs: '42')),
- ],
-};
+// 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.
+
+part of dart2js.semantics_visitor_test;
+
+const Map<String, List<Test>> SEND_TESTS = const {
+ 'Parameters': 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: 'CallStructure(arity=2)')),
+ // TODO(johnniwinther): Expect [VISIT_FINAL_PARAMETER_SET] instead.
+ const Test('m(final o) { o = 42; }',
+ const Visit(VisitKind.VISIT_UNRESOLVED_SET,
+ name: 'o',
+ rhs:'42')),
+ ],
+ 'Local variables': const [
+ // 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: 'CallStructure(arity=2)')),
+ // TODO(johnniwinther): Expect [VISIT_FINAL_LOCAL_VARIABLE_SET] instead.
+ const Test('m() { final o = 0; o = 42; }',
+ const Visit(VisitKind.VISIT_UNRESOLVED_SET,
+ name: 'o',
+ rhs:'42')),
+ // TODO(johnniwinther): Expect [VISIT_FINAL_LOCAL_VARIABLE_SET] instead.
+ const Test('m() { const o = 0; o = 42; }',
+ const Visit(VisitKind.VISIT_UNRESOLVED_SET,
+ name: 'o',
+ rhs:'42')),
+ ],
+ 'Local functions': const [
+ // 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: 'CallStructure(arity=2)')),
+ const Test('m() { o(a) {}; o(null, 42); }',
+ const Visit(VisitKind.VISIT_LOCAL_FUNCTION_INCOMPATIBLE_INVOKE,
+ element: 'function(m#o)',
+ arguments: '(null,42)',
+ selector: 'CallStructure(arity=2)')),
+ // TODO(johnniwinther): Expect [VISIT_LOCAL_FUNCTION_SET] instead.
+ const Test('m() { o(a, b) {}; o = 42; }',
+ const Visit(VisitKind.VISIT_UNRESOLVED_SET,
+ name: 'o',
+ rhs: '42')),
+ ],
+ 'Static fields': const [
+ // 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 {
+ var o;
+ }
+ m() => C.o;
+ ''',
+ const Visit(VisitKind.VISIT_UNRESOLVED_GET,
+ name: 'o')),
+ const Test(
+ '''
+ class C {
+ C.o();
+ }
+ m() => C.o;
+ ''',
+ const Visit(VisitKind.VISIT_UNRESOLVED_GET,
+ name: 'o')),
+ const Test(
+ '''
+ class C {}
+ m() => C.this;
+ ''',
+ null),
+ 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)')),
+ const Test(
+ '''
+ class C {}
+ m() => C.this(null, 42);
+ ''',
+ const Visit(VisitKind.VISIT_UNRESOLVED_INVOKE,
+ name: 'this', arguments: '(null,42)')),
+ // TODO(johnniwinther): Expect [VISIT_FINAL_STATIC_FIELD_SET] instead.
+ const Test(
+ '''
+ class C { static final o = 0; }
+ m() { C.o = 42; }
+ ''',
+ const Visit(VisitKind.VISIT_UNRESOLVED_SET,
+ name: 'o',
+ rhs: '42')),
+ const Test.clazz(
+ '''
+ class C {
+ static final o = 0;
+ m() { o = 42; }
+ }
+ ''',
+ const Visit(VisitKind.VISIT_UNRESOLVED_SET,
+ name: 'o',
+ rhs: '42')),
+ const Test.clazz(
+ '''
+ class C {
+ static final o = 0;
+ m() { C.o = 42; }
+ }
+ ''',
+ const Visit(VisitKind.VISIT_UNRESOLVED_SET,
+ name: 'o',
+ rhs: '42')),
+ const Test.prefix(
+ '''
+ class C {
+ static final o = 0;
+ }
+ ''',
+ 'm() { p.C.o = 42; }',
+ const Visit(VisitKind.VISIT_UNRESOLVED_SET,
+ name: 'o',
+ rhs: '42')),
+ const Test(
+ '''
+ class C { static const o = 0; }
+ m() { C.o = 42; }
+ ''',
+ const Visit(VisitKind.VISIT_UNRESOLVED_SET,
+ name: 'o',
+ rhs: '42')),
+ const Test.clazz(
+ '''
+ class C {
+ static const o = 0;
+ m() { o = 42; }
+ }
+ ''',
+ const Visit(VisitKind.VISIT_UNRESOLVED_SET,
+ name: 'o',
+ rhs: '42')),
+ const Test.clazz(
+ '''
+ class C {
+ static const o = 0;
+ m() { C.o = 42; }
+ }
+ ''',
+ const Visit(VisitKind.VISIT_UNRESOLVED_SET,
+ name: 'o',
+ rhs: '42')),
+ const Test.prefix(
+ '''
+ class C {
+ static const o = 0;
+ }
+ ''',
+ 'm() { p.C.o = 42; }',
+ const Visit(VisitKind.VISIT_UNRESOLVED_SET,
+ name: 'o',
+ rhs: '42')),
+ ],
+ 'Static properties': const [
+ // 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)')),
+ // TODO(johnniwinther): Expected [VISIT_STATIC_GETTER_SET] instead.
+ const Test(
+ '''
+ class C { static get o => 42; }
+ m() { C.o = 42; }
+ ''',
+ const Visit(VisitKind.VISIT_UNRESOLVED_SET,
+ name: 'o',
+ rhs: '42')),
+ const Test.clazz(
+ '''
+ class C {
+ static get o => 42;
+ m() { o = 42; }
+ }
+ ''',
+ const Visit(VisitKind.VISIT_UNRESOLVED_SET,
+ name: 'o',
+ rhs: '42')),
+ const Test.clazz(
+ '''
+ class C {
+ static get o => 42;
+ m() { C.o = 42; }
+ }
+ ''',
+ const Visit(VisitKind.VISIT_UNRESOLVED_SET,
+ name: 'o',
+ rhs: '42')),
+ const Test.prefix(
+ '''
+ class C {
+ static get o => 42;
+ }
+ ''',
+ 'm() { p.C.o = 42; }',
+ const Visit(VisitKind.VISIT_UNRESOLVED_SET,
+ name: 'o',
+ rhs: '42')),
+ const Test(
+ '''
+ class C {
+ static set o(_) {}
+ }
+ m() => C.o;
+ ''',
+ const Visit(VisitKind.VISIT_STATIC_SETTER_GET,
+ element: 'setter(C#o)')),
+ const Test.clazz(
+ '''
+ class C {
+ static set o(_) {}
+ m() => o;
+ }
+ ''',
+ const Visit(VisitKind.VISIT_STATIC_SETTER_GET,
+ element: 'setter(C#o)')),
+
+ const Test.clazz(
+ '''
+ class C {
+ static set o(_) {}
+ m() => C.o;
+ }
+ ''',
+ const Visit(VisitKind.VISIT_STATIC_SETTER_GET,
+ element: 'setter(C#o)')),
+ const Test.prefix(
+ '''
+ class C {
+ static set o(_) {}
+ }
+ ''',
+ 'm() => p.C.o;',
+ const Visit(VisitKind.VISIT_STATIC_SETTER_GET,
+ element: 'setter(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)')),
+ const Test(
+ '''
+ class C { static set o(_) {} }
+ m() => C.o(null, 42);
+ ''',
+ const Visit(VisitKind.VISIT_STATIC_SETTER_INVOKE,
+ element: 'setter(C#o)',
+ arguments: '(null,42)')),
+ const Test.clazz(
+ '''
+ class C {
+ static set o(_) {}
+ m() { o(null, 42); }
+ }
+ ''',
+ const Visit(VisitKind.VISIT_STATIC_SETTER_INVOKE,
+ element: 'setter(C#o)',
+ arguments: '(null,42)')),
+ const Test.clazz(
+ '''
+ class C {
+ static set o(_) {}
+ m() { C.o(null, 42); }
+ }
+ ''',
+ const Visit(VisitKind.VISIT_STATIC_SETTER_INVOKE,
+ element: 'setter(C#o)',
+ arguments: '(null,42)')),
+ const Test.prefix(
+ '''
+ class C {
+ static set o(_) {}
+ }
+ ''',
+ 'm() { p.C.o(null, 42); }',
+ const Visit(VisitKind.VISIT_STATIC_SETTER_INVOKE,
+ element: 'setter(C#o)',
+ arguments: '(null,42)')),
+ ],
+ 'Static functions': const [
+ // 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)')),
+ // TODO(johnniwinther): Expect [VISIT_STATIC_FUNCTION_SET] instead.
+ const Test(
+ '''
+ class C { static o(a, b) {} }
+ m() { C.o = 42; }
+ ''',
+ const Visit(VisitKind.VISIT_UNRESOLVED_SET,
+ name: 'o',
+ rhs: '42')),
+ const Test.clazz(
+ '''
+ class C {
+ static o(a, b) {}
+ m() { o = 42; }
+ }
+ ''',
+ const Visit(VisitKind.VISIT_UNRESOLVED_SET,
+ name: 'o',
+ rhs: '42')),
+ const Test.clazz(
+ '''
+ class C {
+ static o(a, b) {}
+ m() { C.o = 42; }
+ }
+ ''',
+ const Visit(VisitKind.VISIT_UNRESOLVED_SET,
+ name: 'o',
+ rhs: '42')),
+ const Test.prefix(
+ '''
+ class C { static o(a, b) {} }
+ ''',
+ '''
+ m() { p.C.o = 42; }
+ ''',
+ const Visit(VisitKind.VISIT_UNRESOLVED_SET,
+ name: 'o',
+ rhs: '42')),
+ 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)')),
+ const Test(
+ '''
+ class C { static o(a, b) {} }
+ m() => C.o(null);
+ ''',
+ const Visit(VisitKind.VISIT_STATIC_FUNCTION_INCOMPATIBLE_INVOKE,
+ element: 'function(C#o)',
+ arguments: '(null)')),
+ ],
+ 'Top level fields': const [
+ // 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')),
+ // TODO(johnniwinther): Expect [VISIT_FINAL_TOP_LEVEL_FIELD_SET] instead.
+ const Test(
+ '''
+ final o = 0;
+ m() { o = 42; }
+ ''',
+ const Visit(VisitKind.VISIT_UNRESOLVED_SET,
+ name: 'o',
+ rhs: '42')),
+ const Test.prefix(
+ '''
+ final o = 0;
+ ''',
+ 'm() { p.o = 42; }',
+ const Visit(VisitKind.VISIT_UNRESOLVED_SET,
+ name: 'o',
+ rhs: '42')),
+ const Test(
+ '''
+ const o = 0;
+ m() { o = 42; }
+ ''',
+ const Visit(VisitKind.VISIT_UNRESOLVED_SET,
+ name: 'o',
+ rhs: '42')),
+ const Test.prefix(
+ '''
+ const o = 0;
+ ''',
+ 'm() { p.o = 42; }',
+ const Visit(VisitKind.VISIT_UNRESOLVED_SET,
+ name: '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)')),
+ const Test(
+ '''
+ m() => o;
+ ''',
+ const Visit(VisitKind.VISIT_UNRESOLVED_GET,
+ name: 'o')),
+ ],
+ 'Top level properties': const [
+ // 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)')),
+ // TODO(johnniwinther): Expect [VISIT_TOP_LEVEL_SETTER_GET] instead.
+ const Test(
+ '''
+ set o(_) {}
+ m() => o;
+ ''',
+ const Visit(VisitKind.VISIT_TOP_LEVEL_SETTER_GET,
+ element: 'setter(o)')),
+ const Test.prefix(
+ '''
+ set o(_) {}
+ ''',
+ '''
+ m() => p.o;
+ ''',
+ const Visit(VisitKind.VISIT_UNRESOLVED_GET,
+ name: 'o')),
+ // TODO(johnniwinther): Expect [VISIT_TOP_LEVEL_GETTER_SET] instead.
+ const Test(
+ '''
+ get o => null;
+ m() { o = 42; }
+ ''',
+ const Visit(VisitKind.VISIT_UNRESOLVED_SET,
+ name: 'o',
+ rhs: '42')),
+ const Test.prefix(
+ '''
+ get o => null;
+ ''',
+ 'm() { p.o = 42; }',
+ const Visit(VisitKind.VISIT_UNRESOLVED_SET,
+ name: 'o',
+ rhs: '42')),
+ 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)')),
+ // TODO(johnniwinther): Expected [VISIT_TOP_LEVEL_SETTER_INVOKE] instead.
+ const Test(
+ '''
+ set o(_) {}
+ m() => o(null, 42);
+ ''',
+ const Visit(VisitKind.VISIT_TOP_LEVEL_SETTER_INVOKE,
+ element: 'setter(o)',
+ arguments: '(null,42)')),
+ const Test.prefix(
+ '''
+ set o(_) {}
+ ''',
+ 'm() { p.o(null, 42); }',
+ const Visit(VisitKind.VISIT_UNRESOLVED_INVOKE,
+ name: 'o',
+ arguments: '(null,42)')),
+ ],
+ 'Top level functions': const [
+ // 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(
+ '''
+ o(a, b) {}
+ m() => o(null);
+ ''',
+ const Visit(VisitKind.VISIT_TOP_LEVEL_FUNCTION_INCOMPATIBLE_INVOKE,
+ element: 'function(o)',
+ arguments: '(null)')),
+ 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)')),
+ const Test(
+ '''
+ m() => o(null, 42);
+ ''',
+ const Visit(VisitKind.VISIT_UNRESOLVED_INVOKE,
+ name: 'o',
+ arguments: '(null,42)')),
+ // TODO(johnniwinther): Expect [VISIT_TOP_LEVEL_FUNCTION_SET] instead.
+ const Test(
+ '''
+ o(a, b) {}
+ m() { o = 42; }
+ ''',
+ const Visit(VisitKind.VISIT_UNRESOLVED_SET,
+ name: 'o',
+ rhs: '42')),
+ const Test.prefix(
+ '''
+ o(a, b) {}
+ ''',
+ 'm() { p.o = 42; }',
+ const Visit(VisitKind.VISIT_UNRESOLVED_SET,
+ name: 'o',
+ rhs: '42')),
+ ],
+ 'Dynamic properties': const [
+ // Dynamic properties
+ const Test('m(o) => o.foo;',
+ const [
+ const Visit(VisitKind.VISIT_DYNAMIC_PROPERTY_GET,
+ receiver: 'o',
+ name: 'foo'),
+ const Visit(VisitKind.VISIT_PARAMETER_GET,
+ element: 'parameter(m#o)'),
+ ]),
+ const Test('m(o) { o.foo = 42; }',
+ const [
+ const Visit(VisitKind.VISIT_DYNAMIC_PROPERTY_SET,
+ receiver: 'o',
+ name: 'foo',
+ rhs: '42'),
+ const Visit(VisitKind.VISIT_PARAMETER_GET,
+ element: 'parameter(m#o)'),
+ ]),
+ const Test('m(o) { o.foo(null, 42); }',
+ const [
+ const Visit(VisitKind.VISIT_DYNAMIC_PROPERTY_INVOKE,
+ receiver: 'o',
+ name: 'foo',
+ arguments: '(null,42)'),
+ const Visit(VisitKind.VISIT_PARAMETER_GET,
+ element: 'parameter(m#o)'),
+ ]),
+ ],
+ 'This access': const [
+ // 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 [
+ // 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 [
+ // 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')),
+ // TODO(johnniwinther): Expect [VISIT_FINAL_SUPER_FIELD_SET] instead.
+ const Test.clazz(
+ '''
+ class B {
+ final o = 0;
+ }
+ class C extends B {
+ m() { super.o = 42; }
+ }
+ ''',
+ const Visit(VisitKind.VISIT_UNRESOLVED_SET,
+ name: '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)')),
+ const Test.clazz(
+ '''
+ class B {
+ }
+ class C extends B {
+ m() => super.o;
+ }
+ ''',
+ const Visit(VisitKind.VISIT_UNRESOLVED_SUPER_GET)),
+ ],
+ 'Super properties': const [
+ // 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;
+ }
+ ''',
+ const Visit(VisitKind.VISIT_SUPER_SETTER_GET,
+ element: 'setter(B#o)')),
+ // TODO(johnniwinther): Expect [VISIT_SUPER_GETTER_SET] instead.
+ const Test.clazz(
+ '''
+ class B {
+ get o => 0;
+ }
+ class C extends B {
+ m() { super.o = 42; }
+ }
+ ''',
+ const Visit(VisitKind.VISIT_UNRESOLVED_SET,
+ name: 'o',
+ rhs: '42')),
+ 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)')),
+ const Test.clazz(
+ '''
+ class B {
+ set o(_) {}
+ }
+ class C extends B {
+ m() { super.o(null, 42); }
+ }
+ ''',
+ const Visit(VisitKind.VISIT_SUPER_SETTER_INVOKE,
+ element: 'setter(B#o)',
+ arguments: '(null,42)')),
+ ],
+ 'Super methods': const [
+ // 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)')),
+ const Test.clazz(
+ '''
+ class B {
+ o(a, b) {}
+ }
+ class C extends B {
+ m() { super.o(null); }
+ }
+ ''',
+ const Visit(VisitKind.VISIT_SUPER_METHOD_INCOMPATIBLE_INVOKE,
+ element: 'function(B#o)',
+ arguments: '(null)')),
+ const Test.clazz(
+ '''
+ class B {
+ }
+ class C extends B {
+ m() => super.o(null, 42);
+ }
+ ''',
+ const Visit(VisitKind.VISIT_UNRESOLVED_SUPER_INVOKE,
+ arguments: '(null,42)')),
+ ],
+ 'Expression invoke': const [
+ // 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 [
+ // 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)')),
+ const Test(
+ '''
+ class C {}
+ m() => C += 42;
+ ''',
+ const Visit(VisitKind.VISIT_CLASS_TYPE_LITERAL_COMPOUND,
+ constant: 'C',
+ operator: '+=',
+ rhs: '42')),
+ const Test(
+ '''
+ class C {}
+ m() => ++C;
+ ''',
+ const Visit(VisitKind.VISIT_CLASS_TYPE_LITERAL_PREFIX,
+ constant: 'C',
+ operator: '++')),
+ const Test(
+ '''
+ class C {}
+ m() => C--;
+ ''',
+ const Visit(VisitKind.VISIT_CLASS_TYPE_LITERAL_POSTFIX,
+ constant: 'C',
+ operator: '--')),
+ const Test(
+ '''
+ class C {}
+ m() => (C).hashCode;
+ ''',
+ const [
+ const Visit(VisitKind.VISIT_DYNAMIC_PROPERTY_GET,
+ receiver: '(C)', name: 'hashCode'),
+ const Visit(VisitKind.VISIT_CLASS_TYPE_LITERAL_GET,
+ constant: 'C'),
+ ]),
+ ],
+ 'Typedef type literals': const [
+ // 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)')),
+ const Test(
+ '''
+ typedef F();
+ m() => F += 42;
+ ''',
+ const Visit(VisitKind.VISIT_TYPEDEF_TYPE_LITERAL_COMPOUND,
+ constant: 'F',
+ operator: '+=',
+ rhs: '42')),
+ const Test(
+ '''
+ typedef F();
+ m() => ++F;
+ ''',
+ const Visit(VisitKind.VISIT_TYPEDEF_TYPE_LITERAL_PREFIX,
+ constant: 'F',
+ operator: '++')),
+ const Test(
+ '''
+ typedef F();
+ m() => F--;
+ ''',
+ const Visit(VisitKind.VISIT_TYPEDEF_TYPE_LITERAL_POSTFIX,
+ constant: 'F',
+ operator: '--')),
+ ],
+ 'Type variable type literals': const [
+ // 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)')),
+ const Test.clazz(
+ '''
+ class C<T> {
+ m() => T += 42;
+ }
+ ''',
+ const Visit(VisitKind.VISIT_TYPE_VARIABLE_TYPE_LITERAL_COMPOUND,
+ element: 'type_variable(C#T)',
+ operator: '+=',
+ rhs: '42')),
+ const Test.clazz(
+ '''
+ class C<T> {
+ m() => ++T;
+ }
+ ''',
+ const Visit(VisitKind.VISIT_TYPE_VARIABLE_TYPE_LITERAL_PREFIX,
+ element: 'type_variable(C#T)',
+ operator: '++')),
+ const Test.clazz(
+ '''
+ class C<T> {
+ m() => T--;
+ }
+ ''',
+ const Visit(VisitKind.VISIT_TYPE_VARIABLE_TYPE_LITERAL_POSTFIX,
+ element: 'type_variable(C#T)',
+ operator: '--')),
+
+ ],
+ 'Dynamic type literals': const [
+ // Dynamic type literals
+ const Test(
+ '''
+ m() => dynamic;
+ ''',
+ const Visit(VisitKind.VISIT_DYNAMIC_TYPE_LITERAL_GET,
+ constant: 'dynamic')),
+ // TODO(johnniwinther): Update these to expect the constant to be `dynamic`
+ // instead of `Type`. Currently the compile time constant evaluator cannot
+ // detect `dynamic` as a constant subexpression.
+ const Test(
+ '''
+ m() { dynamic(null, 42); }
+ ''',
+ const Visit(VisitKind.VISIT_DYNAMIC_TYPE_LITERAL_INVOKE,
+ constant: 'Type',
+ arguments: '(null,42)')),
+ const Test(
+ '''
+ m() => dynamic += 42;
+ ''',
+ const Visit(VisitKind.VISIT_DYNAMIC_TYPE_LITERAL_COMPOUND,
+ constant: 'Type',
+ operator: '+=',
+ rhs: '42')),
+ const Test(
+ '''
+ m() => ++dynamic;
+ ''',
+ const Visit(VisitKind.VISIT_DYNAMIC_TYPE_LITERAL_PREFIX,
+ constant: 'Type',
+ operator: '++')),
+ const Test(
+ '''
+ m() => dynamic--;
+ ''',
+ const Visit(VisitKind.VISIT_DYNAMIC_TYPE_LITERAL_POSTFIX,
+ constant: 'Type',
+ operator: '--')),
+ ],
+ 'Assert': const [
+ // Assert
+ const Test(
+ '''
+ m() { assert(false); }
+ ''',
+ const Visit(VisitKind.VISIT_ASSERT, expression: 'false')),
+ const Test(
+ '''
+ m() { assert(); }
+ ''',
+ const Visit(VisitKind.ERROR_INVALID_ASSERT, arguments: '()')),
+ const Test(
+ '''
+ m() { assert(42, true); }
+ ''',
+ const Visit(VisitKind.ERROR_INVALID_ASSERT, arguments: '(42,true)')),
+ ],
+ 'Logical and': const [
+ // Logical and
+ const Test(
+ '''
+ m() => true && false;
+ ''',
+ const Visit(VisitKind.VISIT_LOGICAL_AND, left: 'true', right: 'false')),
+ ],
+ 'Logical or': const [
+ // Logical or
+ const Test(
+ '''
+ m() => true || false;
+ ''',
+ const Visit(VisitKind.VISIT_LOGICAL_OR, left: 'true', right: 'false')),
+ ],
+ 'Is test': const [
+ // Is test
+ const Test(
+ '''
+ class C {}
+ m() => 0 is C;
+ ''',
+ const Visit(VisitKind.VISIT_IS, expression: '0', type: 'C')),
+ ],
+ 'Is not test': const [
+ // Is not test
+ const Test(
+ '''
+ class C {}
+ m() => 0 is! C;
+ ''',
+ const Visit(VisitKind.VISIT_IS_NOT, expression: '0', type: 'C')),
+ ],
+ 'As test': const [
+ // As test
+ const Test(
+ '''
+ class C {}
+ m() => 0 as C;
+ ''',
+ const Visit(VisitKind.VISIT_AS, expression: '0', type: 'C')),
+ ],
+ 'Binary operators': const [
+ // 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')),
+ const Test.clazz(
+ '''
+ class B {}
+ class C extends B {
+ m() => super + 42;
+ }
+ ''',
+ const Visit(VisitKind.VISIT_UNRESOLVED_SUPER_BINARY,
+ operator: '+',
+ right: '42')),
+ const Test(
+ '''
+ m() => 2 === 3;
+ ''',
+ const Visit(VisitKind.ERROR_UNDEFINED_BINARY_EXPRESSION,
+ left: '2', operator: '===', right: '3')),
+ const Test(
+ '''
+ m() => 2 !== 3;
+ ''',
+ const Visit(VisitKind.ERROR_UNDEFINED_BINARY_EXPRESSION,
+ left: '2', operator: '!==', right: '3')),
+ ],
+ 'Index': const [
+ // 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 {
+ }
+ class C extends B {
+ m() => super[42];
+ }
+ ''',
+ const Visit(VisitKind.VISIT_UNRESOLVED_SUPER_INDEX,
+ 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 []=(a, b) {}
+ }
+ class C extends B {
+ m() => ++super[42];
+ }
+ ''',
+ const Visit(VisitKind.VISIT_UNRESOLVED_SUPER_GETTER_INDEX_PREFIX,
+ setter: 'function(B#[]=)',
+ index: '42',
+ operator: '++')),
+ const Test.clazz(
+ '''
+ class B {
+ }
+ class C extends B {
+ m() => ++super[42];
+ }
+ ''',
+ const Visit(VisitKind.VISIT_UNRESOLVED_SUPER_INDEX_PREFIX,
+ index: '42',
+ operator: '++')),
+ const Test.clazz(
+ '''
+ class B {
+ operator [](_) => null;
+ }
+ class C extends B {
+ m() => ++super[42];
+ }
+ ''',
+ const Visit(VisitKind.VISIT_UNRESOLVED_SUPER_SETTER_INDEX_PREFIX,
+ getter: '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: '--')),
+ const Test.clazz(
+ '''
+ class B {
+ operator []=(a, b) {}
+ }
+ class C extends B {
+ m() => super[42]--;
+ }
+ ''',
+ const Visit(VisitKind.VISIT_UNRESOLVED_SUPER_GETTER_INDEX_POSTFIX,
+ setter: 'function(B#[]=)',
+ index: '42',
+ operator: '--')),
+ const Test.clazz(
+ '''
+ class B {
+ }
+ class C extends B {
+ m() => super[42]--;
+ }
+ ''',
+ const Visit(VisitKind.VISIT_UNRESOLVED_SUPER_INDEX_POSTFIX,
+ index: '42',
+ operator: '--')),
+ const Test.clazz(
+ '''
+ class B {
+ operator [](_) => null;
+ }
+ class C extends B {
+ m() => super[42]--;
+ }
+ ''',
+ const Visit(VisitKind.VISIT_UNRESOLVED_SUPER_SETTER_INDEX_POSTFIX,
+ getter: 'function(B#[])',
+ index: '42',
+ operator: '--')),
+ ],
+ 'Equals': const [
+ // 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 [
+ // Not equals
+ const Test(
+ '''
+ m() => 2 != 3;
+ ''',
+ const Visit(VisitKind.VISIT_NOT_EQUALS,
+ left: '2', right: '3')),
+ 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 [
+ // 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 {
+ }
+ class C extends B {
+ m() => -super;
+ }
+ ''',
+ const Visit(VisitKind.VISIT_UNRESOLVED_SUPER_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')),
+ const Test(
+ '''
+ m() => +false;
+ ''',
+ // TODO(johnniwinther): Should this be an
+ // ERROR_UNDEFINED_UNARY_EXPRESSION? Currently the parser just skips
+ // the `+`.
+ const []),
+ ],
+ 'Index set': const [
+ // 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')),
+ const Test.clazz(
+ '''
+ class B {
+ }
+ class C extends B {
+ m() => super[1] = 2;
+ }
+ ''',
+ const Visit(VisitKind.VISIT_UNRESOLVED_SUPER_INDEX_SET,
+ index: '1', rhs: '2')),
+ ],
+ 'Compound assignment': const [
+ // 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)')
+ ]),
+ const Test(
+ '''
+ m(a) => a += 42;
+ ''',
+ const Visit(VisitKind.VISIT_PARAMETER_COMPOUND,
+ element: 'parameter(m#a)', operator: '+=', rhs: '42')),
+ const Test(
+ '''
+ m(final a) => a += 42;
+ ''',
+ const Visit(VisitKind.VISIT_FINAL_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(
+ '''
+ m() {
+ final a = 0;
+ a += 42;
+ }
+ ''',
+ const Visit(VisitKind.VISIT_FINAL_LOCAL_VARIABLE_COMPOUND,
+ element: 'variable(m#a)', operator: '+=', rhs: '42')),
+ const Test(
+ '''
+ m() {
+ a() {}
+ a += 42;
+ }
+ ''',
+ const Visit(VisitKind.VISIT_LOCAL_FUNCTION_COMPOUND,
+ element: 'function(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 {
+ final a = 0;
+ }
+ class C extends B {
+ m() => super.a += 42;
+ }
+ ''',
+ const Visit(VisitKind.VISIT_SUPER_FINAL_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 = 0;
+ }
+
+ 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')),*/
+ const Test.clazz(
+ '''
+ class B {
+ a() {}
+ }
+ class C extends B {
+ m() => super.a += 42;
+ }
+ ''',
+ const Visit(VisitKind.VISIT_SUPER_METHOD_COMPOUND,
+ element: 'function(B#a)',
+ operator: '+=', rhs: '42')),
+ const Test.clazz(
+ '''
+ class B {
+ }
+ class C extends B {
+ m() => super.a += 42;
+ }
+ ''',
+ const Visit(VisitKind.VISIT_UNRESOLVED_SUPER_COMPOUND,
+ operator: '+=', rhs: '42')),
+ const Test.clazz(
+ '''
+ class B {
+ set a(_) {}
+ }
+ class C extends B {
+ m() => super.a += 42;
+ }
+ ''',
+ const Visit(VisitKind.VISIT_UNRESOLVED_SUPER_GETTER_COMPOUND,
+ setter: 'setter(B#a)', operator: '+=', rhs: '42')),
+ const Test.clazz(
+ '''
+ class B {
+ get a => 42;
+ }
+ class C extends B {
+ m() => super.a += 42;
+ }
+ ''',
+ const Visit(VisitKind.VISIT_UNRESOLVED_SUPER_SETTER_COMPOUND,
+ getter: 'getter(B#a)', operator: '+=', rhs: '42')),
+
+ const Test.clazz(
+ '''
+ class C {
+ static set a(var value) { }
+ m() => a += 42;
+ }
+ ''',
+ const Visit(VisitKind.VISIT_UNRESOLVED_STATIC_GETTER_COMPOUND,
+ setter: 'setter(C#a)', operator: '+=', rhs: '42')),
+
+ const Test.clazz(
+ '''
+ class C {
+ static get a => 42;
+ m() => C.a += 42;
+ }
+ ''',
+ const Visit(VisitKind.VISIT_UNRESOLVED_STATIC_SETTER_COMPOUND,
+ getter: 'getter(C#a)', operator: '+=', rhs: '42')),
+
+ const Test.clazz(
+ '''
+ class C {
+ static final a = 42;
+ m() => C.a += 42;
+ }
+ ''',
+ const Visit(VisitKind.VISIT_STATIC_FINAL_FIELD_COMPOUND,
+ element: 'field(C#a)', operator: '+=', rhs: '42')),
+
+ const Test(
+ '''
+ class C {
+ static a(var value) { }
+ }
+ m() => C.a += 42;
+ ''',
+ const Visit(VisitKind.VISIT_STATIC_METHOD_COMPOUND,
+ element: 'function(C#a)', operator: '+=', rhs: '42')),
+
+ const Test(
+ '''
+ set a(var value) { }
+ m() => a += 42;
+ ''',
+ const Visit(VisitKind.VISIT_UNRESOLVED_TOP_LEVEL_GETTER_COMPOUND,
+ setter: 'setter(a)', operator: '+=', rhs: '42')),
+
+ const Test(
+ '''
+ get a => 42;
+ m() => a += 42;
+ ''',
+ const Visit(VisitKind.VISIT_UNRESOLVED_TOP_LEVEL_SETTER_COMPOUND,
+ getter: 'getter(a)', operator: '+=', rhs: '42')),
+
+ const Test(
+ '''
+ a(var value) { }
+ m() => a += 42;
+ ''',
+ const Visit(VisitKind.VISIT_TOP_LEVEL_METHOD_COMPOUND,
+ element: 'function(a)', operator: '+=', rhs: '42')),
+
+ const Test(
+ '''
+ final a = 42;
+ m() => a += 42;
+ ''',
+ const Visit(VisitKind.VISIT_TOP_LEVEL_FINAL_FIELD_COMPOUND,
+ element: 'field(a)', operator: '+=', rhs: '42')),
+
+ const Test(
+ '''
+ m() => unresolved += 42;
+ ''',
+ const Visit(VisitKind.VISIT_UNRESOLVED_COMPOUND,
+ operator: '+=', rhs: '42')),
+ ],
+ 'Compound index assignment': const [
+ // Compound index assignment
+ const Test(
+ '''
+ m() => 0[1] += 42;
+ ''',
+ const Visit(VisitKind.VISIT_COMPOUND_INDEX_SET,
+ receiver: '0', index: '1', operator: '+=', rhs: '42')),
+ 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')),
+ const Test.clazz(
+ '''
+ class B {
+ operator []=(a, b) {}
+ }
+ class C extends B {
+ m() => super[1] += 42;
+ }
+ ''',
+ const Visit(VisitKind.VISIT_UNRESOLVED_SUPER_GETTER_COMPOUND_INDEX_SET,
+ setter: 'function(B#[]=)',
+ index: '1', operator: '+=', rhs: '42')),
+ const Test.clazz(
+ '''
+ class B {
+ }
+ class C extends B {
+ m() => super[1] += 42;
+ }
+ ''',
+ const Visit(VisitKind.VISIT_UNRESOLVED_SUPER_COMPOUND_INDEX_SET,
+ index: '1', operator: '+=', rhs: '42')),
+ const Test.clazz(
+ '''
+ class B {
+ operator [](_) {}
+ }
+ class C extends B {
+ m() => super[1] += 42;
+ }
+ ''',
+ const Visit(VisitKind.VISIT_UNRESOLVED_SUPER_SETTER_COMPOUND_INDEX_SET,
+ getter: 'function(B#[])',
+ index: '1', operator: '+=', rhs: '42')),
+ ],
+ 'Prefix expression': const [
+ // 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(final a) => ++a;
+ ''',
+ const Visit(VisitKind.VISIT_FINAL_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(
+ '''
+ m() {
+ final a = 42;
+ --a;
+ }
+ ''',
+ const Visit(VisitKind.VISIT_FINAL_LOCAL_VARIABLE_PREFIX,
+ element: 'variable(m#a)', operator: '--')),
+ const Test(
+ '''
+ m() {
+ a() {}
+ --a;
+ }
+ ''',
+ const Visit(VisitKind.VISIT_LOCAL_FUNCTION_PREFIX,
+ element: 'function(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 {
+ final a = 0;
+ }
+ class C extends B {
+ m() => --super.a;
+ }
+ ''',
+ const Visit(VisitKind.VISIT_SUPER_FINAL_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: '++')),
+ const Test.clazz(
+ '''
+ class B {
+ a() {}
+ }
+ class C extends B {
+ m() => ++super.a;
+ }
+ ''',
+ const Visit(VisitKind.VISIT_SUPER_METHOD_PREFIX,
+ element: 'function(B#a)',
+ operator: '++')),
+ const Test.clazz(
+ '''
+ class B {
+ }
+ class C extends B {
+ m() => ++super.a;
+ }
+ ''',
+ const Visit(VisitKind.VISIT_UNRESOLVED_SUPER_PREFIX,
+ operator: '++')),
+ const Test.clazz(
+ '''
+ class B {
+ set a(_) {}
+ }
+ class C extends B {
+ m() => ++super.a;
+ }
+ ''',
+ const Visit(VisitKind.VISIT_UNRESOLVED_SUPER_GETTER_PREFIX,
+ setter: 'setter(B#a)', operator: '++')),
+ const Test.clazz(
+ '''
+ class B {
+ get a => 42;
+ }
+ class C extends B {
+ m() => ++super.a;
+ }
+ ''',
+ const Visit(VisitKind.VISIT_UNRESOLVED_SUPER_SETTER_PREFIX,
+ getter: 'getter(B#a)', operator: '++')),
+
+ const Test.clazz(
+ '''
+ class C {
+ static set a(var value) { }
+ m() => ++a;
+ }
+ ''',
+ const Visit(VisitKind.VISIT_UNRESOLVED_STATIC_GETTER_PREFIX,
+ setter: 'setter(C#a)', operator: '++')),
+
+ const Test.clazz(
+ '''
+ class C {
+ static get a => 42;
+ m() => ++C.a;
+ }
+ ''',
+ const Visit(VisitKind.VISIT_UNRESOLVED_STATIC_SETTER_PREFIX,
+ getter: 'getter(C#a)', operator: '++')),
+
+ const Test.clazz(
+ '''
+ class C {
+ static final a = 42;
+ m() => ++C.a;
+ }
+ ''',
+ const Visit(VisitKind.VISIT_STATIC_FINAL_FIELD_PREFIX,
+ element: 'field(C#a)', operator: '++')),
+
+ const Test(
+ '''
+ class C {
+ static a(var value) { }
+ }
+ m() => ++C.a;
+ ''',
+ const Visit(VisitKind.VISIT_STATIC_METHOD_PREFIX,
+ element: 'function(C#a)', operator: '++')),
+
+ const Test(
+ '''
+ set a(var value) { }
+ m() => ++a;
+ ''',
+ const Visit(VisitKind.VISIT_UNRESOLVED_TOP_LEVEL_GETTER_PREFIX,
+ setter: 'setter(a)', operator: '++')),
+
+ const Test(
+ '''
+ get a => 42;
+ m() => ++a;
+ ''',
+ const Visit(VisitKind.VISIT_UNRESOLVED_TOP_LEVEL_SETTER_PREFIX,
+ getter: 'getter(a)', operator: '++')),
+
+ const Test(
+ '''
+ a(var value) { }
+ m() => ++a;
+ ''',
+ const Visit(VisitKind.VISIT_TOP_LEVEL_METHOD_PREFIX,
+ element: 'function(a)', operator: '++')),
+
+ const Test(
+ '''
+ final a = 42;
+ m() => ++a;
+ ''',
+ const Visit(VisitKind.VISIT_TOP_LEVEL_FINAL_FIELD_PREFIX,
+ element: 'field(a)', operator: '++')),
+
+ const Test(
+ '''
+ m() => ++unresolved;
+ ''',
+ const Visit(VisitKind.VISIT_UNRESOLVED_PREFIX,
+ operator: '++')),
+ ],
+ 'Postfix expression': const [
+ // Postfix 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(final a) => a++;
+ ''',
+ const Visit(VisitKind.VISIT_FINAL_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(
+ '''
+ m() {
+ final a = 42;
+ a--;
+ }
+ ''',
+ const Visit(VisitKind.VISIT_FINAL_LOCAL_VARIABLE_POSTFIX,
+ element: 'variable(m#a)', operator: '--')),
+ const Test(
+ '''
+ m() {
+ a() {}
+ a--;
+ }
+ ''',
+ const Visit(VisitKind.VISIT_LOCAL_FUNCTION_POSTFIX,
+ element: 'function(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 {
+ final a = 0;
+ }
+ class C extends B {
+ m() => super.a--;
+ }
+ ''',
+ const Visit(VisitKind.VISIT_SUPER_FINAL_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: '++')),
+ const Test.clazz(
+ '''
+ class B {
+ a() {}
+ }
+ class C extends B {
+ m() => super.a++;
+ }
+ ''',
+ const Visit(VisitKind.VISIT_SUPER_METHOD_POSTFIX,
+ element: 'function(B#a)',
+ operator: '++')),
+ const Test.clazz(
+ '''
+ class B {
+ }
+ class C extends B {
+ m() => super.a++;
+ }
+ ''',
+ const Visit(VisitKind.VISIT_UNRESOLVED_SUPER_POSTFIX,
+ operator: '++')),
+ const Test.clazz(
+ '''
+ class B {
+ set a(_) {}
+ }
+ class C extends B {
+ m() => super.a++;
+ }
+ ''',
+ const Visit(VisitKind.VISIT_UNRESOLVED_SUPER_GETTER_POSTFIX,
+ setter: 'setter(B#a)', operator: '++')),
+ const Test.clazz(
+ '''
+ class B {
+ get a => 42;
+ }
+ class C extends B {
+ m() => super.a++;
+ }
+ ''',
+ const Visit(VisitKind.VISIT_UNRESOLVED_SUPER_SETTER_POSTFIX,
+ getter: 'getter(B#a)', operator: '++')),
+
+ const Test.clazz(
+ '''
+ class C {
+ static set a(var value) { }
+ m() => a++;
+ }
+ ''',
+ const Visit(VisitKind.VISIT_UNRESOLVED_STATIC_GETTER_POSTFIX,
+ setter: 'setter(C#a)', operator: '++')),
+
+ const Test.clazz(
+ '''
+ class C {
+ static get a => 42;
+ m() => C.a++;
+ }
+ ''',
+ const Visit(VisitKind.VISIT_UNRESOLVED_STATIC_SETTER_POSTFIX,
+ getter: 'getter(C#a)', operator: '++')),
+
+ const Test.clazz(
+ '''
+ class C {
+ static final a = 42;
+ m() => C.a++;
+ }
+ ''',
+ const Visit(VisitKind.VISIT_STATIC_FINAL_FIELD_POSTFIX,
+ element: 'field(C#a)', operator: '++')),
+
+ const Test(
+ '''
+ class C {
+ static a(var value) { }
+ }
+ m() => C.a++;
+ ''',
+ const Visit(VisitKind.VISIT_STATIC_METHOD_POSTFIX,
+ element: 'function(C#a)', operator: '++')),
+
+ const Test(
+ '''
+ set a(var value) { }
+ m() => a++;
+ ''',
+ const Visit(VisitKind.VISIT_UNRESOLVED_TOP_LEVEL_GETTER_POSTFIX,
+ setter: 'setter(a)', operator: '++')),
+
+ const Test(
+ '''
+ get a => 42;
+ m() => a++;
+ ''',
+ const Visit(VisitKind.VISIT_UNRESOLVED_TOP_LEVEL_SETTER_POSTFIX,
+ getter: 'getter(a)', operator: '++')),
+
+ const Test(
+ '''
+ a(var value) { }
+ m() => a++;
+ ''',
+ const Visit(VisitKind.VISIT_TOP_LEVEL_METHOD_POSTFIX,
+ element: 'function(a)', operator: '++')),
+
+ const Test(
+ '''
+ final a = 42;
+ m() => a++;
+ ''',
+ const Visit(VisitKind.VISIT_TOP_LEVEL_FINAL_FIELD_POSTFIX,
+ element: 'field(a)', operator: '++')),
+
+ const Test(
+ '''
+ m() => unresolved++;
+ ''',
+ const Visit(VisitKind.VISIT_UNRESOLVED_POSTFIX,
+ operator: '++')),
+ ],
+ 'Constructor invocations': const [
+ const Test(
+ '''
+ class Class {
+ const Class(a, b);
+ }
+ m() => const Class(true, 42);
+ ''',
+ const Visit(VisitKind.VISIT_CONST_CONSTRUCTOR_INVOKE,
+ constant: 'const Class(true, 42)')),
+ const Test(
+ '''
+ m() => const bool.fromEnvironment('foo');
+ ''',
+ const Visit(VisitKind.VISIT_BOOL_FROM_ENVIRONMENT_CONSTRUCTOR_INVOKE,
+ constant:
+ 'const bool.fromEnvironment("foo")')),
+ const Test(
+ '''
+ m() => const bool.fromEnvironment('foo', defaultValue: true);
+ ''',
+ const Visit(VisitKind.VISIT_BOOL_FROM_ENVIRONMENT_CONSTRUCTOR_INVOKE,
+ constant: 'const bool.fromEnvironment("foo", defaultValue: true)')),
+ const Test(
+ '''
+ m() => const int.fromEnvironment('foo');
+ ''',
+ const Visit(VisitKind.VISIT_INT_FROM_ENVIRONMENT_CONSTRUCTOR_INVOKE,
+ constant: 'const int.fromEnvironment("foo")')),
+ const Test(
+ '''
+ m() => const String.fromEnvironment('foo');
+ ''',
+ const Visit(VisitKind.VISIT_STRING_FROM_ENVIRONMENT_CONSTRUCTOR_INVOKE,
+ constant:
+ 'const String.fromEnvironment("foo")')),
+ const Test(
+ '''
+ class Class {
+ Class(a, b);
+ }
+ m() => const Class(true, 42);
+ ''',
+ const Visit(VisitKind.ERROR_NON_CONSTANT_CONSTRUCTOR_INVOKE,
+ element: 'generative_constructor(Class#)',
+ arguments: '(true,42)',
+ type: 'Class',
+ selector: 'CallStructure(arity=2)')),
+ const Test(
+ '''
+ class Class {}
+ m() => new Class();
+ ''',
+ const Visit(VisitKind.VISIT_GENERATIVE_CONSTRUCTOR_INVOKE,
+ element: 'generative_constructor(Class#)',
+ arguments: '()',
+ type: 'Class',
+ selector: 'CallStructure(arity=0)')),
+ const Test(
+ '''
+ class Class {
+ Class(a, b);
+ }
+ m() => new Class(true, 42);
+ ''',
+ const Visit(VisitKind.VISIT_GENERATIVE_CONSTRUCTOR_INVOKE,
+ element: 'generative_constructor(Class#)',
+ arguments: '(true,42)',
+ type: 'Class',
+ selector: 'CallStructure(arity=2)')),
+ const Test(
+ '''
+ class Class {
+ Class.named(a, b);
+ }
+ m() => new Class.named(true, 42);
+ ''',
+ const Visit(VisitKind.VISIT_GENERATIVE_CONSTRUCTOR_INVOKE,
+ element: 'generative_constructor(Class#named)',
+ arguments: '(true,42)',
+ type: 'Class',
+ selector: 'CallStructure(arity=2)')),
+ const Test(
+ '''
+ class Class {}
+ m() => new Class(true, 42);
+ ''',
+ const Visit(VisitKind.VISIT_CONSTRUCTOR_INCOMPATIBLE_INVOKE,
+ element: 'generative_constructor(Class#)',
+ arguments: '(true,42)',
+ type: 'Class',
+ selector: 'CallStructure(arity=2)')),
+ const Test(
+ '''
+ class Class {
+ Class(a, b) : this._(a, b);
+ Class._(a, b);
+ }
+ m() => new Class(true, 42);
+ ''',
+ const Visit(VisitKind.VISIT_REDIRECTING_GENERATIVE_CONSTRUCTOR_INVOKE,
+ element: 'generative_constructor(Class#)',
+ arguments: '(true,42)',
+ type: 'Class',
+ selector: 'CallStructure(arity=2)')),
+ const Test(
+ '''
+ class Class {
+ Class() : this._(true, 42);
+ Class._(a, b);
+ }
+ m() => new Class(true, 42);
+ ''',
+ const Visit(VisitKind.VISIT_CONSTRUCTOR_INCOMPATIBLE_INVOKE,
+ element: 'generative_constructor(Class#)',
+ arguments: '(true,42)',
+ type: 'Class',
+ selector: 'CallStructure(arity=2)')),
+ const Test(
+ '''
+ class Class {
+ factory Class(a, b) => new Class._(a, b);
+ Class._(a, b);
+ }
+ m() => new Class(true, 42);
+ ''',
+ const Visit(VisitKind.VISIT_FACTORY_CONSTRUCTOR_INVOKE,
+ element: 'function(Class#)',
+ arguments: '(true,42)',
+ type: 'Class',
+ selector: 'CallStructure(arity=2)')),
+ const Test(
+ '''
+ class Class {
+ factory Class() => new Class._(true, 42);
+ Class._(a, b);
+ }
+ m() => new Class(true, 42);
+ ''',
+ const Visit(VisitKind.VISIT_CONSTRUCTOR_INCOMPATIBLE_INVOKE,
+ element: 'function(Class#)',
+ arguments: '(true,42)',
+ type: 'Class',
+ selector: 'CallStructure(arity=2)')),
+ const Test(
+ '''
+ class Class<T> {
+ factory Class(a, b) = Class<int>.a;
+ factory Class.a(a, b) = Class<Class<T>>.b;
+ Class.b(a, b);
+ }
+ m() => new Class<double>(true, 42);
+ ''',
+ const Visit(VisitKind.VISIT_REDIRECTING_FACTORY_CONSTRUCTOR_INVOKE,
+ element: 'function(Class#)',
+ arguments: '(true,42)',
+ type: 'Class<double>',
+ target: 'generative_constructor(Class#b)',
+ targetType: 'Class<Class<int>>',
+ selector: 'CallStructure(arity=2)')),
+ const Test(
+ '''
+ class Class<T> {
+ factory Class(a) = Class<int>.a;
+ factory Class.a(a, [b]) = Class<Class<T>>.b;
+ Class.b(a, [b]);
+ }
+ m() => new Class<double>(true, 42);
+ ''',
+ const Visit(VisitKind.VISIT_REDIRECTING_FACTORY_CONSTRUCTOR_INVOKE,
+ element: 'function(Class#)',
+ arguments: '(true,42)',
+ type: 'Class<double>',
+ target: 'generative_constructor(Class#b)',
+ targetType: 'Class<Class<int>>',
+ selector: 'CallStructure(arity=2)')),
+ const Test(
+ '''
+ class Class {
+ factory Class() = Class._;
+ Class._();
+ }
+ m() => new Class(true, 42);
+ ''',
+ const Visit(
+ VisitKind.VISIT_UNRESOLVED_REDIRECTING_FACTORY_CONSTRUCTOR_INVOKE,
+ element: 'function(Class#)',
+ arguments: '(true,42)',
+ type: 'Class',
+ selector: 'CallStructure(arity=2)')),
+ const Test(
+ '''
+ class Class<T> {
+ factory Class(a, b) = Class<int>.a;
+ factory Class.a(a, b) = Class<Class<T>>.b;
+ Class.b(a);
+ }
+ m() => new Class<double>(true, 42);
+ ''',
+ const Visit(
+ VisitKind.VISIT_UNRESOLVED_REDIRECTING_FACTORY_CONSTRUCTOR_INVOKE,
+ element: 'function(Class#)',
+ arguments: '(true,42)',
+ type: 'Class<double>',
+ selector: 'CallStructure(arity=2)')),
+ const Test(
+ '''
+ class Class {
+ Class(a, b);
+ }
+ m() => new Class.unresolved(true, 42);
+ ''',
+ const Visit(
+ VisitKind.VISIT_UNRESOLVED_CONSTRUCTOR_INVOKE,
+ arguments: '(true,42)')),
+ const Test(
+ '''
+ m() => new Unresolved(true, 42);
+ ''',
+ const Visit(
+ VisitKind.VISIT_UNRESOLVED_CLASS_CONSTRUCTOR_INVOKE,
+ arguments: '(true,42)')),
+ const Test(
+ '''
+ abstract class AbstractClass {}
+ m() => new AbstractClass();
+ ''',
+ const Visit(
+ VisitKind.VISIT_ABSTRACT_CLASS_CONSTRUCTOR_INVOKE,
+ element: 'generative_constructor(AbstractClass#)',
+ type: 'AbstractClass',
+ arguments: '()',
+ selector: 'CallStructure(arity=0)')),
+ const Test(
+ '''
+ class Class {
+ factory Class(a, b) = Unresolved;
+ }
+ m() => new Class(true, 42);
+ ''',
+ const Visit(
+ VisitKind.VISIT_UNRESOLVED_REDIRECTING_FACTORY_CONSTRUCTOR_INVOKE,
+ element: 'function(Class#)',
+ arguments: '(true,42)',
+ type: 'Class',
+ selector: 'CallStructure(arity=2)')),
+ const Test(
+ '''
+ class Class {
+ factory Class(a, b) = Class.named;
+ }
+ m() => new Class(true, 42);
+ ''',
+ const Visit(
+ VisitKind.VISIT_UNRESOLVED_REDIRECTING_FACTORY_CONSTRUCTOR_INVOKE,
+ element: 'function(Class#)',
+ arguments: '(true,42)',
+ type: 'Class',
+ selector: 'CallStructure(arity=2)')),
+ const Test(
+ '''
+ class Class {
+ factory Class(a, b) = Class.named;
+ factory Class.named(a, b) = Class.unresolved;
+ }
+ m() => new Class(true, 42);
+ ''',
+ const Visit(
+ VisitKind.VISIT_UNRESOLVED_REDIRECTING_FACTORY_CONSTRUCTOR_INVOKE,
+ element: 'function(Class#)',
+ arguments: '(true,42)',
+ type: 'Class',
+ selector: 'CallStructure(arity=2)')),
+ const Test(
+ '''
+ abstract class AbstractClass {
+ AbstractClass(a, b);
+ }
+ class Class {
+ factory Class(a, b) = AbstractClass;
+ }
+ m() => new Class(true, 42);
+ ''',
+ const Visit(
+ VisitKind.VISIT_UNRESOLVED_REDIRECTING_FACTORY_CONSTRUCTOR_INVOKE,
+ element: 'function(Class#)',
+ arguments: '(true,42)',
+ type: 'Class',
+ selector: 'CallStructure(arity=2)')),
+ ],
+ 'If not null expressions': const [
+ const Test(
+ '''
+ m(a) => a?.b;
+ ''',
+ const [
+ const Visit(
+ VisitKind.VISIT_IF_NOT_NULL_DYNAMIC_PROPERTY_GET,
+ receiver: 'a',
+ name: 'b'),
+ const Visit(
+ VisitKind.VISIT_PARAMETER_GET,
+ element: 'parameter(m#a)'),
+ ]),
+ const Test(
+ '''
+ class C {
+ static var b;
+ }
+ m(a) => C?.b;
+ ''',
+ const [
+ const Visit(
+ VisitKind.VISIT_IF_NOT_NULL_DYNAMIC_PROPERTY_GET,
+ receiver: 'C',
+ name: 'b'),
+ const Visit(
+ VisitKind.VISIT_CLASS_TYPE_LITERAL_GET,
+ constant: 'C'),
+ ]),
+ const Test(
+ '''
+ m(a) => a?.b = 42;
+ ''',
+ const [
+ const Visit(
+ VisitKind.VISIT_IF_NOT_NULL_DYNAMIC_PROPERTY_SET,
+ receiver: 'a',
+ name: 'b',
+ rhs: '42'),
+ const Visit(
+ VisitKind.VISIT_PARAMETER_GET,
+ element: 'parameter(m#a)'),
+ ]),
+ const Test(
+ '''
+ m(a) => a?.b(42, true);
+ ''',
+ const [
+ const Visit(
+ VisitKind.VISIT_IF_NOT_NULL_DYNAMIC_PROPERTY_INVOKE,
+ receiver: 'a',
+ arguments: '(42,true)',
+ selector: 'Selector(call, b, arity=2)'),
+ const Visit(
+ VisitKind.VISIT_PARAMETER_GET,
+ element: 'parameter(m#a)'),
+ ]),
+ const Test(
+ '''
+ m(a) => ++a?.b;
+ ''',
+ const [
+ const Visit(
+ VisitKind.VISIT_IF_NOT_NULL_DYNAMIC_PROPERTY_PREFIX,
+ receiver: 'a',
+ getter: 'Selector(getter, b, arity=0)',
+ setter: 'Selector(setter, b, arity=1)',
+ operator: '++'),
+ const Visit(
+ VisitKind.VISIT_PARAMETER_GET,
+ element: 'parameter(m#a)'),
+ ]),
+ const Test(
+ '''
+ m(a) => a?.b--;
+ ''',
+ const [
+ const Visit(
+ VisitKind.VISIT_IF_NOT_NULL_DYNAMIC_PROPERTY_POSTFIX,
+ receiver: 'a',
+ getter: 'Selector(getter, b, arity=0)',
+ setter: 'Selector(setter, b, arity=1)',
+ operator: '--'),
+ const Visit(
+ VisitKind.VISIT_PARAMETER_GET,
+ element: 'parameter(m#a)'),
+ ]),
+ const Test(
+ '''
+ m(a) => a?.b *= 42;
+ ''',
+ const [
+ const Visit(
+ VisitKind.VISIT_IF_NOT_NULL_DYNAMIC_PROPERTY_COMPOUND,
+ receiver: 'a',
+ getter: 'Selector(getter, b, arity=0)',
+ setter: 'Selector(setter, b, arity=1)',
+ operator: '*=',
+ rhs: '42'),
+ const Visit(
+ VisitKind.VISIT_PARAMETER_GET,
+ element: 'parameter(m#a)'),
+ ]),
+ const Test(
+ '''
+ m(a, b) => a ?? b;
+ ''',
+ const [
+ const Visit(VisitKind.VISIT_IF_NULL,
+ left: 'a', right: 'b'),
+ const Visit(
+ VisitKind.VISIT_PARAMETER_GET,
+ element: 'parameter(m#a)'),
+ const Visit(
+ VisitKind.VISIT_PARAMETER_GET,
+ element: 'parameter(m#b)'),
+ ]),
+ const Test(
+ '''
+ m(a) => a ??= 42;
+ ''',
+ const Visit(
+ VisitKind.VISIT_PARAMETER_COMPOUND,
+ element: 'parameter(m#a)',
+ operator: '??=',
+ rhs: '42')),
+ ],
+};

Powered by Google App Engine
This is Rietveld 408576698