From b1c1606e17f1302c67de06f6a88ac56d229ef334 Mon Sep 17 00:00:00 2001 From: Stephan Herhut Date: Thu, 25 Jun 2015 13:41:53 +0200 Subject: [PATCH] Enforce LF line endings in the git database. BUG= R=ricow@google.com Review URL: https://codereview.chromium.org//1168393003. --- .gitattributes | 19 + .../dart2js/async_await_syntax_test.dart | 44 +- .../dart2js/backend_dart/end2end_test.dart | 72 +- .../dart2js/backend_dart/sexpr2_test.dart | 122 +- .../dart2js/backend_dart/test_helper.dart | 92 +- .../compiler/dart2js/check_members_test.dart | 106 +- .../constant_expression_evaluate_test.dart | 474 +- tests/compiler/dart2js/exit_code_helper.dart | 4 +- tests/compiler/dart2js/frontend_checker.dart | 220 +- .../compiler/dart2js/import_mirrors_test.dart | 826 +- .../dart2js/instantiated_classes_test.dart | 170 +- .../least_upper_bound_language_test.dart | 44 +- .../dart2js/least_upper_bound_test.dart | 1704 ++-- .../dart2js/line_column_provider_test.dart | 168 +- .../dart2js/mirror_system_helper.dart | 278 +- .../class_mirror_type_variables_test.dart | 84 +- .../dart2js/mirrors/default_value_test.dart | 124 +- .../mirrors/library_exports_hidden_test.dart | 34 +- .../mirrors/library_exports_shown_test.dart | 34 +- .../mirrors/library_imports_hidden_test.dart | 34 +- ...brary_imports_prefixed_show_hide_test.dart | 34 +- .../library_imports_prefixed_test.dart | 34 +- .../mirrors/library_imports_shown_test.dart | 34 +- .../dart2js/mirrors/mirrors_reader_test.dart | 282 +- .../dart2js/mirrors/mirrors_test_helper.dart | 72 +- .../mirrors/relation_assignable_test.dart | 34 +- .../mirrors/relation_subclass_test.dart | 34 +- .../mirrors/relation_subtype_test.dart | 34 +- .../dart2js/mirrors_exports_test.dart | 364 +- .../compiler/dart2js/mirrors_mixin_test.dart | 478 +- .../compiler/dart2js/mixin_language_test.dart | 42 +- .../dart2js/mixin_typevariable_test.dart | 316 +- .../dart2js/override_inheritance_test.dart | 3092 +++---- tests/compiler/dart2js/proxy_test.dart | 44 +- .../dart2js/semantic_visitor_test.dart | 1412 ++-- .../semantic_visitor_test_decl_data.dart | 1740 ++-- .../semantic_visitor_test_decl_visitor.dart | 966 +-- .../semantic_visitor_test_send_data.dart | 7134 ++++++++--------- .../semantic_visitor_test_send_visitor.dart | 5886 +++++++------- tests/compiler/dart2js/type_order_test.dart | 142 +- .../compiler/dart2js/type_promotion_test.dart | 58 +- tests/compiler/dart2js/warnings_checker.dart | 166 +- .../string_interpolation_dynamic_test.dart | 2 +- .../string_interpolation_test.dart | 2 +- 44 files changed, 13537 insertions(+), 13518 deletions(-) create mode 100644 .gitattributes diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 00000000000..72661336676 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,19 @@ +# Explicitly declare text files we want to be normalized. +*.c text +*.cpp text +*.h text +*.gyp text +*.gypi text +*.dart text +*.mk text +*.Makefile text +*.md text +*.yaml text + +# Windows files that should not be converted. +tests/lib/mirrors/method_mirror_source_line_ending_crlf.dart -text + +# Files to leave alone and not diff. +*.png binary +*.jpg binary +*.xpi binary diff --git a/tests/compiler/dart2js/async_await_syntax_test.dart b/tests/compiler/dart2js/async_await_syntax_test.dart index 336a7cd0545..bf9d53383ea 100644 --- a/tests/compiler/dart2js/async_await_syntax_test.dart +++ b/tests/compiler/dart2js/async_await_syntax_test.dart @@ -1,22 +1,22 @@ -// Copyright (c) 2014, 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. - -// Test that dart2js produces the expected static type warnings and -// compile-time errors for these tests. - -import 'frontend_checker.dart'; - -/// Map of test files to run together with their associated whitelist. -/// -/// For instance -/// 'language/async_await_syntax_test.dart': const ['a03b', 'a04b'] -/// includes the multitest in 'language/async_await_syntax_test.dart' but -/// expects the subtests 'a03b' and 'a04c' to fail. -const Map> TESTS = const >{ - 'language/async_await_syntax_test.dart': const [], -}; - -void main(List arguments) { - check(TESTS, arguments: arguments, options: ['--enable-async']); -} +// Copyright (c) 2014, 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. + +// Test that dart2js produces the expected static type warnings and +// compile-time errors for these tests. + +import 'frontend_checker.dart'; + +/// Map of test files to run together with their associated whitelist. +/// +/// For instance +/// 'language/async_await_syntax_test.dart': const ['a03b', 'a04b'] +/// includes the multitest in 'language/async_await_syntax_test.dart' but +/// expects the subtests 'a03b' and 'a04c' to fail. +const Map> TESTS = const >{ + 'language/async_await_syntax_test.dart': const [], +}; + +void main(List arguments) { + check(TESTS, arguments: arguments, options: ['--enable-async']); +} diff --git a/tests/compiler/dart2js/backend_dart/end2end_test.dart b/tests/compiler/dart2js/backend_dart/end2end_test.dart index a2a25208928..3a7f9028b5d 100644 --- a/tests/compiler/dart2js/backend_dart/end2end_test.dart +++ b/tests/compiler/dart2js/backend_dart/end2end_test.dart @@ -1,37 +1,37 @@ -// Copyright (c) 2014, 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. - -/// End-to-end test of the dart2dart compiler. -library dart_backend.end2end_test; - -import 'package:async_helper/async_helper.dart'; -import 'package:compiler/src/dart2jslib.dart'; -import 'package:compiler/src/dart_backend/dart_backend.dart'; -import 'package:expect/expect.dart'; - -import '../../../../pkg/analyzer2dart/test/test_helper.dart' hide TestSpec; -import '../../../../pkg/analyzer2dart/test/end2end_data.dart'; - -import 'test_helper.dart'; -import '../output_collector.dart'; - -main(List args) { - performTests(TEST_DATA, asyncTester, runTest, args); -} - -runTest(TestSpec result) { - OutputCollector outputCollector = new OutputCollector(); - asyncTest(() => compilerFor(result.input, outputProvider: outputCollector) - .then((Compiler compiler) { - String expectedOutput = result.output.trim(); - compiler.phase = Compiler.PHASE_COMPILING; - DartBackend backend = compiler.backend; - backend.assembleProgram(); - String output = outputCollector.getOutput('', 'dart').trim(); - Expect.equals(expectedOutput, output, - '\nInput:\n${result.input}\n' - 'Expected:\n$expectedOutput\n' - 'Actual:\n$output\n'); - })); +// Copyright (c) 2014, 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. + +/// End-to-end test of the dart2dart compiler. +library dart_backend.end2end_test; + +import 'package:async_helper/async_helper.dart'; +import 'package:compiler/src/dart2jslib.dart'; +import 'package:compiler/src/dart_backend/dart_backend.dart'; +import 'package:expect/expect.dart'; + +import '../../../../pkg/analyzer2dart/test/test_helper.dart' hide TestSpec; +import '../../../../pkg/analyzer2dart/test/end2end_data.dart'; + +import 'test_helper.dart'; +import '../output_collector.dart'; + +main(List args) { + performTests(TEST_DATA, asyncTester, runTest, args); +} + +runTest(TestSpec result) { + OutputCollector outputCollector = new OutputCollector(); + asyncTest(() => compilerFor(result.input, outputProvider: outputCollector) + .then((Compiler compiler) { + String expectedOutput = result.output.trim(); + compiler.phase = Compiler.PHASE_COMPILING; + DartBackend backend = compiler.backend; + backend.assembleProgram(); + String output = outputCollector.getOutput('', 'dart').trim(); + Expect.equals(expectedOutput, output, + '\nInput:\n${result.input}\n' + 'Expected:\n$expectedOutput\n' + 'Actual:\n$output\n'); + })); } \ No newline at end of file diff --git a/tests/compiler/dart2js/backend_dart/sexpr2_test.dart b/tests/compiler/dart2js/backend_dart/sexpr2_test.dart index 35c31853b47..71d294b2776 100644 --- a/tests/compiler/dart2js/backend_dart/sexpr2_test.dart +++ b/tests/compiler/dart2js/backend_dart/sexpr2_test.dart @@ -1,62 +1,62 @@ -// Copyright (c) 2014, 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. - -/// Unittest test of the CPS ir generated by the dart2dart compiler. -library dart_backend.sexpr2_test; - -import 'package:compiler/src/dart2jslib.dart'; -import 'package:compiler/src/cps_ir/cps_ir_nodes.dart'; -import 'package:compiler/src/cps_ir/cps_ir_nodes_sexpr.dart'; -import 'package:compiler/src/elements/elements.dart'; -import 'package:expect/expect.dart'; - -import '../../../../pkg/analyzer2dart/test/test_helper.dart'; -import '../../../../pkg/analyzer2dart/test/sexpr_data.dart'; - -import 'test_helper.dart'; - -main(List args) { - performTests(TEST_DATA, asyncTester, runTest, args); -} - -runTest(TestSpec result) { - return compilerFor(result.input).then((Compiler compiler) { - void checkOutput(String elementName, - Element element, - String expectedOutput) { - FunctionDefinition ir = compiler.irBuilder.getIr(element); - if (expectedOutput == null) { - Expect.isNull(ir, "\nInput:\n${result.input}\n" - "No CPS IR expected for $element"); - } else { - Expect.isNotNull(ir, "\nInput:\n${result.input}\n" - "No CPS IR for $element"); - expectedOutput = expectedOutput.trim(); - String output = ir.accept(new SExpressionStringifier()).trim(); - Expect.equals(expectedOutput, output, - "\nInput:\n${result.input}\n" - "Expected for '$elementName':\n$expectedOutput\n" - "Actual for '$elementName':\n$output\n"); - } - } - - if (result.output is String) { - checkOutput('main', compiler.mainFunction, result.output); - } else { - assert(result.output is Map); - result.output.forEach((String elementName, String output) { - Element element; - if (elementName.contains('.')) { - ClassElement cls = compiler.mainApp.localLookup( - elementName.substring(0, elementName.indexOf('.'))); - element = cls.localLookup( - elementName.substring(elementName.indexOf('.') + 1)); - } else { - element = compiler.mainApp.localLookup(elementName); - } - checkOutput(elementName, element, output); - }); - } - }); +// Copyright (c) 2014, 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. + +/// Unittest test of the CPS ir generated by the dart2dart compiler. +library dart_backend.sexpr2_test; + +import 'package:compiler/src/dart2jslib.dart'; +import 'package:compiler/src/cps_ir/cps_ir_nodes.dart'; +import 'package:compiler/src/cps_ir/cps_ir_nodes_sexpr.dart'; +import 'package:compiler/src/elements/elements.dart'; +import 'package:expect/expect.dart'; + +import '../../../../pkg/analyzer2dart/test/test_helper.dart'; +import '../../../../pkg/analyzer2dart/test/sexpr_data.dart'; + +import 'test_helper.dart'; + +main(List args) { + performTests(TEST_DATA, asyncTester, runTest, args); +} + +runTest(TestSpec result) { + return compilerFor(result.input).then((Compiler compiler) { + void checkOutput(String elementName, + Element element, + String expectedOutput) { + FunctionDefinition ir = compiler.irBuilder.getIr(element); + if (expectedOutput == null) { + Expect.isNull(ir, "\nInput:\n${result.input}\n" + "No CPS IR expected for $element"); + } else { + Expect.isNotNull(ir, "\nInput:\n${result.input}\n" + "No CPS IR for $element"); + expectedOutput = expectedOutput.trim(); + String output = ir.accept(new SExpressionStringifier()).trim(); + Expect.equals(expectedOutput, output, + "\nInput:\n${result.input}\n" + "Expected for '$elementName':\n$expectedOutput\n" + "Actual for '$elementName':\n$output\n"); + } + } + + if (result.output is String) { + checkOutput('main', compiler.mainFunction, result.output); + } else { + assert(result.output is Map); + result.output.forEach((String elementName, String output) { + Element element; + if (elementName.contains('.')) { + ClassElement cls = compiler.mainApp.localLookup( + elementName.substring(0, elementName.indexOf('.'))); + element = cls.localLookup( + elementName.substring(elementName.indexOf('.') + 1)); + } else { + element = compiler.mainApp.localLookup(elementName); + } + checkOutput(elementName, element, output); + }); + } + }); } \ No newline at end of file diff --git a/tests/compiler/dart2js/backend_dart/test_helper.dart b/tests/compiler/dart2js/backend_dart/test_helper.dart index 3e43cd9a658..a355d7e264f 100644 --- a/tests/compiler/dart2js/backend_dart/test_helper.dart +++ b/tests/compiler/dart2js/backend_dart/test_helper.dart @@ -1,46 +1,46 @@ -// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file -// for details. All rights reserved. Use of this source code is governed by a -// BSD-style license that can be found in the LICENSE file. - -library dart_backend.test_helper; - -import 'dart:async'; -import 'package:async_helper/async_helper.dart'; -import 'package:compiler/compiler.dart' as api; -import 'package:compiler/src/dart2jslib.dart'; -import '../../../../pkg/analyzer2dart/test/test_helper.dart'; -import '../compiler_helper.dart'; - -/// Compiles the given dart code (which must include a 'main' function) and -/// returns the compiler. -Future compilerFor(String code, - {api.CompilerOutputProvider outputProvider}) { - MockCompiler compiler = new MockCompiler.internal( - emitJavaScript: false, - enableMinification: false, - outputProvider: outputProvider); - compiler.diagnosticHandler = createHandler(compiler, code); - return compiler.init().then((_) { - compiler.parseScript(code); - - Element element = compiler.mainApp.find('main'); - if (element == null) return null; - - compiler.mainFunction = element; - compiler.phase = Compiler.PHASE_RESOLVING; - compiler.backend.enqueueHelpers(compiler.enqueuer.resolution, - compiler.globalDependencies); - compiler.processQueue(compiler.enqueuer.resolution, element); - compiler.world.populate(); - compiler.backend.onResolutionComplete(); - - compiler.irBuilder.buildNodes(); - - return compiler; - }); -} - -/// Test group using async_helper. -asyncTester(Group group, RunTest runTest) { - asyncTest(() => Future.forEach(group.results, runTest)); -} +// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +library dart_backend.test_helper; + +import 'dart:async'; +import 'package:async_helper/async_helper.dart'; +import 'package:compiler/compiler.dart' as api; +import 'package:compiler/src/dart2jslib.dart'; +import '../../../../pkg/analyzer2dart/test/test_helper.dart'; +import '../compiler_helper.dart'; + +/// Compiles the given dart code (which must include a 'main' function) and +/// returns the compiler. +Future compilerFor(String code, + {api.CompilerOutputProvider outputProvider}) { + MockCompiler compiler = new MockCompiler.internal( + emitJavaScript: false, + enableMinification: false, + outputProvider: outputProvider); + compiler.diagnosticHandler = createHandler(compiler, code); + return compiler.init().then((_) { + compiler.parseScript(code); + + Element element = compiler.mainApp.find('main'); + if (element == null) return null; + + compiler.mainFunction = element; + compiler.phase = Compiler.PHASE_RESOLVING; + compiler.backend.enqueueHelpers(compiler.enqueuer.resolution, + compiler.globalDependencies); + compiler.processQueue(compiler.enqueuer.resolution, element); + compiler.world.populate(); + compiler.backend.onResolutionComplete(); + + compiler.irBuilder.buildNodes(); + + return compiler; + }); +} + +/// Test group using async_helper. +asyncTester(Group group, RunTest runTest) { + asyncTest(() => Future.forEach(group.results, runTest)); +} diff --git a/tests/compiler/dart2js/check_members_test.dart b/tests/compiler/dart2js/check_members_test.dart index 023e8490d7a..fff8a93e4e4 100644 --- a/tests/compiler/dart2js/check_members_test.dart +++ b/tests/compiler/dart2js/check_members_test.dart @@ -1,53 +1,53 @@ -// Copyright (c) 2013, 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. - -// Test that dart2js produces the expected static type warnings for least upper -// bound language tests. This ensures that the analyzer and dart2js agrees -// on these tests. - -import 'warnings_checker.dart'; - -/// Map from test files to a map of their expected status. If the status map is -/// `null` no warnings must be missing or unexpected, otherwise the status map -/// can contain a list of line numbers for keys 'missing' and 'unexpected' for -/// the warnings of each category. -const Map TESTS = const { - // Instance methods. - 'co19/src/Language/07_Classes/1_Instance_Methods_A01_t01.dart': null, - 'co19/src/Language/07_Classes/1_Instance_Methods_A01_t02.dart': null, - - 'language/check_method_override_test.dart': null, - 'co19/src/Language/07_Classes/1_Instance_Methods_A06_t01.dart': null, - 'co19/src/Language/07_Classes/1_Instance_Methods_A06_t02.dart': null, - - 'co19/src/Language/07_Classes/1_Instance_Methods_A02_t01.dart': null, - 'co19/src/Language/07_Classes/1_Instance_Methods_A02_t02.dart': null, - 'co19/src/Language/07_Classes/1_Instance_Methods_A02_t03.dart': null, - 'co19/src/Language/07_Classes/1_Instance_Methods_A02_t04.dart': null, - 'co19/src/Language/07_Classes/1_Instance_Methods_A02_t05.dart': null, - 'co19/src/Language/07_Classes/1_Instance_Methods_A02_t06.dart': null, - 'co19/src/Language/07_Classes/1_Instance_Methods_A03_t01.dart': null, - 'co19/src/Language/07_Classes/1_Instance_Methods_A03_t02.dart': null, - 'co19/src/Language/07_Classes/1_Instance_Methods_A03_t03.dart': null, - 'co19/src/Language/07_Classes/1_Instance_Methods_A03_t04.dart': null, - 'co19/src/Language/07_Classes/1_Instance_Methods_A03_t05.dart': null, - 'co19/src/Language/07_Classes/1_Instance_Methods_A03_t06.dart': null, - - 'co19/src/Language/07_Classes/1_Instance_Methods_A05_t01.dart': null, - 'co19/src/Language/07_Classes/1_Instance_Methods_A05_t02.dart': null, - 'co19/src/Language/07_Classes/1_Instance_Methods_A05_t04.dart': null, - 'co19/src/Language/07_Classes/1_Instance_Methods_A05_t05.dart': null, - 'co19/src/Language/07_Classes/1_Instance_Methods_A05_t06.dart': null, - 'co19/src/Language/07_Classes/1_Instance_Methods_A05_t07.dart': null, - 'co19/src/Language/07_Classes/1_Instance_Methods_A05_t08.dart': null, - // Getters. - 'co19/src/Language/07_Classes/2_Getters_A05_t01.dart': null, - 'co19/src/Language/07_Classes/2_Getters_A05_t02.dart': null, - 'co19/src/Language/07_Classes/2_Getters_A05_t03.dart': null, - 'co19/src/Language/07_Classes/2_Getters_A05_t04.dart': null, -}; - -void main() { - checkWarnings(TESTS); -} +// Copyright (c) 2013, 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. + +// Test that dart2js produces the expected static type warnings for least upper +// bound language tests. This ensures that the analyzer and dart2js agrees +// on these tests. + +import 'warnings_checker.dart'; + +/// Map from test files to a map of their expected status. If the status map is +/// `null` no warnings must be missing or unexpected, otherwise the status map +/// can contain a list of line numbers for keys 'missing' and 'unexpected' for +/// the warnings of each category. +const Map TESTS = const { + // Instance methods. + 'co19/src/Language/07_Classes/1_Instance_Methods_A01_t01.dart': null, + 'co19/src/Language/07_Classes/1_Instance_Methods_A01_t02.dart': null, + + 'language/check_method_override_test.dart': null, + 'co19/src/Language/07_Classes/1_Instance_Methods_A06_t01.dart': null, + 'co19/src/Language/07_Classes/1_Instance_Methods_A06_t02.dart': null, + + 'co19/src/Language/07_Classes/1_Instance_Methods_A02_t01.dart': null, + 'co19/src/Language/07_Classes/1_Instance_Methods_A02_t02.dart': null, + 'co19/src/Language/07_Classes/1_Instance_Methods_A02_t03.dart': null, + 'co19/src/Language/07_Classes/1_Instance_Methods_A02_t04.dart': null, + 'co19/src/Language/07_Classes/1_Instance_Methods_A02_t05.dart': null, + 'co19/src/Language/07_Classes/1_Instance_Methods_A02_t06.dart': null, + 'co19/src/Language/07_Classes/1_Instance_Methods_A03_t01.dart': null, + 'co19/src/Language/07_Classes/1_Instance_Methods_A03_t02.dart': null, + 'co19/src/Language/07_Classes/1_Instance_Methods_A03_t03.dart': null, + 'co19/src/Language/07_Classes/1_Instance_Methods_A03_t04.dart': null, + 'co19/src/Language/07_Classes/1_Instance_Methods_A03_t05.dart': null, + 'co19/src/Language/07_Classes/1_Instance_Methods_A03_t06.dart': null, + + 'co19/src/Language/07_Classes/1_Instance_Methods_A05_t01.dart': null, + 'co19/src/Language/07_Classes/1_Instance_Methods_A05_t02.dart': null, + 'co19/src/Language/07_Classes/1_Instance_Methods_A05_t04.dart': null, + 'co19/src/Language/07_Classes/1_Instance_Methods_A05_t05.dart': null, + 'co19/src/Language/07_Classes/1_Instance_Methods_A05_t06.dart': null, + 'co19/src/Language/07_Classes/1_Instance_Methods_A05_t07.dart': null, + 'co19/src/Language/07_Classes/1_Instance_Methods_A05_t08.dart': null, + // Getters. + 'co19/src/Language/07_Classes/2_Getters_A05_t01.dart': null, + 'co19/src/Language/07_Classes/2_Getters_A05_t02.dart': null, + 'co19/src/Language/07_Classes/2_Getters_A05_t03.dart': null, + 'co19/src/Language/07_Classes/2_Getters_A05_t04.dart': null, +}; + +void main() { + checkWarnings(TESTS); +} diff --git a/tests/compiler/dart2js/constant_expression_evaluate_test.dart b/tests/compiler/dart2js/constant_expression_evaluate_test.dart index 2e824120798..94a0213eaac 100644 --- a/tests/compiler/dart2js/constant_expression_evaluate_test.dart +++ b/tests/compiler/dart2js/constant_expression_evaluate_test.dart @@ -1,237 +1,237 @@ -// Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file -// for details. All rights reserved. Use of this source code is governed by a -// BSD-style license that can be found in the LICENSE file. - -library dart2js.constants.expressions.evaluate_test; - -import 'dart:async'; -import 'package:async_helper/async_helper.dart'; -import 'package:expect/expect.dart'; -import 'package:compiler/src/constants/expressions.dart'; -import 'package:compiler/src/constants/values.dart'; -import 'package:compiler/src/constant_system_dart.dart'; -import 'package:compiler/src/core_types.dart'; -import 'package:compiler/src/dart2jslib.dart'; -import 'package:compiler/src/elements/elements.dart'; -import 'memory_compiler.dart'; - -class TestData { - /// Declarations needed for the [constants]. - final String declarations; - /// Tested constants. - final List constants; - - const TestData(this.declarations, this.constants); -} - -class ConstantData { - /// Source code for the constant expression. - final String code; - /// Map from environment to expected constant value as structured text. - final Map, String> expectedValues; - - const ConstantData(this.code, - this.expectedValues); -} - -class MemoryEnvironment implements Environment { - final Compiler compiler; - final Map env; - - MemoryEnvironment(this.compiler, - [this.env = const {}]); - - @override - String readFromEnvironment(String name) => env[name]; -} - -const List DATA = const [ - const TestData('', const [ - const ConstantData('null', const { const {} : 'NullConstant' }), - const ConstantData('false', const { const {} : 'BoolConstant(false)' }), - const ConstantData('true', const { const {} : 'BoolConstant(true)' }), - const ConstantData('0', const { const {} : 'IntConstant(0)' }), - const ConstantData('0.0', const { const {} : 'DoubleConstant(0.0)' }), - const ConstantData('"foo"', const { const {} : 'StringConstant("foo")' }), - const ConstantData('1 + 2', const { const {} : 'IntConstant(3)' }), - const ConstantData('-(1)', const { const {} : 'IntConstant(-1)' }), - const ConstantData('"foo".length', const { const {} : 'IntConstant(3)' }), - const ConstantData('identical(0, 1)', - const { const {} : 'BoolConstant(false)' }), - const ConstantData('"a" "b"', const { const {} : 'StringConstant("ab")' }), - const ConstantData('identical', - const { const {} : 'FunctionConstant(identical)' }), - const ConstantData('true ? 0 : 1', const { const {} : 'IntConstant(0)' }), - const ConstantData('proxy', - const { const {} : 'ConstructedConstant(_Proxy())' }), - const ConstantData('Object', const { const {} : 'TypeConstant(Object)' }), - const ConstantData('const [0, 1]', - const { const {} : 'ListConstant([IntConstant(0), IntConstant(1)])' }), - const ConstantData('const [0, 1]', const { - const {} : 'ListConstant([IntConstant(0), IntConstant(1)])' }), - const ConstantData('const {0: 1, 2: 3}', - const { const {} : - 'MapConstant({IntConstant(0): IntConstant(1), ' - 'IntConstant(2): IntConstant(3)})' }), - const ConstantData('const {0: 1, 2: 3}', - const { const {} : - 'MapConstant({IntConstant(0): IntConstant(1), ' - 'IntConstant(2): IntConstant(3)})' }), - const ConstantData( - 'const bool.fromEnvironment("foo", defaultValue: false)', - const { const {} : 'BoolConstant(false)', - const {'foo': 'true'} : 'BoolConstant(true)'}), - const ConstantData( - 'const int.fromEnvironment("foo", defaultValue: 42)', - const { const {} : 'IntConstant(42)', - const {'foo': '87'} : 'IntConstant(87)'}), - const ConstantData( - 'const String.fromEnvironment("foo", defaultValue: "bar")', - const { const {} : 'StringConstant("bar")', - const {'foo': 'foo'} : 'StringConstant("foo")'}), - ]), - const TestData(''' -const a = const bool.fromEnvironment("foo", defaultValue: true); -const b = const int.fromEnvironment("bar", defaultValue: 42); - -class A { - const A(); -} -class B { - final field1; - const B(this.field1); -} -class C extends B { - final field2; - const C({field1: 42, this.field2: false}) : super(field1); - const C.named([field = false]) : this(field1: field, field2: field); -} -''', const [ - const ConstantData('const Object()', - const { const {} : 'ConstructedConstant(Object())' }), - const ConstantData('const A()', - const { const {} : 'ConstructedConstant(A())' }), - const ConstantData('const B(0)', - const { const {} : 'ConstructedConstant(B(field1=IntConstant(0)))' }), - const ConstantData('const B(const A())', - const { const {} : - 'ConstructedConstant(B(field1=ConstructedConstant(A())))' }), - const ConstantData('const C()', const { const {} : - 'ConstructedConstant(C(field1=IntConstant(42),' - 'field2=BoolConstant(false)))' }), - const ConstantData('const C(field1: 87)', const { const {} : - 'ConstructedConstant(C(field1=IntConstant(87),' - 'field2=BoolConstant(false)))' }), - const ConstantData('const C(field2: true)', const { const {} : - 'ConstructedConstant(C(field1=IntConstant(42),' - 'field2=BoolConstant(true)))' }), - const ConstantData('const C.named()', const { const {} : - 'ConstructedConstant(C(field1=BoolConstant(false),' - 'field2=BoolConstant(false)))' }), - const ConstantData('const C.named(87)', const { const {} : - 'ConstructedConstant(C(field1=IntConstant(87),' - 'field2=IntConstant(87)))' }), - const ConstantData('const C(field1: a, field2: b)', const { - const {} : - 'ConstructedConstant(C(field1=BoolConstant(true),' - 'field2=IntConstant(42)))', - const {'foo': 'false', 'bar': '87'} : - 'ConstructedConstant(C(field1=BoolConstant(false),' - 'field2=IntConstant(87)))', }), - ]), - const TestData(''' -class A implements B { - final field1; - const A({this.field1:42}); -} -class B implements C { - const factory B({field1}) = A>; - const factory B.named() = A; -} -class C { - const factory C({field1}) = A>; -} -''', const [ - const ConstantData('const A()', - const { const {} : - 'ConstructedConstant(A(field1=IntConstant(42)))' }), - const ConstantData('const A(field1: 87)', - const { const {} : - 'ConstructedConstant(A(field1=IntConstant(87)))' }), - const ConstantData('const B()', - const { const {} : - 'ConstructedConstant(A>(field1=IntConstant(42)))' }), - const ConstantData('const B()', - const { const {} : - 'ConstructedConstant(A>(field1=IntConstant(42)))' }), - const ConstantData('const B(field1: 87)', - const { const {} : - 'ConstructedConstant(A>(field1=IntConstant(87)))' }), - const ConstantData('const C(field1: 87)', - const { const {} : - 'ConstructedConstant(A>(field1=IntConstant(87)))' }), - const ConstantData('const B.named()', - const { const {} : - 'ConstructedConstant(A(field1=IntConstant(42)))' }), - ]), - const TestData(''' -const c = const int.fromEnvironment("foo", defaultValue: 5); -const d = const int.fromEnvironment("bar", defaultValue: 10); - -class A { - final field; - const A(a, b) : field = a + b; -} - -class B extends A { - const B(a) : super(a, a * 2); -} -''', const [ - const ConstantData('const A(c, d)', const { - const {} : - 'ConstructedConstant(A(field=IntConstant(15)))', - const {'foo': '7', 'bar': '11'} : - 'ConstructedConstant(A(field=IntConstant(18)))', }), - const ConstantData('const B(d)', const { - const {} : - 'ConstructedConstant(B(field=IntConstant(30)))', - const {'bar': '42'} : - 'ConstructedConstant(B(field=IntConstant(126)))', }), - ]), -]; - -main() { - asyncTest(() => Future.forEach(DATA, testData)); -} - -Future testData(TestData data) { - StringBuffer sb = new StringBuffer(); - sb.write('${data.declarations}\n'); - Map constants = {}; - data.constants.forEach((ConstantData constantData) { - String name = 'c${constants.length}'; - sb.write('const $name = ${constantData.code};\n'); - constants[name] = constantData; - }); - sb.write('main() {}\n'); - String source = sb.toString(); - Compiler compiler = compilerFor( - {'main.dart': source}, options: ['--analyze-all']); - return compiler.runCompiler(Uri.parse('memory:main.dart')).then((_) { - var library = compiler.mainApp; - constants.forEach((String name, ConstantData data) { - FieldElement field = library.localLookup(name); - ConstantExpression constant = field.constant; - data.expectedValues.forEach( - (Map env, String expectedText) { - Environment environment = new MemoryEnvironment(compiler, env); - ConstantValue value = - constant.evaluate(environment, DART_CONSTANT_SYSTEM); - String valueText = value.toStructuredString(); - Expect.equals(expectedText, valueText, - "Unexpected value '${valueText}' for contant " - "`${constant.getText()}`, expected '${expectedText}'."); - }); - }); - }); -} +// Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +library dart2js.constants.expressions.evaluate_test; + +import 'dart:async'; +import 'package:async_helper/async_helper.dart'; +import 'package:expect/expect.dart'; +import 'package:compiler/src/constants/expressions.dart'; +import 'package:compiler/src/constants/values.dart'; +import 'package:compiler/src/constant_system_dart.dart'; +import 'package:compiler/src/core_types.dart'; +import 'package:compiler/src/dart2jslib.dart'; +import 'package:compiler/src/elements/elements.dart'; +import 'memory_compiler.dart'; + +class TestData { + /// Declarations needed for the [constants]. + final String declarations; + /// Tested constants. + final List constants; + + const TestData(this.declarations, this.constants); +} + +class ConstantData { + /// Source code for the constant expression. + final String code; + /// Map from environment to expected constant value as structured text. + final Map, String> expectedValues; + + const ConstantData(this.code, + this.expectedValues); +} + +class MemoryEnvironment implements Environment { + final Compiler compiler; + final Map env; + + MemoryEnvironment(this.compiler, + [this.env = const {}]); + + @override + String readFromEnvironment(String name) => env[name]; +} + +const List DATA = const [ + const TestData('', const [ + const ConstantData('null', const { const {} : 'NullConstant' }), + const ConstantData('false', const { const {} : 'BoolConstant(false)' }), + const ConstantData('true', const { const {} : 'BoolConstant(true)' }), + const ConstantData('0', const { const {} : 'IntConstant(0)' }), + const ConstantData('0.0', const { const {} : 'DoubleConstant(0.0)' }), + const ConstantData('"foo"', const { const {} : 'StringConstant("foo")' }), + const ConstantData('1 + 2', const { const {} : 'IntConstant(3)' }), + const ConstantData('-(1)', const { const {} : 'IntConstant(-1)' }), + const ConstantData('"foo".length', const { const {} : 'IntConstant(3)' }), + const ConstantData('identical(0, 1)', + const { const {} : 'BoolConstant(false)' }), + const ConstantData('"a" "b"', const { const {} : 'StringConstant("ab")' }), + const ConstantData('identical', + const { const {} : 'FunctionConstant(identical)' }), + const ConstantData('true ? 0 : 1', const { const {} : 'IntConstant(0)' }), + const ConstantData('proxy', + const { const {} : 'ConstructedConstant(_Proxy())' }), + const ConstantData('Object', const { const {} : 'TypeConstant(Object)' }), + const ConstantData('const [0, 1]', + const { const {} : 'ListConstant([IntConstant(0), IntConstant(1)])' }), + const ConstantData('const [0, 1]', const { + const {} : 'ListConstant([IntConstant(0), IntConstant(1)])' }), + const ConstantData('const {0: 1, 2: 3}', + const { const {} : + 'MapConstant({IntConstant(0): IntConstant(1), ' + 'IntConstant(2): IntConstant(3)})' }), + const ConstantData('const {0: 1, 2: 3}', + const { const {} : + 'MapConstant({IntConstant(0): IntConstant(1), ' + 'IntConstant(2): IntConstant(3)})' }), + const ConstantData( + 'const bool.fromEnvironment("foo", defaultValue: false)', + const { const {} : 'BoolConstant(false)', + const {'foo': 'true'} : 'BoolConstant(true)'}), + const ConstantData( + 'const int.fromEnvironment("foo", defaultValue: 42)', + const { const {} : 'IntConstant(42)', + const {'foo': '87'} : 'IntConstant(87)'}), + const ConstantData( + 'const String.fromEnvironment("foo", defaultValue: "bar")', + const { const {} : 'StringConstant("bar")', + const {'foo': 'foo'} : 'StringConstant("foo")'}), + ]), + const TestData(''' +const a = const bool.fromEnvironment("foo", defaultValue: true); +const b = const int.fromEnvironment("bar", defaultValue: 42); + +class A { + const A(); +} +class B { + final field1; + const B(this.field1); +} +class C extends B { + final field2; + const C({field1: 42, this.field2: false}) : super(field1); + const C.named([field = false]) : this(field1: field, field2: field); +} +''', const [ + const ConstantData('const Object()', + const { const {} : 'ConstructedConstant(Object())' }), + const ConstantData('const A()', + const { const {} : 'ConstructedConstant(A())' }), + const ConstantData('const B(0)', + const { const {} : 'ConstructedConstant(B(field1=IntConstant(0)))' }), + const ConstantData('const B(const A())', + const { const {} : + 'ConstructedConstant(B(field1=ConstructedConstant(A())))' }), + const ConstantData('const C()', const { const {} : + 'ConstructedConstant(C(field1=IntConstant(42),' + 'field2=BoolConstant(false)))' }), + const ConstantData('const C(field1: 87)', const { const {} : + 'ConstructedConstant(C(field1=IntConstant(87),' + 'field2=BoolConstant(false)))' }), + const ConstantData('const C(field2: true)', const { const {} : + 'ConstructedConstant(C(field1=IntConstant(42),' + 'field2=BoolConstant(true)))' }), + const ConstantData('const C.named()', const { const {} : + 'ConstructedConstant(C(field1=BoolConstant(false),' + 'field2=BoolConstant(false)))' }), + const ConstantData('const C.named(87)', const { const {} : + 'ConstructedConstant(C(field1=IntConstant(87),' + 'field2=IntConstant(87)))' }), + const ConstantData('const C(field1: a, field2: b)', const { + const {} : + 'ConstructedConstant(C(field1=BoolConstant(true),' + 'field2=IntConstant(42)))', + const {'foo': 'false', 'bar': '87'} : + 'ConstructedConstant(C(field1=BoolConstant(false),' + 'field2=IntConstant(87)))', }), + ]), + const TestData(''' +class A implements B { + final field1; + const A({this.field1:42}); +} +class B implements C { + const factory B({field1}) = A>; + const factory B.named() = A; +} +class C { + const factory C({field1}) = A>; +} +''', const [ + const ConstantData('const A()', + const { const {} : + 'ConstructedConstant(A(field1=IntConstant(42)))' }), + const ConstantData('const A(field1: 87)', + const { const {} : + 'ConstructedConstant(A(field1=IntConstant(87)))' }), + const ConstantData('const B()', + const { const {} : + 'ConstructedConstant(A>(field1=IntConstant(42)))' }), + const ConstantData('const B()', + const { const {} : + 'ConstructedConstant(A>(field1=IntConstant(42)))' }), + const ConstantData('const B(field1: 87)', + const { const {} : + 'ConstructedConstant(A>(field1=IntConstant(87)))' }), + const ConstantData('const C(field1: 87)', + const { const {} : + 'ConstructedConstant(A>(field1=IntConstant(87)))' }), + const ConstantData('const B.named()', + const { const {} : + 'ConstructedConstant(A(field1=IntConstant(42)))' }), + ]), + const TestData(''' +const c = const int.fromEnvironment("foo", defaultValue: 5); +const d = const int.fromEnvironment("bar", defaultValue: 10); + +class A { + final field; + const A(a, b) : field = a + b; +} + +class B extends A { + const B(a) : super(a, a * 2); +} +''', const [ + const ConstantData('const A(c, d)', const { + const {} : + 'ConstructedConstant(A(field=IntConstant(15)))', + const {'foo': '7', 'bar': '11'} : + 'ConstructedConstant(A(field=IntConstant(18)))', }), + const ConstantData('const B(d)', const { + const {} : + 'ConstructedConstant(B(field=IntConstant(30)))', + const {'bar': '42'} : + 'ConstructedConstant(B(field=IntConstant(126)))', }), + ]), +]; + +main() { + asyncTest(() => Future.forEach(DATA, testData)); +} + +Future testData(TestData data) { + StringBuffer sb = new StringBuffer(); + sb.write('${data.declarations}\n'); + Map constants = {}; + data.constants.forEach((ConstantData constantData) { + String name = 'c${constants.length}'; + sb.write('const $name = ${constantData.code};\n'); + constants[name] = constantData; + }); + sb.write('main() {}\n'); + String source = sb.toString(); + Compiler compiler = compilerFor( + {'main.dart': source}, options: ['--analyze-all']); + return compiler.runCompiler(Uri.parse('memory:main.dart')).then((_) { + var library = compiler.mainApp; + constants.forEach((String name, ConstantData data) { + FieldElement field = library.localLookup(name); + ConstantExpression constant = field.constant; + data.expectedValues.forEach( + (Map env, String expectedText) { + Environment environment = new MemoryEnvironment(compiler, env); + ConstantValue value = + constant.evaluate(environment, DART_CONSTANT_SYSTEM); + String valueText = value.toStructuredString(); + Expect.equals(expectedText, valueText, + "Unexpected value '${valueText}' for contant " + "`${constant.getText()}`, expected '${expectedText}'."); + }); + }); + }); +} diff --git a/tests/compiler/dart2js/exit_code_helper.dart b/tests/compiler/dart2js/exit_code_helper.dart index d3c61213804..52794b155c6 100644 --- a/tests/compiler/dart2js/exit_code_helper.dart +++ b/tests/compiler/dart2js/exit_code_helper.dart @@ -1,3 +1,3 @@ -void main() { - +void main() { + } \ No newline at end of file diff --git a/tests/compiler/dart2js/frontend_checker.dart b/tests/compiler/dart2js/frontend_checker.dart index b4bd3a0ad1f..91fb719d6c0 100644 --- a/tests/compiler/dart2js/frontend_checker.dart +++ b/tests/compiler/dart2js/frontend_checker.dart @@ -1,110 +1,110 @@ -// Copyright (c) 2014, 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. - -// Checks that dart2js produces the expected static type warnings and -// compile-time errors for the provided multitests. - -import 'dart:async'; -import 'dart:io'; - -import 'package:async_helper/async_helper.dart'; -import 'package:compiler/src/util/uri_extras.dart' - show relativize; -import 'memory_compiler.dart'; - -import '../../../tools/testing/dart/multitest.dart' - show ExtractTestsFromMultitest; -import '../../../tools/testing/dart/path.dart' - show Path; - - -/// Check the analysis of the multitests in [testFiles] to result in the -/// expected static warnings and compile-time errors. -/// -/// [testFiles] is a map of the test files to be checked together with their -/// associated white listing. -/// -/// For instance if [testFiles] contain the mapping -/// 'language/async_await_syntax_test.dart': const ['a03b', 'a04b'] -/// the multitests in 'language/async_await_syntax_test.dart' are checked but -/// the subtests 'a03b' and 'a04c' are expected to fail. -void check(Map> testFiles, - {List arguments: const [], - List options: const []}) { - bool outcomeMismatch = false; - bool verbose = arguments.contains('-v'); - var cachedCompiler; - asyncTest(() => Future.forEach(testFiles.keys, (String testFile) { - Map testSources = {}; - Map> testOutcomes = {}; - String fileName = 'tests/$testFile'; - ExtractTestsFromMultitest(new Path(fileName), testSources, testOutcomes); - return Future.forEach(testSources.keys, (String testName) { - String testFileName = '$fileName/$testName'; - Set expectedOutcome = testOutcomes[testName]; - bool expectFailure = testFiles[testFile].contains(testName); - DiagnosticCollector collector = new DiagnosticCollector(); - var compiler = compilerFor( - {testFileName: testSources[testName]}, - diagnosticHandler: collector, - options: ['--analyze-only']..addAll(options), - showDiagnostics: verbose, - cachedCompiler: cachedCompiler); - return compiler.run(Uri.parse('memory:$testFileName')).then((_) { - bool unexpectedResult = false; - if (expectedOutcome.contains('compile-time error')) { - if (collector.errors.isEmpty) { - print('$testFileName: Missing compile-time error.'); - unexpectedResult = true; - } - } else if (expectedOutcome.contains('static type warning')) { - if (collector.warnings.isEmpty) { - print('$testFileName: Missing static type warning.'); - unexpectedResult = true; - } - } else { - // Expect ok. - if (!collector.errors.isEmpty || - !collector.warnings.isEmpty) { - collector.errors.forEach((message) { - print('$testFileName: Unexpected error: ${message.message}'); - }); - collector.warnings.forEach((message) { - print('$testFileName: Unexpected warning: ${message.message}'); - }); - unexpectedResult = true; - } - } - if (expectFailure) { - if (unexpectedResult) { - unexpectedResult = false; - } else { - print('$testFileName: The test is white-listed ' - 'and therefore expected to fail.'); - unexpectedResult = true; - } - } - if (unexpectedResult) { - outcomeMismatch = true; - } - cachedCompiler = compiler; - }); - }); - }).then((_) { - if (outcomeMismatch) { - String testFileName = - relativize(Uri.base, Platform.script, Platform.isWindows); - print(''' - -=== -=== ERROR: Unexpected result of analysis. -=== -=== Please update the white-listing in $testFileName -=== - -'''); - exit(1); - } - })); -} +// Copyright (c) 2014, 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. + +// Checks that dart2js produces the expected static type warnings and +// compile-time errors for the provided multitests. + +import 'dart:async'; +import 'dart:io'; + +import 'package:async_helper/async_helper.dart'; +import 'package:compiler/src/util/uri_extras.dart' + show relativize; +import 'memory_compiler.dart'; + +import '../../../tools/testing/dart/multitest.dart' + show ExtractTestsFromMultitest; +import '../../../tools/testing/dart/path.dart' + show Path; + + +/// Check the analysis of the multitests in [testFiles] to result in the +/// expected static warnings and compile-time errors. +/// +/// [testFiles] is a map of the test files to be checked together with their +/// associated white listing. +/// +/// For instance if [testFiles] contain the mapping +/// 'language/async_await_syntax_test.dart': const ['a03b', 'a04b'] +/// the multitests in 'language/async_await_syntax_test.dart' are checked but +/// the subtests 'a03b' and 'a04c' are expected to fail. +void check(Map> testFiles, + {List arguments: const [], + List options: const []}) { + bool outcomeMismatch = false; + bool verbose = arguments.contains('-v'); + var cachedCompiler; + asyncTest(() => Future.forEach(testFiles.keys, (String testFile) { + Map testSources = {}; + Map> testOutcomes = {}; + String fileName = 'tests/$testFile'; + ExtractTestsFromMultitest(new Path(fileName), testSources, testOutcomes); + return Future.forEach(testSources.keys, (String testName) { + String testFileName = '$fileName/$testName'; + Set expectedOutcome = testOutcomes[testName]; + bool expectFailure = testFiles[testFile].contains(testName); + DiagnosticCollector collector = new DiagnosticCollector(); + var compiler = compilerFor( + {testFileName: testSources[testName]}, + diagnosticHandler: collector, + options: ['--analyze-only']..addAll(options), + showDiagnostics: verbose, + cachedCompiler: cachedCompiler); + return compiler.run(Uri.parse('memory:$testFileName')).then((_) { + bool unexpectedResult = false; + if (expectedOutcome.contains('compile-time error')) { + if (collector.errors.isEmpty) { + print('$testFileName: Missing compile-time error.'); + unexpectedResult = true; + } + } else if (expectedOutcome.contains('static type warning')) { + if (collector.warnings.isEmpty) { + print('$testFileName: Missing static type warning.'); + unexpectedResult = true; + } + } else { + // Expect ok. + if (!collector.errors.isEmpty || + !collector.warnings.isEmpty) { + collector.errors.forEach((message) { + print('$testFileName: Unexpected error: ${message.message}'); + }); + collector.warnings.forEach((message) { + print('$testFileName: Unexpected warning: ${message.message}'); + }); + unexpectedResult = true; + } + } + if (expectFailure) { + if (unexpectedResult) { + unexpectedResult = false; + } else { + print('$testFileName: The test is white-listed ' + 'and therefore expected to fail.'); + unexpectedResult = true; + } + } + if (unexpectedResult) { + outcomeMismatch = true; + } + cachedCompiler = compiler; + }); + }); + }).then((_) { + if (outcomeMismatch) { + String testFileName = + relativize(Uri.base, Platform.script, Platform.isWindows); + print(''' + +=== +=== ERROR: Unexpected result of analysis. +=== +=== Please update the white-listing in $testFileName +=== + +'''); + exit(1); + } + })); +} diff --git a/tests/compiler/dart2js/import_mirrors_test.dart b/tests/compiler/dart2js/import_mirrors_test.dart index f5f799be74a..1b16f762a1b 100644 --- a/tests/compiler/dart2js/import_mirrors_test.dart +++ b/tests/compiler/dart2js/import_mirrors_test.dart @@ -1,413 +1,413 @@ -// Copyright (c) 2014, 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. - -// Test that the compiler emits a warning on import of 'dart:mirrors' unless -// the flag --enable-experimental-mirrors is used. - -library dart2js.test.import; - -import 'dart:async'; -import 'package:expect/expect.dart'; -import 'package:async_helper/async_helper.dart'; -import 'package:compiler/src/dart2jslib.dart' show MessageKind; -import 'memory_compiler.dart'; - -const DIRECT_IMPORT = const { - '/main.dart': ''' -import 'dart:mirrors'; - -main() {} -''', - - 'paths': - "main.dart => dart:mirrors", -}; - -const INDIRECT_IMPORT1 = const { - '/main.dart': ''' -import 'first.dart'; - -main() {} -''', - '/first.dart': ''' -import 'dart:mirrors'; -''', - - 'paths': - "first.dart => dart:mirrors", - 'verbosePaths': - "main.dart => first.dart => dart:mirrors", -}; - -const INDIRECT_IMPORT2 = const { - '/main.dart': ''' -import 'first.dart'; - -main() {} -''', - '/first.dart': ''' -import 'second.dart'; -''', - '/second.dart': ''' -import 'dart:mirrors'; -''', - - 'paths': - "second.dart => dart:mirrors", - 'verbosePaths': - "main.dart => first.dart => second.dart => dart:mirrors", -}; - -const INDIRECT_PACKAGE_IMPORT1 = const { - '/main.dart': ''' -import 'first.dart'; - -main() {} -''', - '/first.dart': ''' -import 'package:second/second.dart'; -''', - '/pkg/second/second.dart': ''' -import 'dart:mirrors'; -''', - - 'paths': - "first.dart => package:second => dart:mirrors", - 'verbosePaths': - "main.dart => first.dart => package:second/second.dart => dart:mirrors", -}; - -const INDIRECT_PACKAGE_IMPORT2 = const { - '/main.dart': ''' -import 'first.dart'; - -main() {} -''', - '/first.dart': ''' -import 'package:packagename/second.dart'; -''', - '/pkg/packagename/second.dart': ''' -import 'dart:mirrors'; -''', - - 'paths': - "first.dart => package:packagename => dart:mirrors", - 'verbosePaths': - "main.dart => first.dart => package:packagename/second.dart " - "=> dart:mirrors", -}; - -const INDIRECT_PACKAGE_IMPORT3 = const { - '/main.dart': ''' -import 'first.dart'; - -main() {} -''', - '/first.dart': ''' -import 'package:package1/second.dart'; -''', - '/pkg/package1/second.dart': ''' -import 'package:package2/third.dart'; -''', - '/pkg/package2/third.dart': ''' -import 'dart:mirrors'; -''', - - 'paths': - "first.dart => package:package1 => package:package2 => dart:mirrors", - 'verbosePaths': - "main.dart => first.dart => package:package1/second.dart " - "=> package:package2/third.dart => dart:mirrors", -}; - -const INDIRECT_PACKAGE_IMPORT4 = const { - '/main.dart': ''' -import 'first.dart'; - -main() {} -''', - '/first.dart': ''' -import 'package:package1/second.dart'; -''', - '/pkg/package1/second.dart': ''' -import 'sub/third.dart'; -''', - '/pkg/package1/sub/third.dart': ''' -import 'package:package2/fourth.dart'; -''', - '/pkg/package2/fourth.dart': ''' -import 'lib/src/fifth.dart'; -''', - '/pkg/package2/lib/src/fifth.dart': ''' -import 'dart:mirrors'; -''', - - 'paths': - "first.dart => package:package1 => package:package2 => dart:mirrors", - 'verbosePaths': - "main.dart => first.dart => package:package1/second.dart " - "=> package:package1/sub/third.dart => package:package2/fourth.dart " - "=> package:package2/lib/src/fifth.dart => dart:mirrors", -}; - -const DUAL_DIRECT_IMPORT = const { - '/main.dart': ''' -import 'dart:mirrors'; -import 'dart:mirrors'; - -main() {} -''', - - 'paths': - "main.dart => dart:mirrors", -}; - -const DUAL_INDIRECT_IMPORT1 = const { - '/main.dart': ''' -import 'dart:mirrors'; -import 'first.dart'; - -main() {} -''', - '/first.dart': ''' -import 'dart:mirrors'; -''', - - 'paths': const - ["main.dart => dart:mirrors", - "first.dart => dart:mirrors"], - 'verbosePaths': const - ["main.dart => dart:mirrors", - "main.dart => first.dart => dart:mirrors"], -}; - -const DUAL_INDIRECT_IMPORT2 = const { - '/main.dart': ''' -import 'first.dart'; -import 'second.dart'; - -main() {} -''', - '/first.dart': ''' -import 'dart:mirrors'; -''', - '/second.dart': ''' -import 'dart:mirrors'; -''', - - 'paths': const - ["first.dart => dart:mirrors", - "second.dart => dart:mirrors"], - 'verbosePaths': const - ["main.dart => first.dart => dart:mirrors", - "main.dart => second.dart => dart:mirrors"], -}; - -const DUAL_INDIRECT_IMPORT3 = const { - '/main.dart': ''' -import 'first.dart'; -import 'second.dart'; - -main() {} -''', - '/first.dart': ''' -import 'third.dart'; -''', - '/second.dart': ''' -import 'third.dart'; -''', - '/third.dart': ''' -import 'dart:mirrors'; -''', - - 'paths': - "third.dart => dart:mirrors", - 'verbosePaths': const - ["main.dart => first.dart => third.dart => dart:mirrors", - "main.dart => second.dart => third.dart => dart:mirrors"], -}; - -const DUAL_INDIRECT_PACKAGE_IMPORT1 = const { - '/main.dart': ''' -import 'package:package1/second.dart'; -import 'first.dart'; - -main() {} -''', - '/first.dart': ''' -import 'package:package2/third.dart'; -''', - '/pkg/package1/second.dart': ''' -import 'dart:mirrors'; -''', - '/pkg/package2/third.dart': ''' -import 'dart:mirrors'; -''', - - 'paths': const - ["main.dart => package:package1 => dart:mirrors", - "first.dart => package:package2 => dart:mirrors"], - 'verbosePaths': const - ["main.dart => package:package1/second.dart => dart:mirrors", - "main.dart => first.dart => package:package2/third.dart => dart:mirrors"] -}; - -const DIRECT_EXPORT = const { - '/main.dart': ''' -export 'dart:mirrors'; - -main() {} -''', - - 'paths': - "main.dart => dart:mirrors", -}; - -const INDIRECT_EXPORT1 = const { - '/main.dart': ''' -import 'first.dart'; - -main() {} -''', - '/first.dart': ''' -export 'dart:mirrors'; -''', - - 'paths': - "first.dart => dart:mirrors", - 'verbosePaths': - "main.dart => first.dart => dart:mirrors", -}; - -const INDIRECT_EXPORT2 = const { - '/main.dart': ''' -import 'first.dart'; - -main() {} -''', - '/first.dart': ''' -import 'second.dart'; -''', - '/second.dart': ''' -export 'dart:mirrors'; -''', - - 'paths': - "second.dart => dart:mirrors", - 'verbosePaths': - "main.dart => first.dart => second.dart => dart:mirrors", -}; - -const INDIRECT_PACKAGE_EXPORT1 = const { - '/main.dart': ''' -import 'first.dart'; - -main() {} -''', - '/first.dart': ''' -import 'package:packagename/second.dart'; -''', - '/pkg/packagename/second.dart': ''' -export 'dart:mirrors'; -''', - - 'paths': - "first.dart => package:packagename => dart:mirrors", - 'verbosePaths': - "main.dart => first.dart => package:packagename/second.dart " - "=> dart:mirrors", -}; - -const INDIRECT_PACKAGE_EXPORT2 = const { - '/main.dart': ''' -import 'first.dart'; - -main() {} -''', - '/first.dart': ''' -export 'package:packagename/second.dart'; -''', - '/pkg/packagename/second.dart': ''' -import 'dart:mirrors'; -''', - - 'paths': - "first.dart => package:packagename => dart:mirrors", - 'verbosePaths': - "main.dart => first.dart => package:packagename/second.dart " - "=> dart:mirrors", -}; - -Future test(Map sourceFiles, - {expectedPaths, - bool verbose: false, - bool enableExperimentalMirrors: false}) { - if (expectedPaths is! List) { - expectedPaths = [expectedPaths]; - } - var collector = new DiagnosticCollector(); - var options = []; - if (verbose) { - options.add('--verbose'); - } - if (enableExperimentalMirrors) { - options.add('--enable-experimental-mirrors'); - } - var compiler = compilerFor(sourceFiles, diagnosticHandler: collector, - packageRoot: Uri.parse('memory:/pkg/'), - options: options); - return compiler.run(Uri.parse('memory:/main.dart')).then((_) { - Expect.equals(0, collector.errors.length, 'Errors: ${collector.errors}'); - if (enableExperimentalMirrors) { - Expect.equals(0, collector.warnings.length, - 'Warnings: ${collector.errors}'); - } else { - Expect.equals(1, collector.warnings.length, - 'Warnings: ${collector.errors}'); - Expect.equals( - MessageKind.IMPORT_EXPERIMENTAL_MIRRORS.message( - {'importChain': expectedPaths.join( - MessageKind.IMPORT_EXPERIMENTAL_MIRRORS_PADDING)}).toString(), - collector.warnings.first.message); - } - }); -} - -Future checkPaths(Map sourceData) { - Map sourceFiles = sourceData; - var expectedPaths = sourceData['paths']; - var expectedVerbosePaths = sourceData['verbosePaths']; - if (expectedVerbosePaths == null) { - expectedVerbosePaths = expectedPaths; - } - return test(sourceFiles, expectedPaths: expectedPaths).then((_) { - return test( - sourceFiles, expectedPaths: expectedVerbosePaths, verbose: true); - }).then((_) { - return test(sourceFiles, enableExperimentalMirrors: true); - }); -} - -void main() { - asyncTest(() => Future.forEach([ - DIRECT_IMPORT, - INDIRECT_IMPORT1, - INDIRECT_IMPORT2, - INDIRECT_PACKAGE_IMPORT1, - INDIRECT_PACKAGE_IMPORT2, - INDIRECT_PACKAGE_IMPORT3, - INDIRECT_PACKAGE_IMPORT4, - DUAL_DIRECT_IMPORT, - DUAL_INDIRECT_IMPORT1, - DUAL_INDIRECT_IMPORT2, - DUAL_INDIRECT_IMPORT3, - DUAL_INDIRECT_PACKAGE_IMPORT1, - DIRECT_EXPORT, - INDIRECT_EXPORT1, - INDIRECT_EXPORT2, - INDIRECT_PACKAGE_EXPORT1, - INDIRECT_PACKAGE_EXPORT2], - (map) => checkPaths(map) - )); -} +// Copyright (c) 2014, 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. + +// Test that the compiler emits a warning on import of 'dart:mirrors' unless +// the flag --enable-experimental-mirrors is used. + +library dart2js.test.import; + +import 'dart:async'; +import 'package:expect/expect.dart'; +import 'package:async_helper/async_helper.dart'; +import 'package:compiler/src/dart2jslib.dart' show MessageKind; +import 'memory_compiler.dart'; + +const DIRECT_IMPORT = const { + '/main.dart': ''' +import 'dart:mirrors'; + +main() {} +''', + + 'paths': + "main.dart => dart:mirrors", +}; + +const INDIRECT_IMPORT1 = const { + '/main.dart': ''' +import 'first.dart'; + +main() {} +''', + '/first.dart': ''' +import 'dart:mirrors'; +''', + + 'paths': + "first.dart => dart:mirrors", + 'verbosePaths': + "main.dart => first.dart => dart:mirrors", +}; + +const INDIRECT_IMPORT2 = const { + '/main.dart': ''' +import 'first.dart'; + +main() {} +''', + '/first.dart': ''' +import 'second.dart'; +''', + '/second.dart': ''' +import 'dart:mirrors'; +''', + + 'paths': + "second.dart => dart:mirrors", + 'verbosePaths': + "main.dart => first.dart => second.dart => dart:mirrors", +}; + +const INDIRECT_PACKAGE_IMPORT1 = const { + '/main.dart': ''' +import 'first.dart'; + +main() {} +''', + '/first.dart': ''' +import 'package:second/second.dart'; +''', + '/pkg/second/second.dart': ''' +import 'dart:mirrors'; +''', + + 'paths': + "first.dart => package:second => dart:mirrors", + 'verbosePaths': + "main.dart => first.dart => package:second/second.dart => dart:mirrors", +}; + +const INDIRECT_PACKAGE_IMPORT2 = const { + '/main.dart': ''' +import 'first.dart'; + +main() {} +''', + '/first.dart': ''' +import 'package:packagename/second.dart'; +''', + '/pkg/packagename/second.dart': ''' +import 'dart:mirrors'; +''', + + 'paths': + "first.dart => package:packagename => dart:mirrors", + 'verbosePaths': + "main.dart => first.dart => package:packagename/second.dart " + "=> dart:mirrors", +}; + +const INDIRECT_PACKAGE_IMPORT3 = const { + '/main.dart': ''' +import 'first.dart'; + +main() {} +''', + '/first.dart': ''' +import 'package:package1/second.dart'; +''', + '/pkg/package1/second.dart': ''' +import 'package:package2/third.dart'; +''', + '/pkg/package2/third.dart': ''' +import 'dart:mirrors'; +''', + + 'paths': + "first.dart => package:package1 => package:package2 => dart:mirrors", + 'verbosePaths': + "main.dart => first.dart => package:package1/second.dart " + "=> package:package2/third.dart => dart:mirrors", +}; + +const INDIRECT_PACKAGE_IMPORT4 = const { + '/main.dart': ''' +import 'first.dart'; + +main() {} +''', + '/first.dart': ''' +import 'package:package1/second.dart'; +''', + '/pkg/package1/second.dart': ''' +import 'sub/third.dart'; +''', + '/pkg/package1/sub/third.dart': ''' +import 'package:package2/fourth.dart'; +''', + '/pkg/package2/fourth.dart': ''' +import 'lib/src/fifth.dart'; +''', + '/pkg/package2/lib/src/fifth.dart': ''' +import 'dart:mirrors'; +''', + + 'paths': + "first.dart => package:package1 => package:package2 => dart:mirrors", + 'verbosePaths': + "main.dart => first.dart => package:package1/second.dart " + "=> package:package1/sub/third.dart => package:package2/fourth.dart " + "=> package:package2/lib/src/fifth.dart => dart:mirrors", +}; + +const DUAL_DIRECT_IMPORT = const { + '/main.dart': ''' +import 'dart:mirrors'; +import 'dart:mirrors'; + +main() {} +''', + + 'paths': + "main.dart => dart:mirrors", +}; + +const DUAL_INDIRECT_IMPORT1 = const { + '/main.dart': ''' +import 'dart:mirrors'; +import 'first.dart'; + +main() {} +''', + '/first.dart': ''' +import 'dart:mirrors'; +''', + + 'paths': const + ["main.dart => dart:mirrors", + "first.dart => dart:mirrors"], + 'verbosePaths': const + ["main.dart => dart:mirrors", + "main.dart => first.dart => dart:mirrors"], +}; + +const DUAL_INDIRECT_IMPORT2 = const { + '/main.dart': ''' +import 'first.dart'; +import 'second.dart'; + +main() {} +''', + '/first.dart': ''' +import 'dart:mirrors'; +''', + '/second.dart': ''' +import 'dart:mirrors'; +''', + + 'paths': const + ["first.dart => dart:mirrors", + "second.dart => dart:mirrors"], + 'verbosePaths': const + ["main.dart => first.dart => dart:mirrors", + "main.dart => second.dart => dart:mirrors"], +}; + +const DUAL_INDIRECT_IMPORT3 = const { + '/main.dart': ''' +import 'first.dart'; +import 'second.dart'; + +main() {} +''', + '/first.dart': ''' +import 'third.dart'; +''', + '/second.dart': ''' +import 'third.dart'; +''', + '/third.dart': ''' +import 'dart:mirrors'; +''', + + 'paths': + "third.dart => dart:mirrors", + 'verbosePaths': const + ["main.dart => first.dart => third.dart => dart:mirrors", + "main.dart => second.dart => third.dart => dart:mirrors"], +}; + +const DUAL_INDIRECT_PACKAGE_IMPORT1 = const { + '/main.dart': ''' +import 'package:package1/second.dart'; +import 'first.dart'; + +main() {} +''', + '/first.dart': ''' +import 'package:package2/third.dart'; +''', + '/pkg/package1/second.dart': ''' +import 'dart:mirrors'; +''', + '/pkg/package2/third.dart': ''' +import 'dart:mirrors'; +''', + + 'paths': const + ["main.dart => package:package1 => dart:mirrors", + "first.dart => package:package2 => dart:mirrors"], + 'verbosePaths': const + ["main.dart => package:package1/second.dart => dart:mirrors", + "main.dart => first.dart => package:package2/third.dart => dart:mirrors"] +}; + +const DIRECT_EXPORT = const { + '/main.dart': ''' +export 'dart:mirrors'; + +main() {} +''', + + 'paths': + "main.dart => dart:mirrors", +}; + +const INDIRECT_EXPORT1 = const { + '/main.dart': ''' +import 'first.dart'; + +main() {} +''', + '/first.dart': ''' +export 'dart:mirrors'; +''', + + 'paths': + "first.dart => dart:mirrors", + 'verbosePaths': + "main.dart => first.dart => dart:mirrors", +}; + +const INDIRECT_EXPORT2 = const { + '/main.dart': ''' +import 'first.dart'; + +main() {} +''', + '/first.dart': ''' +import 'second.dart'; +''', + '/second.dart': ''' +export 'dart:mirrors'; +''', + + 'paths': + "second.dart => dart:mirrors", + 'verbosePaths': + "main.dart => first.dart => second.dart => dart:mirrors", +}; + +const INDIRECT_PACKAGE_EXPORT1 = const { + '/main.dart': ''' +import 'first.dart'; + +main() {} +''', + '/first.dart': ''' +import 'package:packagename/second.dart'; +''', + '/pkg/packagename/second.dart': ''' +export 'dart:mirrors'; +''', + + 'paths': + "first.dart => package:packagename => dart:mirrors", + 'verbosePaths': + "main.dart => first.dart => package:packagename/second.dart " + "=> dart:mirrors", +}; + +const INDIRECT_PACKAGE_EXPORT2 = const { + '/main.dart': ''' +import 'first.dart'; + +main() {} +''', + '/first.dart': ''' +export 'package:packagename/second.dart'; +''', + '/pkg/packagename/second.dart': ''' +import 'dart:mirrors'; +''', + + 'paths': + "first.dart => package:packagename => dart:mirrors", + 'verbosePaths': + "main.dart => first.dart => package:packagename/second.dart " + "=> dart:mirrors", +}; + +Future test(Map sourceFiles, + {expectedPaths, + bool verbose: false, + bool enableExperimentalMirrors: false}) { + if (expectedPaths is! List) { + expectedPaths = [expectedPaths]; + } + var collector = new DiagnosticCollector(); + var options = []; + if (verbose) { + options.add('--verbose'); + } + if (enableExperimentalMirrors) { + options.add('--enable-experimental-mirrors'); + } + var compiler = compilerFor(sourceFiles, diagnosticHandler: collector, + packageRoot: Uri.parse('memory:/pkg/'), + options: options); + return compiler.run(Uri.parse('memory:/main.dart')).then((_) { + Expect.equals(0, collector.errors.length, 'Errors: ${collector.errors}'); + if (enableExperimentalMirrors) { + Expect.equals(0, collector.warnings.length, + 'Warnings: ${collector.errors}'); + } else { + Expect.equals(1, collector.warnings.length, + 'Warnings: ${collector.errors}'); + Expect.equals( + MessageKind.IMPORT_EXPERIMENTAL_MIRRORS.message( + {'importChain': expectedPaths.join( + MessageKind.IMPORT_EXPERIMENTAL_MIRRORS_PADDING)}).toString(), + collector.warnings.first.message); + } + }); +} + +Future checkPaths(Map sourceData) { + Map sourceFiles = sourceData; + var expectedPaths = sourceData['paths']; + var expectedVerbosePaths = sourceData['verbosePaths']; + if (expectedVerbosePaths == null) { + expectedVerbosePaths = expectedPaths; + } + return test(sourceFiles, expectedPaths: expectedPaths).then((_) { + return test( + sourceFiles, expectedPaths: expectedVerbosePaths, verbose: true); + }).then((_) { + return test(sourceFiles, enableExperimentalMirrors: true); + }); +} + +void main() { + asyncTest(() => Future.forEach([ + DIRECT_IMPORT, + INDIRECT_IMPORT1, + INDIRECT_IMPORT2, + INDIRECT_PACKAGE_IMPORT1, + INDIRECT_PACKAGE_IMPORT2, + INDIRECT_PACKAGE_IMPORT3, + INDIRECT_PACKAGE_IMPORT4, + DUAL_DIRECT_IMPORT, + DUAL_INDIRECT_IMPORT1, + DUAL_INDIRECT_IMPORT2, + DUAL_INDIRECT_IMPORT3, + DUAL_INDIRECT_PACKAGE_IMPORT1, + DIRECT_EXPORT, + INDIRECT_EXPORT1, + INDIRECT_EXPORT2, + INDIRECT_PACKAGE_EXPORT1, + INDIRECT_PACKAGE_EXPORT2], + (map) => checkPaths(map) + )); +} diff --git a/tests/compiler/dart2js/instantiated_classes_test.dart b/tests/compiler/dart2js/instantiated_classes_test.dart index d125ff99f27..ea90156607c 100644 --- a/tests/compiler/dart2js/instantiated_classes_test.dart +++ b/tests/compiler/dart2js/instantiated_classes_test.dart @@ -1,85 +1,85 @@ -// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file -// for details. All rights reserved. Use of this source code is governed by a -// BSD-style license that can be found in the LICENSE file. - -library instantiated_classes_test; - -import 'dart:async'; -import 'package:expect/expect.dart'; -import 'package:async_helper/async_helper.dart'; -import 'package:compiler/src/elements/elements.dart' - show ClassElement; -import 'type_test_helper.dart'; - -void main() { - asyncTest(() => Future.forEach([ - () => test("class Class {}", ["Class"]), - () => test("""abstract class A {} - class Class extends A {}""", - ["Class"]), - () => test("""class A {} - class Class extends A {}""", - ["Class"]), - () => test("""class A {} - class B {} - class Class extends A {}""", - ["Class"]), - () => test("""class A {} - class Class implements A {}""", - ["Class"]), - () => test("""class A {} - class Class extends Object with A {}""", - ["Class"]), - () => test("""class A {} - class B {} - class Class extends Object with B implements A {}""", - ["Class"]), - - () => test("""class A {} - class Class {}""", - ["Class", "A"], ["Class", "A"]), - () => test("""class A {} - class Class extends A {}""", - ["Class", "A"], ["Class", "A"]), - () => test("""class A {} - class Class implements A {}""", - ["Class", "A"], ["Class", "A"]), - () => test("""class A {} - class B extends A {} - class Class extends B {}""", - ["Class", "A"], ["Class", "A"]), - () => test("""class A {} - class B {} - class Class extends B with A {}""", - ["Class", "A"], ["Class", "A"]), - - // TODO(johnniwinther): Avoid registration of `Class` as instantiated. - () => test("""class A {} - class Class implements A { - factory Class() = A; - }""", - ["Class", "A"], ["Class"]), - ], (f) => f())); -} - -Future test(String source, List directlyInstantiatedClasses, - [List newClasses = const ["Class"]]) { - StringBuffer mainSource = new StringBuffer(); - mainSource.write('main() {\n'); - for (String newClass in newClasses) { - mainSource.write(' new $newClass();\n'); - } - mainSource.write('}'); - return TypeEnvironment.create(source, - mainSource: mainSource.toString(), - useMockCompiler: true).then((env) { - Iterable expectedClasses = - directlyInstantiatedClasses.map(env.getElement); - Iterable actualClasses = - env.compiler.resolverWorld.directlyInstantiatedClasses.where( - (c) => c.library == env.compiler.mainApp); - Expect.setEquals(expectedClasses, actualClasses); - }); -} - - +// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +library instantiated_classes_test; + +import 'dart:async'; +import 'package:expect/expect.dart'; +import 'package:async_helper/async_helper.dart'; +import 'package:compiler/src/elements/elements.dart' + show ClassElement; +import 'type_test_helper.dart'; + +void main() { + asyncTest(() => Future.forEach([ + () => test("class Class {}", ["Class"]), + () => test("""abstract class A {} + class Class extends A {}""", + ["Class"]), + () => test("""class A {} + class Class extends A {}""", + ["Class"]), + () => test("""class A {} + class B {} + class Class extends A {}""", + ["Class"]), + () => test("""class A {} + class Class implements A {}""", + ["Class"]), + () => test("""class A {} + class Class extends Object with A {}""", + ["Class"]), + () => test("""class A {} + class B {} + class Class extends Object with B implements A {}""", + ["Class"]), + + () => test("""class A {} + class Class {}""", + ["Class", "A"], ["Class", "A"]), + () => test("""class A {} + class Class extends A {}""", + ["Class", "A"], ["Class", "A"]), + () => test("""class A {} + class Class implements A {}""", + ["Class", "A"], ["Class", "A"]), + () => test("""class A {} + class B extends A {} + class Class extends B {}""", + ["Class", "A"], ["Class", "A"]), + () => test("""class A {} + class B {} + class Class extends B with A {}""", + ["Class", "A"], ["Class", "A"]), + + // TODO(johnniwinther): Avoid registration of `Class` as instantiated. + () => test("""class A {} + class Class implements A { + factory Class() = A; + }""", + ["Class", "A"], ["Class"]), + ], (f) => f())); +} + +Future test(String source, List directlyInstantiatedClasses, + [List newClasses = const ["Class"]]) { + StringBuffer mainSource = new StringBuffer(); + mainSource.write('main() {\n'); + for (String newClass in newClasses) { + mainSource.write(' new $newClass();\n'); + } + mainSource.write('}'); + return TypeEnvironment.create(source, + mainSource: mainSource.toString(), + useMockCompiler: true).then((env) { + Iterable expectedClasses = + directlyInstantiatedClasses.map(env.getElement); + Iterable actualClasses = + env.compiler.resolverWorld.directlyInstantiatedClasses.where( + (c) => c.library == env.compiler.mainApp); + Expect.setEquals(expectedClasses, actualClasses); + }); +} + + diff --git a/tests/compiler/dart2js/least_upper_bound_language_test.dart b/tests/compiler/dart2js/least_upper_bound_language_test.dart index f75c32c63f4..ad01ad0c0c8 100644 --- a/tests/compiler/dart2js/least_upper_bound_language_test.dart +++ b/tests/compiler/dart2js/least_upper_bound_language_test.dart @@ -1,22 +1,22 @@ -// Copyright (c) 2013, 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. - -// Test that dart2js produces the expected static type warnings for least upper -// bound language tests. This ensures that the analyzer and dart2js agrees -// on these tests. - -import 'warnings_checker.dart'; - -/// Map from test files to a map of their expected status. If the status map is -/// `null` no warnings must be missing or unexpected, otherwise the status map -/// can contain a list of line numbers for keys 'missing' and 'unexpected' for -/// the warnings of each category. -const Map TESTS = const { - 'language/least_upper_bound_test.dart': null, - 'language/least_upper_bound_expansive_test.dart': null, -}; - -void main() { - checkWarnings(TESTS); -} +// Copyright (c) 2013, 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. + +// Test that dart2js produces the expected static type warnings for least upper +// bound language tests. This ensures that the analyzer and dart2js agrees +// on these tests. + +import 'warnings_checker.dart'; + +/// Map from test files to a map of their expected status. If the status map is +/// `null` no warnings must be missing or unexpected, otherwise the status map +/// can contain a list of line numbers for keys 'missing' and 'unexpected' for +/// the warnings of each category. +const Map TESTS = const { + 'language/least_upper_bound_test.dart': null, + 'language/least_upper_bound_expansive_test.dart': null, +}; + +void main() { + checkWarnings(TESTS); +} diff --git a/tests/compiler/dart2js/least_upper_bound_test.dart b/tests/compiler/dart2js/least_upper_bound_test.dart index 804b8036d64..23aa02bd92b 100644 --- a/tests/compiler/dart2js/least_upper_bound_test.dart +++ b/tests/compiler/dart2js/least_upper_bound_test.dart @@ -1,852 +1,852 @@ -// Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file -// for details. All rights reserved. Use of this source code is governed by a -// BSD-style license that can be found in the LICENSE file. - -library subtype_test; - -import 'package:expect/expect.dart'; -import 'package:async_helper/async_helper.dart'; -import 'type_test_helper.dart'; -import 'package:compiler/src/dart_types.dart'; -import "package:compiler/src/elements/elements.dart" - show Element, ClassElement; -import 'package:compiler/src/util/util.dart'; - -void main() { - testInterface1(); - testInterface2(); - testGeneric(); - testMixin(); - testFunction(); - testTypeVariable(); -} - -void testInterface1() { - asyncTest(() => TypeEnvironment.create(r""" - class A {} // A and B have equal depth. - class B {} - class I implements A, B {} - class J implements A, B {} - """).then((env) { - - DartType Object_ = env['Object']; - DartType A = env['A']; - DartType B = env['B']; - DartType I = env['I']; - DartType J = env['J']; - - checkLub(DartType a, DartType b, DartType expect) { - DartType lub = env.computeLeastUpperBound(a, b); - Expect.equals(expect, lub, - 'Unexpected lub($a,$b) = $lub, expected $expect.'); - } - - checkLub(Object_, Object_, Object_); - checkLub(Object_, A, Object_); - checkLub(Object_, B, Object_); - checkLub(Object_, I, Object_); - checkLub(Object_, J, Object_); - - checkLub(A, Object_, Object_); - checkLub(A, A, A); - checkLub(A, B, Object_); - checkLub(A, I, A); - checkLub(A, J, A); - - checkLub(B, Object_, Object_); - checkLub(B, A, Object_); - checkLub(B, B, B); - checkLub(B, I, B); - checkLub(B, J, B); - - checkLub(I, Object_, Object_); - checkLub(I, A, A); - checkLub(I, B, B); - checkLub(I, I, I); - checkLub(I, J, Object_); - - checkLub(J, Object_, Object_); - checkLub(J, A, A); - checkLub(J, B, B); - checkLub(J, I, Object_); - checkLub(J, J, J); - })); -} - -void testInterface2() { - asyncTest(() => TypeEnvironment.create(r""" - class A {} - class B {} - class C extends B {} // This makes C have higher depth than A. - class I implements A, C {} - class J implements A, C {} - """).then((env) { - - DartType Object_ = env['Object']; - DartType A = env['A']; - DartType B = env['B']; - DartType C = env['C']; - DartType I = env['I']; - DartType J = env['J']; - - checkLub(DartType a, DartType b, DartType expectedLub) { - DartType lub = env.computeLeastUpperBound(a, b); - Expect.equals(expectedLub, lub, - 'Unexpected lub($a,$b) = $lub, expected $expectedLub'); - } - - checkLub(Object_, Object_, Object_); - checkLub(Object_, A, Object_); - checkLub(Object_, B, Object_); - checkLub(Object_, C, Object_); - checkLub(Object_, I, Object_); - checkLub(Object_, J, Object_); - - checkLub(A, Object_, Object_); - checkLub(A, A, A); - checkLub(A, B, Object_); - checkLub(A, C, Object_); - checkLub(A, I, A); - checkLub(A, J, A); - - checkLub(B, Object_, Object_); - checkLub(B, A, Object_); - checkLub(B, B, B); - checkLub(B, C, B); - checkLub(B, I, B); - checkLub(B, J, B); - - checkLub(C, Object_, Object_); - checkLub(C, A, Object_); - checkLub(C, B, B); - checkLub(C, C, C); - checkLub(C, I, C); - checkLub(C, J, C); - - checkLub(I, Object_, Object_); - checkLub(I, A, A); - checkLub(I, B, B); - checkLub(I, C, C); - checkLub(I, I, I); - checkLub(I, J, C); - - checkLub(J, Object_, Object_); - checkLub(J, A, A); - checkLub(J, B, B); - checkLub(J, C, C); - checkLub(J, I, C); - checkLub(J, J, J); - })); -} - -void testGeneric() { - asyncTest(() => TypeEnvironment.create(r""" - class A {} - class B {} - class C extends B {} - class I {} - """).then((env) { - - DartType Object_ = env['Object']; - DartType A = env['A']; - DartType B = env['B']; - DartType C = env['C']; - ClassElement I = env.getElement('I'); - DartType I_A = instantiate(I, [A]); - DartType I_B = instantiate(I, [B]); - DartType I_C = instantiate(I, [C]); - - checkLub(DartType a, DartType b, DartType expectedLub) { - DartType lub = env.computeLeastUpperBound(a, b); - Expect.equals(expectedLub, lub, - 'Unexpected lub($a,$b) = $lub, expected $expectedLub'); - } - - checkLub(Object_, Object_, Object_); - checkLub(Object_, A, Object_); - checkLub(Object_, B, Object_); - checkLub(Object_, C, Object_); - checkLub(Object_, I_A, Object_); - checkLub(Object_, I_B, Object_); - checkLub(Object_, I_C, Object_); - - checkLub(A, Object_, Object_); - checkLub(A, A, A); - checkLub(A, B, Object_); - checkLub(A, C, Object_); - checkLub(A, I_A, Object_); - checkLub(A, I_B, Object_); - checkLub(A, I_C, Object_); - - checkLub(B, Object_, Object_); - checkLub(B, A, Object_); - checkLub(B, B, B); - checkLub(B, C, B); - checkLub(B, I_A, Object_); - checkLub(B, I_B, Object_); - checkLub(B, I_C, Object_); - - checkLub(C, Object_, Object_); - checkLub(C, A, Object_); - checkLub(C, B, B); - checkLub(C, C, C); - checkLub(C, I_A, Object_); - checkLub(C, I_B, Object_); - checkLub(C, I_C, Object_); - - checkLub(I_A, Object_, Object_); - checkLub(I_A, A, Object_); - checkLub(I_A, B, Object_); - checkLub(I_A, C, Object_); - checkLub(I_A, I_A, I_A); - checkLub(I_A, I_B, Object_); - checkLub(I_A, I_C, Object_); - - checkLub(I_B, Object_, Object_); - checkLub(I_B, A, Object_); - checkLub(I_B, B, Object_); - checkLub(I_B, C, Object_); - checkLub(I_B, I_A, Object_); - checkLub(I_B, I_B, I_B); - checkLub(I_B, I_C, Object_); - - checkLub(I_C, Object_, Object_); - checkLub(I_C, A, Object_); - checkLub(I_C, B, Object_); - checkLub(I_C, C, Object_); - checkLub(I_C, I_A, Object_); - checkLub(I_C, I_B, Object_); - checkLub(I_C, I_C, I_C); - })); -} - -void testMixin() { - asyncTest(() => TypeEnvironment.create(r""" - class A {} - class B {} - class C extends B {} - class D extends C {} // This makes D have higher depth than Object+A. - class I extends Object with A, B implements A, D {} - class I2 extends Object with A, B implements A, D {} - class J extends Object with B, A implements A, D {} - """).then((env) { - - DartType Object_ = env['Object']; - DartType A = env['A']; - DartType B = env['B']; - DartType C = env['C']; - DartType D = env['D']; - DartType I = env['I']; - DartType I2 = env['I2']; - DartType J = env['J']; - - checkLub(DartType a, DartType b, DartType expectedLub) { - DartType lub = env.computeLeastUpperBound(a, b); - Expect.equals(expectedLub, lub, - 'Unexpected lub($a,$b) = $lub, expected $expectedLub'); - } - - checkLub(Object_, Object_, Object_); - checkLub(Object_, A, Object_); - checkLub(Object_, B, Object_); - checkLub(Object_, C, Object_); - checkLub(Object_, D, Object_); - checkLub(Object_, I, Object_); - checkLub(Object_, I2, Object_); - checkLub(Object_, J, Object_); - - checkLub(A, Object_, Object_); - checkLub(A, A, A); - checkLub(A, B, Object_); - checkLub(A, C, Object_); - checkLub(A, D, Object_); - checkLub(A, I, A); - checkLub(A, I2, A); - checkLub(A, J, A); - - checkLub(B, Object_, Object_); - checkLub(B, A, Object_); - checkLub(B, B, B); - checkLub(B, C, B); - checkLub(B, D, B); - checkLub(B, I, B); - checkLub(B, I2, B); - checkLub(B, J, B); - - checkLub(C, Object_, Object_); - checkLub(C, A, Object_); - checkLub(C, B, B); - checkLub(C, C, C); - checkLub(C, D, C); - checkLub(C, I, C); - checkLub(C, I2, C); - checkLub(C, J, C); - - checkLub(D, Object_, Object_); - checkLub(D, A, Object_); - checkLub(D, B, B); - checkLub(D, C, C); - checkLub(D, D, D); - checkLub(D, I, D); - checkLub(D, I2, D); - checkLub(D, J, D); - - checkLub(I, Object_, Object_); - checkLub(I, A, A); - checkLub(I, B, B); - checkLub(I, C, C); - checkLub(I, D, D); - checkLub(I, I, I); - checkLub(I, I2, D); - checkLub(I, J, D); - - checkLub(I2, Object_, Object_); - checkLub(I2, A, A); - checkLub(I2, B, B); - checkLub(I2, C, C); - checkLub(I2, D, D); - checkLub(I2, I, D); - checkLub(I2, I2, I2); - checkLub(I2, J, D); - - checkLub(J, Object_, Object_); - checkLub(J, A, A); - checkLub(J, B, B); - checkLub(J, C, C); - checkLub(J, D, D); - checkLub(J, I, D); - checkLub(J, I2, D); - checkLub(J, J, J); - })); -} - -void testFunction() { - asyncTest(() => TypeEnvironment.create(r""" - class A {} - class B {} - class C extends B {} - - typedef dynamic__(); - typedef void void__(); - typedef A A__(); - typedef B B__(); - typedef C C__(); - - typedef void void__A_B(A a, B b); - typedef void void__A_C(A a, C b); - typedef void void__B_A(B a, A b); - typedef void void__B_C(B a, C b); - - typedef void void___B([B a]); - typedef void void___B_C([B a, C b]); - typedef void void___C_C([C a, C b]); - - typedef void void____B({B a}); - typedef void void____B_C({B a, C b}); - typedef void void____C_C({C a, C b}); - """).then((env) { - - DartType Object_ = env['Object']; - DartType Function_ = env['Function']; - DartType dynamic__ = env['dynamic__']; - DartType void__ = env['void__']; - DartType A__ = env['A__']; - DartType B__ = env['B__']; - DartType C__ = env['C__']; - DartType void__A_B = env['void__A_B']; - DartType void__A_C = env['void__A_C']; - DartType void__B_A = env['void__B_A']; - DartType void__B_C = env['void__B_C']; - DartType void___B = env['void___B']; - DartType void___B_C = env['void___B_C']; - DartType void___C_C = env['void___C_C']; - DartType void____B = env['void____B']; - DartType void____B_C = env['void____B_C']; - DartType void____C_C = env['void____C_C']; - - // Types used only for checking results. - DartType void_ = env['void']; - DartType B = env['B']; - DartType C = env['C']; - FunctionType Object__ = env.functionType(Object_, []); - FunctionType void__Object_Object = - env.functionType(void_, [Object_, Object_]); - FunctionType void__Object_B = - env.functionType(void_, [Object_, B]); - FunctionType void__Object_C = - env.functionType(void_, [Object_, C]); - FunctionType void__B_Object = - env.functionType(void_, [B, Object_]); - - checkLub(DartType a, DartType b, DartType expectedLub) { - DartType lub = env.computeLeastUpperBound(a, b); - if (a != b) { - expectedLub = expectedLub.unalias(env.compiler); - lub = lub.unalias(env.compiler); - } - Expect.equals(expectedLub, lub, - 'Unexpected lub(${a.unalias(env.compiler)},' - '${b.unalias(env.compiler)}) = ' - '${lub}, expected ${expectedLub}'); - } - - checkLub(Object_, Object_, Object_); - checkLub(Object_, Function_, Object_); - checkLub(Object_, dynamic__, Object_); - checkLub(Object_, void__, Object_); - checkLub(Object_, A__, Object_); - checkLub(Object_, B__, Object_); - checkLub(Object_, C__, Object_); - checkLub(Object_, void__A_B, Object_); - checkLub(Object_, void__A_C, Object_); - checkLub(Object_, void__B_A, Object_); - checkLub(Object_, void__B_C, Object_); - checkLub(Object_, void___B, Object_); - checkLub(Object_, void___B_C, Object_); - checkLub(Object_, void___C_C, Object_); - checkLub(Object_, void____B, Object_); - checkLub(Object_, void____B_C, Object_); - checkLub(Object_, void____C_C, Object_); - - checkLub(Function_, Object_, Object_); - checkLub(Function_, Function_, Function_); - checkLub(Function_, dynamic__, Function_); - checkLub(Function_, void__, Function_); - checkLub(Function_, A__, Function_); - checkLub(Function_, B__, Function_); - checkLub(Function_, C__, Function_); - checkLub(Function_, void__A_B, Function_); - checkLub(Function_, void__A_C, Function_); - checkLub(Function_, void__B_A, Function_); - checkLub(Function_, void__B_C, Function_); - checkLub(Function_, void___B, Function_); - checkLub(Function_, void___B_C, Function_); - checkLub(Function_, void___C_C, Function_); - checkLub(Function_, void____B, Function_); - checkLub(Function_, void____B_C, Function_); - checkLub(Function_, void____C_C, Function_); - - checkLub(dynamic__, Object_, Object_); - checkLub(dynamic__, Function_, Function_); - checkLub(dynamic__, dynamic__, dynamic__); - checkLub(dynamic__, void__, dynamic__); - checkLub(dynamic__, A__, dynamic__); - checkLub(dynamic__, B__, dynamic__); - checkLub(dynamic__, C__, dynamic__); - checkLub(dynamic__, void__A_B, Function_); - checkLub(dynamic__, void__A_C, Function_); - checkLub(dynamic__, void__B_A, Function_); - checkLub(dynamic__, void__B_C, Function_); - checkLub(dynamic__, void___B, dynamic__); - checkLub(dynamic__, void___B_C, dynamic__); - checkLub(dynamic__, void___C_C, dynamic__); - checkLub(dynamic__, void____B, dynamic__); - checkLub(dynamic__, void____B_C, dynamic__); - checkLub(dynamic__, void____C_C, dynamic__); - - checkLub(void__, Object_, Object_); - checkLub(void__, Function_, Function_); - checkLub(void__, dynamic__, dynamic__); - checkLub(void__, void__, void__); - checkLub(void__, A__, void__); - checkLub(void__, B__, void__); - checkLub(void__, C__, void__); - checkLub(void__, void__A_B, Function_); - checkLub(void__, void__A_C, Function_); - checkLub(void__, void__B_A, Function_); - checkLub(void__, void__B_C, Function_); - checkLub(void__, void___B, void__); - checkLub(void__, void___B_C, void__); - checkLub(void__, void___C_C, void__); - checkLub(void__, void____B, void__); - checkLub(void__, void____B_C, void__); - checkLub(void__, void____C_C, void__); - - checkLub(A__, Object_, Object_); - checkLub(A__, Function_, Function_); - checkLub(A__, dynamic__, dynamic__); - checkLub(A__, void__, void__); - checkLub(A__, A__, A__); - checkLub(A__, B__, Object__); - checkLub(A__, C__, Object__); - checkLub(A__, void__A_B, Function_); - checkLub(A__, void__A_C, Function_); - checkLub(A__, void__B_A, Function_); - checkLub(A__, void__B_C, Function_); - checkLub(A__, void___B, void__); - checkLub(A__, void___B_C, void__); - checkLub(A__, void___C_C, void__); - checkLub(A__, void____B, void__); - checkLub(A__, void____B_C, void__); - checkLub(A__, void____C_C, void__); - - checkLub(B__, Object_, Object_); - checkLub(B__, Function_, Function_); - checkLub(B__, dynamic__, dynamic__); - checkLub(B__, void__, void__); - checkLub(B__, A__, Object__); - checkLub(B__, B__, B__); - checkLub(B__, C__, B__); - checkLub(B__, void__A_B, Function_); - checkLub(B__, void__A_C, Function_); - checkLub(B__, void__B_A, Function_); - checkLub(B__, void__B_C, Function_); - checkLub(B__, void___B, void__); - checkLub(B__, void___B_C, void__); - checkLub(B__, void___C_C, void__); - checkLub(B__, void____B, void__); - checkLub(B__, void____B_C, void__); - checkLub(B__, void____C_C, void__); - - checkLub(C__, Object_, Object_); - checkLub(C__, Function_, Function_); - checkLub(C__, dynamic__, dynamic__); - checkLub(C__, void__, void__); - checkLub(C__, A__, Object__); - checkLub(C__, B__, B__); - checkLub(C__, C__, C__); - checkLub(C__, void__A_B, Function_); - checkLub(C__, void__A_C, Function_); - checkLub(C__, void__B_A, Function_); - checkLub(C__, void__B_C, Function_); - checkLub(C__, void___B, void__); - checkLub(C__, void___B_C, void__); - checkLub(C__, void___C_C, void__); - checkLub(C__, void____B, void__); - checkLub(C__, void____B_C, void__); - checkLub(C__, void____C_C, void__); - - checkLub(void__A_B, Object_, Object_); - checkLub(void__A_B, Function_, Function_); - checkLub(void__A_B, dynamic__, Function_); - checkLub(void__A_B, void__, Function_); - checkLub(void__A_B, A__, Function_); - checkLub(void__A_B, B__, Function_); - checkLub(void__A_B, C__, Function_); - checkLub(void__A_B, void__A_B, void__A_B); - checkLub(void__A_B, void__A_C, void__A_B); - checkLub(void__A_B, void__B_A, void__Object_Object); - checkLub(void__A_B, void__B_C, void__Object_B); - checkLub(void__A_B, void___B, Function_); - checkLub(void__A_B, void___B_C, Function_); - checkLub(void__A_B, void___C_C, Function_); - checkLub(void__A_B, void____B, Function_); - checkLub(void__A_B, void____B_C, Function_); - checkLub(void__A_B, void____C_C, Function_); - - checkLub(void__A_C, Object_, Object_); - checkLub(void__A_C, Function_, Function_); - checkLub(void__A_C, dynamic__, Function_); - checkLub(void__A_C, void__, Function_); - checkLub(void__A_C, A__, Function_); - checkLub(void__A_C, B__, Function_); - checkLub(void__A_C, C__, Function_); - checkLub(void__A_C, void__A_B, void__A_B); - checkLub(void__A_C, void__A_C, void__A_C); - checkLub(void__A_C, void__B_A, void__Object_Object); - checkLub(void__A_C, void__B_C, void__Object_C); - checkLub(void__A_C, void___B, Function_); - checkLub(void__A_C, void___B_C, Function_); - checkLub(void__A_C, void___C_C, Function_); - checkLub(void__A_C, void____B, Function_); - checkLub(void__A_C, void____B_C, Function_); - checkLub(void__A_C, void____C_C, Function_); - - checkLub(void__B_A, Object_, Object_); - checkLub(void__B_A, Function_, Function_); - checkLub(void__B_A, dynamic__, Function_); - checkLub(void__B_A, void__, Function_); - checkLub(void__B_A, A__, Function_); - checkLub(void__B_A, B__, Function_); - checkLub(void__B_A, C__, Function_); - checkLub(void__B_A, void__A_B, void__Object_Object); - checkLub(void__B_A, void__A_C, void__Object_Object); - checkLub(void__B_A, void__B_A, void__B_A); - checkLub(void__B_A, void__B_C, void__B_Object); - checkLub(void__B_A, void___B, Function_); - checkLub(void__B_A, void___B_C, Function_); - checkLub(void__B_A, void___C_C, Function_); - checkLub(void__B_A, void____B, Function_); - checkLub(void__B_A, void____B_C, Function_); - checkLub(void__B_A, void____C_C, Function_); - - checkLub(void__B_C, Object_, Object_); - checkLub(void__B_C, Function_, Function_); - checkLub(void__B_C, dynamic__, Function_); - checkLub(void__B_C, void__, Function_); - checkLub(void__B_C, A__, Function_); - checkLub(void__B_C, B__, Function_); - checkLub(void__B_C, C__, Function_); - checkLub(void__B_C, void__A_B, void__Object_B); - checkLub(void__B_C, void__A_C, void__Object_C); - checkLub(void__B_C, void__B_A, void__B_Object); - checkLub(void__B_C, void__B_C, void__B_C); - checkLub(void__B_C, void___B, Function_); - checkLub(void__B_C, void___B_C, Function_); - checkLub(void__B_C, void___C_C, Function_); - checkLub(void__B_C, void____B, Function_); - checkLub(void__B_C, void____B_C, Function_); - checkLub(void__B_C, void____C_C, Function_); - - checkLub(void___B, Object_, Object_); - checkLub(void___B, Function_, Function_); - checkLub(void___B, dynamic__, dynamic__); - checkLub(void___B, void__, void__); - checkLub(void___B, A__, void__); - checkLub(void___B, B__, void__); - checkLub(void___B, C__, void__); - checkLub(void___B, void__A_B, Function_); - checkLub(void___B, void__A_C, Function_); - checkLub(void___B, void__B_A, Function_); - checkLub(void___B, void__B_C, Function_); - checkLub(void___B, void___B, void___B); - checkLub(void___B, void___B_C, void___B); - checkLub(void___B, void___C_C, void___B); - checkLub(void___B, void____B, void__); - checkLub(void___B, void____B_C, void__); - checkLub(void___B, void____C_C, void__); - - checkLub(void___B_C, Object_, Object_); - checkLub(void___B_C, Function_, Function_); - checkLub(void___B_C, dynamic__, dynamic__); - checkLub(void___B_C, void__, void__); - checkLub(void___B_C, A__, void__); - checkLub(void___B_C, B__, void__); - checkLub(void___B_C, C__, void__); - checkLub(void___B_C, void__A_B, Function_); - checkLub(void___B_C, void__A_C, Function_); - checkLub(void___B_C, void__B_A, Function_); - checkLub(void___B_C, void__B_C, Function_); - checkLub(void___B_C, void___B, void___B); - checkLub(void___B_C, void___B_C, void___B_C); - checkLub(void___B_C, void___C_C, void___B_C); - checkLub(void___B_C, void____B, void__); - checkLub(void___B_C, void____B_C, void__); - checkLub(void___B_C, void____C_C, void__); - - checkLub(void___C_C, Object_, Object_); - checkLub(void___C_C, Function_, Function_); - checkLub(void___C_C, dynamic__, dynamic__); - checkLub(void___C_C, void__, void__); - checkLub(void___C_C, A__, void__); - checkLub(void___C_C, B__, void__); - checkLub(void___C_C, C__, void__); - checkLub(void___C_C, void__A_B, Function_); - checkLub(void___C_C, void__A_C, Function_); - checkLub(void___C_C, void__B_A, Function_); - checkLub(void___C_C, void__B_C, Function_); - checkLub(void___C_C, void___B, void___B); - checkLub(void___C_C, void___B_C, void___B_C); - checkLub(void___C_C, void___C_C, void___C_C); - checkLub(void___C_C, void____B, void__); - checkLub(void___C_C, void____B_C, void__); - checkLub(void___C_C, void____C_C, void__); - - checkLub(void____B, Object_, Object_); - checkLub(void____B, Function_, Function_); - checkLub(void____B, dynamic__, dynamic__); - checkLub(void____B, void__, void__); - checkLub(void____B, A__, void__); - checkLub(void____B, B__, void__); - checkLub(void____B, C__, void__); - checkLub(void____B, void__A_B, Function_); - checkLub(void____B, void__A_C, Function_); - checkLub(void____B, void__B_A, Function_); - checkLub(void____B, void__B_C, Function_); - checkLub(void____B, void___B, void__); - checkLub(void____B, void___B_C, void__); - checkLub(void____B, void___C_C, void__); - checkLub(void____B, void____B, void____B); - checkLub(void____B, void____B_C, void____B); - checkLub(void____B, void____C_C, void____B); - - checkLub(void____B_C, Object_, Object_); - checkLub(void____B_C, Function_, Function_); - checkLub(void____B_C, dynamic__, dynamic__); - checkLub(void____B_C, void__, void__); - checkLub(void____B_C, A__, void__); - checkLub(void____B_C, B__, void__); - checkLub(void____B_C, C__, void__); - checkLub(void____B_C, void__A_B, Function_); - checkLub(void____B_C, void__A_C, Function_); - checkLub(void____B_C, void__B_A, Function_); - checkLub(void____B_C, void__B_C, Function_); - checkLub(void____B_C, void___B, void__); - checkLub(void____B_C, void___B_C, void__); - checkLub(void____B_C, void___C_C, void__); - checkLub(void____B_C, void____B, void____B); - checkLub(void____B_C, void____B_C, void____B_C); - checkLub(void____B_C, void____C_C, void____B_C); - - checkLub(void____C_C, Object_, Object_); - checkLub(void____C_C, Function_, Function_); - checkLub(void____C_C, dynamic__, dynamic__); - checkLub(void____C_C, void__, void__); - checkLub(void____C_C, A__, void__); - checkLub(void____C_C, B__, void__); - checkLub(void____C_C, C__, void__); - checkLub(void____C_C, void__A_B, Function_); - checkLub(void____C_C, void__A_C, Function_); - checkLub(void____C_C, void__B_A, Function_); - checkLub(void____C_C, void__B_C, Function_); - checkLub(void____C_C, void___B, void__); - checkLub(void____C_C, void___B_C, void__); - checkLub(void____C_C, void___C_C, void__); - checkLub(void____C_C, void____B, void____B); - checkLub(void____C_C, void____B_C, void____B_C); - checkLub(void____C_C, void____C_C, void____C_C); - })); -} - -void testTypeVariable() { - asyncTest(() => TypeEnvironment.create(r""" - class A {} - class B {} - class C extends B {} - class I {} - """).then((env) { - - // A B - // | / \ - // S T C - // / \ \ - // V X U - // / - // W - - DartType Object_ = env['Object']; - DartType A = env['A']; - DartType B = env['B']; - DartType C = env['C']; - ClassElement I = env.getElement('I'); - DartType S = I.typeVariables[0]; - DartType T = I.typeVariables[1]; - DartType U = I.typeVariables[2]; - DartType V = I.typeVariables[3]; - DartType W = I.typeVariables[4]; - DartType X = I.typeVariables[5]; - - checkLub(DartType a, DartType b, DartType expectedLub) { - DartType lub = env.computeLeastUpperBound(a, b); - Expect.equals(expectedLub, lub, - 'Unexpected lub($a,$b) = $lub, expected $expectedLub'); - } - - checkLub(Object_, Object_, Object_); - checkLub(Object_, A, Object_); - checkLub(Object_, B, Object_); - checkLub(Object_, C, Object_); - checkLub(Object_, S, Object_); - checkLub(Object_, T, Object_); - checkLub(Object_, U, Object_); - checkLub(Object_, V, Object_); - checkLub(Object_, W, Object_); - checkLub(Object_, X, Object_); - - checkLub(A, Object_, Object_); - checkLub(A, A, A); - checkLub(A, B, Object_); - checkLub(A, C, Object_); - checkLub(A, S, A); - checkLub(A, T, Object_); - checkLub(A, U, Object_); - checkLub(A, V, Object_); - checkLub(A, W, Object_); - checkLub(A, X, Object_); - - checkLub(B, Object_, Object_); - checkLub(B, A, Object_); - checkLub(B, B, B); - checkLub(B, C, B); - checkLub(B, S, Object_); - checkLub(B, T, B); - checkLub(B, U, B); - checkLub(B, V, B); - checkLub(B, W, B); - checkLub(B, X, B); - - checkLub(C, Object_, Object_); - checkLub(C, A, Object_); - checkLub(C, B, B); - checkLub(C, C, C); - checkLub(C, S, Object_); - checkLub(C, T, B); - checkLub(C, U, C); - checkLub(C, V, B); - checkLub(C, W, B); - checkLub(C, X, B); - - checkLub(S, Object_, Object_); - checkLub(S, A, A); - checkLub(S, B, Object_); - checkLub(S, C, Object_); - checkLub(S, S, S); - checkLub(S, T, Object_); - checkLub(S, U, Object_); - checkLub(S, V, Object_); - checkLub(S, W, Object_); - checkLub(S, X, Object_); - - checkLub(T, Object_, Object_); - checkLub(T, A, Object_); - checkLub(T, B, B); - checkLub(T, C, B); - checkLub(T, S, Object_); - checkLub(T, T, T); - checkLub(T, U, B); - checkLub(T, V, T); - checkLub(T, W, T); - checkLub(T, X, T); - - checkLub(U, Object_, Object_); - checkLub(U, A, Object_); - checkLub(U, B, B); - checkLub(U, C, C); - checkLub(U, S, Object_); - checkLub(U, T, B); - checkLub(U, U, U); - checkLub(U, V, B); - checkLub(U, W, B); - checkLub(U, X, B); - - checkLub(V, Object_, Object_); - checkLub(V, A, Object_); - checkLub(V, B, B); - checkLub(V, C, B); - checkLub(V, S, Object_); - checkLub(V, T, T); - checkLub(V, U, B); - checkLub(V, V, V); - checkLub(V, W, V); - checkLub(V, X, T); - - checkLub(W, Object_, Object_); - checkLub(W, A, Object_); - checkLub(W, B, B); - checkLub(W, C, B); - checkLub(W, S, Object_); - checkLub(W, T, T); - checkLub(W, U, B); - checkLub(W, V, V); - checkLub(W, W, W); - checkLub(W, X, T); - - checkLub(X, Object_, Object_); - checkLub(X, A, Object_); - checkLub(X, B, B); - checkLub(X, C, B); - checkLub(X, S, Object_); - checkLub(X, T, T); - checkLub(X, U, B); - checkLub(X, V, T); - checkLub(X, W, T); - checkLub(X, X, X); - })); -} - - +// Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +library subtype_test; + +import 'package:expect/expect.dart'; +import 'package:async_helper/async_helper.dart'; +import 'type_test_helper.dart'; +import 'package:compiler/src/dart_types.dart'; +import "package:compiler/src/elements/elements.dart" + show Element, ClassElement; +import 'package:compiler/src/util/util.dart'; + +void main() { + testInterface1(); + testInterface2(); + testGeneric(); + testMixin(); + testFunction(); + testTypeVariable(); +} + +void testInterface1() { + asyncTest(() => TypeEnvironment.create(r""" + class A {} // A and B have equal depth. + class B {} + class I implements A, B {} + class J implements A, B {} + """).then((env) { + + DartType Object_ = env['Object']; + DartType A = env['A']; + DartType B = env['B']; + DartType I = env['I']; + DartType J = env['J']; + + checkLub(DartType a, DartType b, DartType expect) { + DartType lub = env.computeLeastUpperBound(a, b); + Expect.equals(expect, lub, + 'Unexpected lub($a,$b) = $lub, expected $expect.'); + } + + checkLub(Object_, Object_, Object_); + checkLub(Object_, A, Object_); + checkLub(Object_, B, Object_); + checkLub(Object_, I, Object_); + checkLub(Object_, J, Object_); + + checkLub(A, Object_, Object_); + checkLub(A, A, A); + checkLub(A, B, Object_); + checkLub(A, I, A); + checkLub(A, J, A); + + checkLub(B, Object_, Object_); + checkLub(B, A, Object_); + checkLub(B, B, B); + checkLub(B, I, B); + checkLub(B, J, B); + + checkLub(I, Object_, Object_); + checkLub(I, A, A); + checkLub(I, B, B); + checkLub(I, I, I); + checkLub(I, J, Object_); + + checkLub(J, Object_, Object_); + checkLub(J, A, A); + checkLub(J, B, B); + checkLub(J, I, Object_); + checkLub(J, J, J); + })); +} + +void testInterface2() { + asyncTest(() => TypeEnvironment.create(r""" + class A {} + class B {} + class C extends B {} // This makes C have higher depth than A. + class I implements A, C {} + class J implements A, C {} + """).then((env) { + + DartType Object_ = env['Object']; + DartType A = env['A']; + DartType B = env['B']; + DartType C = env['C']; + DartType I = env['I']; + DartType J = env['J']; + + checkLub(DartType a, DartType b, DartType expectedLub) { + DartType lub = env.computeLeastUpperBound(a, b); + Expect.equals(expectedLub, lub, + 'Unexpected lub($a,$b) = $lub, expected $expectedLub'); + } + + checkLub(Object_, Object_, Object_); + checkLub(Object_, A, Object_); + checkLub(Object_, B, Object_); + checkLub(Object_, C, Object_); + checkLub(Object_, I, Object_); + checkLub(Object_, J, Object_); + + checkLub(A, Object_, Object_); + checkLub(A, A, A); + checkLub(A, B, Object_); + checkLub(A, C, Object_); + checkLub(A, I, A); + checkLub(A, J, A); + + checkLub(B, Object_, Object_); + checkLub(B, A, Object_); + checkLub(B, B, B); + checkLub(B, C, B); + checkLub(B, I, B); + checkLub(B, J, B); + + checkLub(C, Object_, Object_); + checkLub(C, A, Object_); + checkLub(C, B, B); + checkLub(C, C, C); + checkLub(C, I, C); + checkLub(C, J, C); + + checkLub(I, Object_, Object_); + checkLub(I, A, A); + checkLub(I, B, B); + checkLub(I, C, C); + checkLub(I, I, I); + checkLub(I, J, C); + + checkLub(J, Object_, Object_); + checkLub(J, A, A); + checkLub(J, B, B); + checkLub(J, C, C); + checkLub(J, I, C); + checkLub(J, J, J); + })); +} + +void testGeneric() { + asyncTest(() => TypeEnvironment.create(r""" + class A {} + class B {} + class C extends B {} + class I {} + """).then((env) { + + DartType Object_ = env['Object']; + DartType A = env['A']; + DartType B = env['B']; + DartType C = env['C']; + ClassElement I = env.getElement('I'); + DartType I_A = instantiate(I, [A]); + DartType I_B = instantiate(I, [B]); + DartType I_C = instantiate(I, [C]); + + checkLub(DartType a, DartType b, DartType expectedLub) { + DartType lub = env.computeLeastUpperBound(a, b); + Expect.equals(expectedLub, lub, + 'Unexpected lub($a,$b) = $lub, expected $expectedLub'); + } + + checkLub(Object_, Object_, Object_); + checkLub(Object_, A, Object_); + checkLub(Object_, B, Object_); + checkLub(Object_, C, Object_); + checkLub(Object_, I_A, Object_); + checkLub(Object_, I_B, Object_); + checkLub(Object_, I_C, Object_); + + checkLub(A, Object_, Object_); + checkLub(A, A, A); + checkLub(A, B, Object_); + checkLub(A, C, Object_); + checkLub(A, I_A, Object_); + checkLub(A, I_B, Object_); + checkLub(A, I_C, Object_); + + checkLub(B, Object_, Object_); + checkLub(B, A, Object_); + checkLub(B, B, B); + checkLub(B, C, B); + checkLub(B, I_A, Object_); + checkLub(B, I_B, Object_); + checkLub(B, I_C, Object_); + + checkLub(C, Object_, Object_); + checkLub(C, A, Object_); + checkLub(C, B, B); + checkLub(C, C, C); + checkLub(C, I_A, Object_); + checkLub(C, I_B, Object_); + checkLub(C, I_C, Object_); + + checkLub(I_A, Object_, Object_); + checkLub(I_A, A, Object_); + checkLub(I_A, B, Object_); + checkLub(I_A, C, Object_); + checkLub(I_A, I_A, I_A); + checkLub(I_A, I_B, Object_); + checkLub(I_A, I_C, Object_); + + checkLub(I_B, Object_, Object_); + checkLub(I_B, A, Object_); + checkLub(I_B, B, Object_); + checkLub(I_B, C, Object_); + checkLub(I_B, I_A, Object_); + checkLub(I_B, I_B, I_B); + checkLub(I_B, I_C, Object_); + + checkLub(I_C, Object_, Object_); + checkLub(I_C, A, Object_); + checkLub(I_C, B, Object_); + checkLub(I_C, C, Object_); + checkLub(I_C, I_A, Object_); + checkLub(I_C, I_B, Object_); + checkLub(I_C, I_C, I_C); + })); +} + +void testMixin() { + asyncTest(() => TypeEnvironment.create(r""" + class A {} + class B {} + class C extends B {} + class D extends C {} // This makes D have higher depth than Object+A. + class I extends Object with A, B implements A, D {} + class I2 extends Object with A, B implements A, D {} + class J extends Object with B, A implements A, D {} + """).then((env) { + + DartType Object_ = env['Object']; + DartType A = env['A']; + DartType B = env['B']; + DartType C = env['C']; + DartType D = env['D']; + DartType I = env['I']; + DartType I2 = env['I2']; + DartType J = env['J']; + + checkLub(DartType a, DartType b, DartType expectedLub) { + DartType lub = env.computeLeastUpperBound(a, b); + Expect.equals(expectedLub, lub, + 'Unexpected lub($a,$b) = $lub, expected $expectedLub'); + } + + checkLub(Object_, Object_, Object_); + checkLub(Object_, A, Object_); + checkLub(Object_, B, Object_); + checkLub(Object_, C, Object_); + checkLub(Object_, D, Object_); + checkLub(Object_, I, Object_); + checkLub(Object_, I2, Object_); + checkLub(Object_, J, Object_); + + checkLub(A, Object_, Object_); + checkLub(A, A, A); + checkLub(A, B, Object_); + checkLub(A, C, Object_); + checkLub(A, D, Object_); + checkLub(A, I, A); + checkLub(A, I2, A); + checkLub(A, J, A); + + checkLub(B, Object_, Object_); + checkLub(B, A, Object_); + checkLub(B, B, B); + checkLub(B, C, B); + checkLub(B, D, B); + checkLub(B, I, B); + checkLub(B, I2, B); + checkLub(B, J, B); + + checkLub(C, Object_, Object_); + checkLub(C, A, Object_); + checkLub(C, B, B); + checkLub(C, C, C); + checkLub(C, D, C); + checkLub(C, I, C); + checkLub(C, I2, C); + checkLub(C, J, C); + + checkLub(D, Object_, Object_); + checkLub(D, A, Object_); + checkLub(D, B, B); + checkLub(D, C, C); + checkLub(D, D, D); + checkLub(D, I, D); + checkLub(D, I2, D); + checkLub(D, J, D); + + checkLub(I, Object_, Object_); + checkLub(I, A, A); + checkLub(I, B, B); + checkLub(I, C, C); + checkLub(I, D, D); + checkLub(I, I, I); + checkLub(I, I2, D); + checkLub(I, J, D); + + checkLub(I2, Object_, Object_); + checkLub(I2, A, A); + checkLub(I2, B, B); + checkLub(I2, C, C); + checkLub(I2, D, D); + checkLub(I2, I, D); + checkLub(I2, I2, I2); + checkLub(I2, J, D); + + checkLub(J, Object_, Object_); + checkLub(J, A, A); + checkLub(J, B, B); + checkLub(J, C, C); + checkLub(J, D, D); + checkLub(J, I, D); + checkLub(J, I2, D); + checkLub(J, J, J); + })); +} + +void testFunction() { + asyncTest(() => TypeEnvironment.create(r""" + class A {} + class B {} + class C extends B {} + + typedef dynamic__(); + typedef void void__(); + typedef A A__(); + typedef B B__(); + typedef C C__(); + + typedef void void__A_B(A a, B b); + typedef void void__A_C(A a, C b); + typedef void void__B_A(B a, A b); + typedef void void__B_C(B a, C b); + + typedef void void___B([B a]); + typedef void void___B_C([B a, C b]); + typedef void void___C_C([C a, C b]); + + typedef void void____B({B a}); + typedef void void____B_C({B a, C b}); + typedef void void____C_C({C a, C b}); + """).then((env) { + + DartType Object_ = env['Object']; + DartType Function_ = env['Function']; + DartType dynamic__ = env['dynamic__']; + DartType void__ = env['void__']; + DartType A__ = env['A__']; + DartType B__ = env['B__']; + DartType C__ = env['C__']; + DartType void__A_B = env['void__A_B']; + DartType void__A_C = env['void__A_C']; + DartType void__B_A = env['void__B_A']; + DartType void__B_C = env['void__B_C']; + DartType void___B = env['void___B']; + DartType void___B_C = env['void___B_C']; + DartType void___C_C = env['void___C_C']; + DartType void____B = env['void____B']; + DartType void____B_C = env['void____B_C']; + DartType void____C_C = env['void____C_C']; + + // Types used only for checking results. + DartType void_ = env['void']; + DartType B = env['B']; + DartType C = env['C']; + FunctionType Object__ = env.functionType(Object_, []); + FunctionType void__Object_Object = + env.functionType(void_, [Object_, Object_]); + FunctionType void__Object_B = + env.functionType(void_, [Object_, B]); + FunctionType void__Object_C = + env.functionType(void_, [Object_, C]); + FunctionType void__B_Object = + env.functionType(void_, [B, Object_]); + + checkLub(DartType a, DartType b, DartType expectedLub) { + DartType lub = env.computeLeastUpperBound(a, b); + if (a != b) { + expectedLub = expectedLub.unalias(env.compiler); + lub = lub.unalias(env.compiler); + } + Expect.equals(expectedLub, lub, + 'Unexpected lub(${a.unalias(env.compiler)},' + '${b.unalias(env.compiler)}) = ' + '${lub}, expected ${expectedLub}'); + } + + checkLub(Object_, Object_, Object_); + checkLub(Object_, Function_, Object_); + checkLub(Object_, dynamic__, Object_); + checkLub(Object_, void__, Object_); + checkLub(Object_, A__, Object_); + checkLub(Object_, B__, Object_); + checkLub(Object_, C__, Object_); + checkLub(Object_, void__A_B, Object_); + checkLub(Object_, void__A_C, Object_); + checkLub(Object_, void__B_A, Object_); + checkLub(Object_, void__B_C, Object_); + checkLub(Object_, void___B, Object_); + checkLub(Object_, void___B_C, Object_); + checkLub(Object_, void___C_C, Object_); + checkLub(Object_, void____B, Object_); + checkLub(Object_, void____B_C, Object_); + checkLub(Object_, void____C_C, Object_); + + checkLub(Function_, Object_, Object_); + checkLub(Function_, Function_, Function_); + checkLub(Function_, dynamic__, Function_); + checkLub(Function_, void__, Function_); + checkLub(Function_, A__, Function_); + checkLub(Function_, B__, Function_); + checkLub(Function_, C__, Function_); + checkLub(Function_, void__A_B, Function_); + checkLub(Function_, void__A_C, Function_); + checkLub(Function_, void__B_A, Function_); + checkLub(Function_, void__B_C, Function_); + checkLub(Function_, void___B, Function_); + checkLub(Function_, void___B_C, Function_); + checkLub(Function_, void___C_C, Function_); + checkLub(Function_, void____B, Function_); + checkLub(Function_, void____B_C, Function_); + checkLub(Function_, void____C_C, Function_); + + checkLub(dynamic__, Object_, Object_); + checkLub(dynamic__, Function_, Function_); + checkLub(dynamic__, dynamic__, dynamic__); + checkLub(dynamic__, void__, dynamic__); + checkLub(dynamic__, A__, dynamic__); + checkLub(dynamic__, B__, dynamic__); + checkLub(dynamic__, C__, dynamic__); + checkLub(dynamic__, void__A_B, Function_); + checkLub(dynamic__, void__A_C, Function_); + checkLub(dynamic__, void__B_A, Function_); + checkLub(dynamic__, void__B_C, Function_); + checkLub(dynamic__, void___B, dynamic__); + checkLub(dynamic__, void___B_C, dynamic__); + checkLub(dynamic__, void___C_C, dynamic__); + checkLub(dynamic__, void____B, dynamic__); + checkLub(dynamic__, void____B_C, dynamic__); + checkLub(dynamic__, void____C_C, dynamic__); + + checkLub(void__, Object_, Object_); + checkLub(void__, Function_, Function_); + checkLub(void__, dynamic__, dynamic__); + checkLub(void__, void__, void__); + checkLub(void__, A__, void__); + checkLub(void__, B__, void__); + checkLub(void__, C__, void__); + checkLub(void__, void__A_B, Function_); + checkLub(void__, void__A_C, Function_); + checkLub(void__, void__B_A, Function_); + checkLub(void__, void__B_C, Function_); + checkLub(void__, void___B, void__); + checkLub(void__, void___B_C, void__); + checkLub(void__, void___C_C, void__); + checkLub(void__, void____B, void__); + checkLub(void__, void____B_C, void__); + checkLub(void__, void____C_C, void__); + + checkLub(A__, Object_, Object_); + checkLub(A__, Function_, Function_); + checkLub(A__, dynamic__, dynamic__); + checkLub(A__, void__, void__); + checkLub(A__, A__, A__); + checkLub(A__, B__, Object__); + checkLub(A__, C__, Object__); + checkLub(A__, void__A_B, Function_); + checkLub(A__, void__A_C, Function_); + checkLub(A__, void__B_A, Function_); + checkLub(A__, void__B_C, Function_); + checkLub(A__, void___B, void__); + checkLub(A__, void___B_C, void__); + checkLub(A__, void___C_C, void__); + checkLub(A__, void____B, void__); + checkLub(A__, void____B_C, void__); + checkLub(A__, void____C_C, void__); + + checkLub(B__, Object_, Object_); + checkLub(B__, Function_, Function_); + checkLub(B__, dynamic__, dynamic__); + checkLub(B__, void__, void__); + checkLub(B__, A__, Object__); + checkLub(B__, B__, B__); + checkLub(B__, C__, B__); + checkLub(B__, void__A_B, Function_); + checkLub(B__, void__A_C, Function_); + checkLub(B__, void__B_A, Function_); + checkLub(B__, void__B_C, Function_); + checkLub(B__, void___B, void__); + checkLub(B__, void___B_C, void__); + checkLub(B__, void___C_C, void__); + checkLub(B__, void____B, void__); + checkLub(B__, void____B_C, void__); + checkLub(B__, void____C_C, void__); + + checkLub(C__, Object_, Object_); + checkLub(C__, Function_, Function_); + checkLub(C__, dynamic__, dynamic__); + checkLub(C__, void__, void__); + checkLub(C__, A__, Object__); + checkLub(C__, B__, B__); + checkLub(C__, C__, C__); + checkLub(C__, void__A_B, Function_); + checkLub(C__, void__A_C, Function_); + checkLub(C__, void__B_A, Function_); + checkLub(C__, void__B_C, Function_); + checkLub(C__, void___B, void__); + checkLub(C__, void___B_C, void__); + checkLub(C__, void___C_C, void__); + checkLub(C__, void____B, void__); + checkLub(C__, void____B_C, void__); + checkLub(C__, void____C_C, void__); + + checkLub(void__A_B, Object_, Object_); + checkLub(void__A_B, Function_, Function_); + checkLub(void__A_B, dynamic__, Function_); + checkLub(void__A_B, void__, Function_); + checkLub(void__A_B, A__, Function_); + checkLub(void__A_B, B__, Function_); + checkLub(void__A_B, C__, Function_); + checkLub(void__A_B, void__A_B, void__A_B); + checkLub(void__A_B, void__A_C, void__A_B); + checkLub(void__A_B, void__B_A, void__Object_Object); + checkLub(void__A_B, void__B_C, void__Object_B); + checkLub(void__A_B, void___B, Function_); + checkLub(void__A_B, void___B_C, Function_); + checkLub(void__A_B, void___C_C, Function_); + checkLub(void__A_B, void____B, Function_); + checkLub(void__A_B, void____B_C, Function_); + checkLub(void__A_B, void____C_C, Function_); + + checkLub(void__A_C, Object_, Object_); + checkLub(void__A_C, Function_, Function_); + checkLub(void__A_C, dynamic__, Function_); + checkLub(void__A_C, void__, Function_); + checkLub(void__A_C, A__, Function_); + checkLub(void__A_C, B__, Function_); + checkLub(void__A_C, C__, Function_); + checkLub(void__A_C, void__A_B, void__A_B); + checkLub(void__A_C, void__A_C, void__A_C); + checkLub(void__A_C, void__B_A, void__Object_Object); + checkLub(void__A_C, void__B_C, void__Object_C); + checkLub(void__A_C, void___B, Function_); + checkLub(void__A_C, void___B_C, Function_); + checkLub(void__A_C, void___C_C, Function_); + checkLub(void__A_C, void____B, Function_); + checkLub(void__A_C, void____B_C, Function_); + checkLub(void__A_C, void____C_C, Function_); + + checkLub(void__B_A, Object_, Object_); + checkLub(void__B_A, Function_, Function_); + checkLub(void__B_A, dynamic__, Function_); + checkLub(void__B_A, void__, Function_); + checkLub(void__B_A, A__, Function_); + checkLub(void__B_A, B__, Function_); + checkLub(void__B_A, C__, Function_); + checkLub(void__B_A, void__A_B, void__Object_Object); + checkLub(void__B_A, void__A_C, void__Object_Object); + checkLub(void__B_A, void__B_A, void__B_A); + checkLub(void__B_A, void__B_C, void__B_Object); + checkLub(void__B_A, void___B, Function_); + checkLub(void__B_A, void___B_C, Function_); + checkLub(void__B_A, void___C_C, Function_); + checkLub(void__B_A, void____B, Function_); + checkLub(void__B_A, void____B_C, Function_); + checkLub(void__B_A, void____C_C, Function_); + + checkLub(void__B_C, Object_, Object_); + checkLub(void__B_C, Function_, Function_); + checkLub(void__B_C, dynamic__, Function_); + checkLub(void__B_C, void__, Function_); + checkLub(void__B_C, A__, Function_); + checkLub(void__B_C, B__, Function_); + checkLub(void__B_C, C__, Function_); + checkLub(void__B_C, void__A_B, void__Object_B); + checkLub(void__B_C, void__A_C, void__Object_C); + checkLub(void__B_C, void__B_A, void__B_Object); + checkLub(void__B_C, void__B_C, void__B_C); + checkLub(void__B_C, void___B, Function_); + checkLub(void__B_C, void___B_C, Function_); + checkLub(void__B_C, void___C_C, Function_); + checkLub(void__B_C, void____B, Function_); + checkLub(void__B_C, void____B_C, Function_); + checkLub(void__B_C, void____C_C, Function_); + + checkLub(void___B, Object_, Object_); + checkLub(void___B, Function_, Function_); + checkLub(void___B, dynamic__, dynamic__); + checkLub(void___B, void__, void__); + checkLub(void___B, A__, void__); + checkLub(void___B, B__, void__); + checkLub(void___B, C__, void__); + checkLub(void___B, void__A_B, Function_); + checkLub(void___B, void__A_C, Function_); + checkLub(void___B, void__B_A, Function_); + checkLub(void___B, void__B_C, Function_); + checkLub(void___B, void___B, void___B); + checkLub(void___B, void___B_C, void___B); + checkLub(void___B, void___C_C, void___B); + checkLub(void___B, void____B, void__); + checkLub(void___B, void____B_C, void__); + checkLub(void___B, void____C_C, void__); + + checkLub(void___B_C, Object_, Object_); + checkLub(void___B_C, Function_, Function_); + checkLub(void___B_C, dynamic__, dynamic__); + checkLub(void___B_C, void__, void__); + checkLub(void___B_C, A__, void__); + checkLub(void___B_C, B__, void__); + checkLub(void___B_C, C__, void__); + checkLub(void___B_C, void__A_B, Function_); + checkLub(void___B_C, void__A_C, Function_); + checkLub(void___B_C, void__B_A, Function_); + checkLub(void___B_C, void__B_C, Function_); + checkLub(void___B_C, void___B, void___B); + checkLub(void___B_C, void___B_C, void___B_C); + checkLub(void___B_C, void___C_C, void___B_C); + checkLub(void___B_C, void____B, void__); + checkLub(void___B_C, void____B_C, void__); + checkLub(void___B_C, void____C_C, void__); + + checkLub(void___C_C, Object_, Object_); + checkLub(void___C_C, Function_, Function_); + checkLub(void___C_C, dynamic__, dynamic__); + checkLub(void___C_C, void__, void__); + checkLub(void___C_C, A__, void__); + checkLub(void___C_C, B__, void__); + checkLub(void___C_C, C__, void__); + checkLub(void___C_C, void__A_B, Function_); + checkLub(void___C_C, void__A_C, Function_); + checkLub(void___C_C, void__B_A, Function_); + checkLub(void___C_C, void__B_C, Function_); + checkLub(void___C_C, void___B, void___B); + checkLub(void___C_C, void___B_C, void___B_C); + checkLub(void___C_C, void___C_C, void___C_C); + checkLub(void___C_C, void____B, void__); + checkLub(void___C_C, void____B_C, void__); + checkLub(void___C_C, void____C_C, void__); + + checkLub(void____B, Object_, Object_); + checkLub(void____B, Function_, Function_); + checkLub(void____B, dynamic__, dynamic__); + checkLub(void____B, void__, void__); + checkLub(void____B, A__, void__); + checkLub(void____B, B__, void__); + checkLub(void____B, C__, void__); + checkLub(void____B, void__A_B, Function_); + checkLub(void____B, void__A_C, Function_); + checkLub(void____B, void__B_A, Function_); + checkLub(void____B, void__B_C, Function_); + checkLub(void____B, void___B, void__); + checkLub(void____B, void___B_C, void__); + checkLub(void____B, void___C_C, void__); + checkLub(void____B, void____B, void____B); + checkLub(void____B, void____B_C, void____B); + checkLub(void____B, void____C_C, void____B); + + checkLub(void____B_C, Object_, Object_); + checkLub(void____B_C, Function_, Function_); + checkLub(void____B_C, dynamic__, dynamic__); + checkLub(void____B_C, void__, void__); + checkLub(void____B_C, A__, void__); + checkLub(void____B_C, B__, void__); + checkLub(void____B_C, C__, void__); + checkLub(void____B_C, void__A_B, Function_); + checkLub(void____B_C, void__A_C, Function_); + checkLub(void____B_C, void__B_A, Function_); + checkLub(void____B_C, void__B_C, Function_); + checkLub(void____B_C, void___B, void__); + checkLub(void____B_C, void___B_C, void__); + checkLub(void____B_C, void___C_C, void__); + checkLub(void____B_C, void____B, void____B); + checkLub(void____B_C, void____B_C, void____B_C); + checkLub(void____B_C, void____C_C, void____B_C); + + checkLub(void____C_C, Object_, Object_); + checkLub(void____C_C, Function_, Function_); + checkLub(void____C_C, dynamic__, dynamic__); + checkLub(void____C_C, void__, void__); + checkLub(void____C_C, A__, void__); + checkLub(void____C_C, B__, void__); + checkLub(void____C_C, C__, void__); + checkLub(void____C_C, void__A_B, Function_); + checkLub(void____C_C, void__A_C, Function_); + checkLub(void____C_C, void__B_A, Function_); + checkLub(void____C_C, void__B_C, Function_); + checkLub(void____C_C, void___B, void__); + checkLub(void____C_C, void___B_C, void__); + checkLub(void____C_C, void___C_C, void__); + checkLub(void____C_C, void____B, void____B); + checkLub(void____C_C, void____B_C, void____B_C); + checkLub(void____C_C, void____C_C, void____C_C); + })); +} + +void testTypeVariable() { + asyncTest(() => TypeEnvironment.create(r""" + class A {} + class B {} + class C extends B {} + class I {} + """).then((env) { + + // A B + // | / \ + // S T C + // / \ \ + // V X U + // / + // W + + DartType Object_ = env['Object']; + DartType A = env['A']; + DartType B = env['B']; + DartType C = env['C']; + ClassElement I = env.getElement('I'); + DartType S = I.typeVariables[0]; + DartType T = I.typeVariables[1]; + DartType U = I.typeVariables[2]; + DartType V = I.typeVariables[3]; + DartType W = I.typeVariables[4]; + DartType X = I.typeVariables[5]; + + checkLub(DartType a, DartType b, DartType expectedLub) { + DartType lub = env.computeLeastUpperBound(a, b); + Expect.equals(expectedLub, lub, + 'Unexpected lub($a,$b) = $lub, expected $expectedLub'); + } + + checkLub(Object_, Object_, Object_); + checkLub(Object_, A, Object_); + checkLub(Object_, B, Object_); + checkLub(Object_, C, Object_); + checkLub(Object_, S, Object_); + checkLub(Object_, T, Object_); + checkLub(Object_, U, Object_); + checkLub(Object_, V, Object_); + checkLub(Object_, W, Object_); + checkLub(Object_, X, Object_); + + checkLub(A, Object_, Object_); + checkLub(A, A, A); + checkLub(A, B, Object_); + checkLub(A, C, Object_); + checkLub(A, S, A); + checkLub(A, T, Object_); + checkLub(A, U, Object_); + checkLub(A, V, Object_); + checkLub(A, W, Object_); + checkLub(A, X, Object_); + + checkLub(B, Object_, Object_); + checkLub(B, A, Object_); + checkLub(B, B, B); + checkLub(B, C, B); + checkLub(B, S, Object_); + checkLub(B, T, B); + checkLub(B, U, B); + checkLub(B, V, B); + checkLub(B, W, B); + checkLub(B, X, B); + + checkLub(C, Object_, Object_); + checkLub(C, A, Object_); + checkLub(C, B, B); + checkLub(C, C, C); + checkLub(C, S, Object_); + checkLub(C, T, B); + checkLub(C, U, C); + checkLub(C, V, B); + checkLub(C, W, B); + checkLub(C, X, B); + + checkLub(S, Object_, Object_); + checkLub(S, A, A); + checkLub(S, B, Object_); + checkLub(S, C, Object_); + checkLub(S, S, S); + checkLub(S, T, Object_); + checkLub(S, U, Object_); + checkLub(S, V, Object_); + checkLub(S, W, Object_); + checkLub(S, X, Object_); + + checkLub(T, Object_, Object_); + checkLub(T, A, Object_); + checkLub(T, B, B); + checkLub(T, C, B); + checkLub(T, S, Object_); + checkLub(T, T, T); + checkLub(T, U, B); + checkLub(T, V, T); + checkLub(T, W, T); + checkLub(T, X, T); + + checkLub(U, Object_, Object_); + checkLub(U, A, Object_); + checkLub(U, B, B); + checkLub(U, C, C); + checkLub(U, S, Object_); + checkLub(U, T, B); + checkLub(U, U, U); + checkLub(U, V, B); + checkLub(U, W, B); + checkLub(U, X, B); + + checkLub(V, Object_, Object_); + checkLub(V, A, Object_); + checkLub(V, B, B); + checkLub(V, C, B); + checkLub(V, S, Object_); + checkLub(V, T, T); + checkLub(V, U, B); + checkLub(V, V, V); + checkLub(V, W, V); + checkLub(V, X, T); + + checkLub(W, Object_, Object_); + checkLub(W, A, Object_); + checkLub(W, B, B); + checkLub(W, C, B); + checkLub(W, S, Object_); + checkLub(W, T, T); + checkLub(W, U, B); + checkLub(W, V, V); + checkLub(W, W, W); + checkLub(W, X, T); + + checkLub(X, Object_, Object_); + checkLub(X, A, Object_); + checkLub(X, B, B); + checkLub(X, C, B); + checkLub(X, S, Object_); + checkLub(X, T, T); + checkLub(X, U, B); + checkLub(X, V, T); + checkLub(X, W, T); + checkLub(X, X, X); + })); +} + + diff --git a/tests/compiler/dart2js/line_column_provider_test.dart b/tests/compiler/dart2js/line_column_provider_test.dart index c1cddedc5a7..ae90daf28a2 100644 --- a/tests/compiler/dart2js/line_column_provider_test.dart +++ b/tests/compiler/dart2js/line_column_provider_test.dart @@ -1,84 +1,84 @@ -// 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. - -// Unittest for the [LineColumnCollector]. - -import 'package:expect/expect.dart'; -import 'package:compiler/src/io/code_output.dart'; -import 'package:compiler/src/io/line_column_provider.dart'; - -import 'output_collector.dart'; - -test(List events, Map> expectedPositions) { - BufferedEventSink sink = new BufferedEventSink(); - LineColumnProvider lineColumnProvider = new LineColumnCollector(); - CodeOutput output = new StreamCodeOutput(sink, [lineColumnProvider]); - for (var event in events) { - if (event is String) { - output.add(event); - } else if (event is CodeBuffer) { - output.addBuffer(event); - } - } - output.close(); - - expectedPositions.forEach((int offset, List expectedPosition) { - if (expectedPosition == null) { - Expect.throws(() => lineColumnProvider.getLine(offset), - (e) => true, - 'Expected out-of-bounds offset: $offset\n' - 'text:"""${sink.text}"""\n' - 'lineColumnProvider:$lineColumnProvider'); - } else { - int line = lineColumnProvider.getLine(offset); - int column = lineColumnProvider.getColumn(line, offset); - Expect.equals(expectedPosition[0], line, - 'Unexpected result: $offset -> $expectedPosition = [$line,$column]\n' - 'text:"""${sink.text}"""\n' - 'lineColumnProvider:$lineColumnProvider'); - Expect.equals(expectedPosition[1], column, - 'Unexpected result: $offset -> $expectedPosition = [$line,$column]\n' - 'text:"""${sink.text}"""\n' - 'lineColumnProvider:$lineColumnProvider'); - } - }); -} - -main() { - test([""], {0: [0, 0], 1: null}); - - test([" "], {0: [0, 0], 1: [0, 1], 2: null}); - - test(["\n "], {0: [0, 0], 1: [1, 0], 2: [1, 1], 3: null}); - - Map positions = {0: [0, 0], - 1: [0, 1], - 2: [1, 0], - 3: [1, 1], - 4: [2, 0], - 5: [2, 1], - 6: null}; - - test(["a\nb\nc"], positions); - - test(["a", "\nb\nc"], positions); - - test(["a", "\n", "b\nc"], positions); - - CodeBuffer buffer1 = new CodeBuffer(); - buffer1.add("a\nb\nc"); - test([buffer1], positions); - - CodeBuffer buffer2 = new CodeBuffer(); - buffer2.add("\nb\nc"); - test(["a", buffer2], positions); - - CodeBuffer buffer3 = new CodeBuffer(); - buffer3.add("a"); - test([buffer3, buffer2], positions); - - CodeBuffer buffer4 = new CodeBuffer(); - buffer4.addBuffer(buffer3); - test([buffer4, buffer2], positions); -} +// 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. + +// Unittest for the [LineColumnCollector]. + +import 'package:expect/expect.dart'; +import 'package:compiler/src/io/code_output.dart'; +import 'package:compiler/src/io/line_column_provider.dart'; + +import 'output_collector.dart'; + +test(List events, Map> expectedPositions) { + BufferedEventSink sink = new BufferedEventSink(); + LineColumnProvider lineColumnProvider = new LineColumnCollector(); + CodeOutput output = new StreamCodeOutput(sink, [lineColumnProvider]); + for (var event in events) { + if (event is String) { + output.add(event); + } else if (event is CodeBuffer) { + output.addBuffer(event); + } + } + output.close(); + + expectedPositions.forEach((int offset, List expectedPosition) { + if (expectedPosition == null) { + Expect.throws(() => lineColumnProvider.getLine(offset), + (e) => true, + 'Expected out-of-bounds offset: $offset\n' + 'text:"""${sink.text}"""\n' + 'lineColumnProvider:$lineColumnProvider'); + } else { + int line = lineColumnProvider.getLine(offset); + int column = lineColumnProvider.getColumn(line, offset); + Expect.equals(expectedPosition[0], line, + 'Unexpected result: $offset -> $expectedPosition = [$line,$column]\n' + 'text:"""${sink.text}"""\n' + 'lineColumnProvider:$lineColumnProvider'); + Expect.equals(expectedPosition[1], column, + 'Unexpected result: $offset -> $expectedPosition = [$line,$column]\n' + 'text:"""${sink.text}"""\n' + 'lineColumnProvider:$lineColumnProvider'); + } + }); +} + +main() { + test([""], {0: [0, 0], 1: null}); + + test([" "], {0: [0, 0], 1: [0, 1], 2: null}); + + test(["\n "], {0: [0, 0], 1: [1, 0], 2: [1, 1], 3: null}); + + Map positions = {0: [0, 0], + 1: [0, 1], + 2: [1, 0], + 3: [1, 1], + 4: [2, 0], + 5: [2, 1], + 6: null}; + + test(["a\nb\nc"], positions); + + test(["a", "\nb\nc"], positions); + + test(["a", "\n", "b\nc"], positions); + + CodeBuffer buffer1 = new CodeBuffer(); + buffer1.add("a\nb\nc"); + test([buffer1], positions); + + CodeBuffer buffer2 = new CodeBuffer(); + buffer2.add("\nb\nc"); + test(["a", buffer2], positions); + + CodeBuffer buffer3 = new CodeBuffer(); + buffer3.add("a"); + test([buffer3, buffer2], positions); + + CodeBuffer buffer4 = new CodeBuffer(); + buffer4.addBuffer(buffer3); + test([buffer4, buffer2], positions); +} diff --git a/tests/compiler/dart2js/mirror_system_helper.dart b/tests/compiler/dart2js/mirror_system_helper.dart index 497e6a3765e..7c97ebd3a89 100644 --- a/tests/compiler/dart2js/mirror_system_helper.dart +++ b/tests/compiler/dart2js/mirror_system_helper.dart @@ -1,139 +1,139 @@ -// Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file -// for details. All rights reserved. Use of this source code is governed by a -// BSD-style license that can be found in the LICENSE file. - -library mirror_system_helper; - -import 'dart:async'; -import 'package:compiler/src/mirrors/source_mirrors.dart'; -import 'package:compiler/src/mirrors/dart2js_mirrors.dart'; -import 'mock_compiler.dart'; - -export 'package:compiler/src/mirrors/source_mirrors.dart'; -export 'package:compiler/src/mirrors/mirrors_util.dart'; - -const String SOURCE = 'source'; -final Uri SOURCE_URI = new Uri(scheme: SOURCE, path: SOURCE); - -// TODO(johnniwinther): Move this to a mirrors helper library. -Future createMirrorSystem(String source) { - MockCompiler compiler = new MockCompiler.internal( - analyzeOnly: true, - analyzeAll: true, - preserveComments: true); - compiler.registerSource(SOURCE_URI, source); - compiler.librariesToAnalyzeWhenRun = [SOURCE_URI]; - return compiler.runCompiler(null).then((_) { - return new Dart2JsMirrorSystem(compiler); - }); -} - -/** - * Returns [:true:] if [type] is an instance of [:decl:] with type arguments - * equal to [typeArgument]. - */ -bool isInstance(ClassMirror decl, List typeArguments, - ClassMirror type) { - if (type.isOriginalDeclaration) return false; - if (!isSameDeclaration(decl, type)) return false; - return areEqualsTypes(typeArguments, type.typeArguments); -} - -/** - * Returns [:true:] if [type] is the same type as [expected]. This method - * equates a non-generic declaration with its instantiation. - */ -bool isEqualType(TypeMirror expected, TypeMirror type) { - if (expected == type) return true; - if (expected is ClassMirror && type is ClassMirror) { - if (!isSameDeclaration(expected, type)) return false; - if (expected.isOriginalDeclaration || expected.typeArguments.isEmpty) { - return type.isOriginalDeclaration || type.typeArguments.isEmpty; - } - return areEqualsTypes(expected.typeArguments, type.typeArguments); - } - return true; -} - -/** - * Returns [:true:] if [types] are equals to [expected] using the equalitry - * defined by [isEqualType]. - */ -bool areEqualsTypes(List expected, List types) { - return checkSameList(expected, types, isEqualType); -} - -/** - * Returns [:true:] if an instance of [type] with type arguments equal to - * [typeArguments] is found in [types]. - */ -bool containsType(ClassMirror decl, List typeArguments, - Iterable types) { - return types.any((type) => isInstance(decl, typeArguments, type)); -} - -/** - * Returns the declaration of [type]. - */ -TypeMirror toDeclaration(TypeMirror type) { - return type is ClassMirror ? type.originalDeclaration : type; -} - -/** - * Returns [:true:] if [type] is of the same declaration as [expected]. - */ -bool isSameDeclaration(TypeMirror expected, TypeMirror type) { - return toDeclaration(expected) == toDeclaration(type); -} - -/** - * Returns [:true:] if a type of the declaration of [expected] is in [types]. - */ -bool containsDeclaration(TypeMirror expected, Iterable types) { - for (var type in types) { - if (isSameDeclaration(expected, type)) { - return true; - } - } - return false; -} - -/** - * Returns [:true:] if declarations of [expected] are the same as those of - * [types], taking order into account. - */ -bool isSameDeclarationList(Iterable expected, - Iterable types) { - return checkSameList(expected, types, isSameDeclaration); -} - -/** - * Returns [:true:] if declarations of [expected] are the same as those of - * [iterable], not taking order into account. - */ -bool isSameDeclarationSet(Iterable expected, - Iterable types) { - Set expectedSet = expected.map(toDeclaration).toSet(); - Set typesSet = types.map(toDeclaration).toSet(); - return expectedSet.length == typesSet.length && - expectedSet.containsAll(typesSet); -} - -/** - * Utility method for checking whether [expected] and [iterable] contains the - * same elements with respect to the checking function [check], takin order - * into account. - */ -bool checkSameList(Iterable expected, - Iterable types, - bool check(TypeMirror a, TypeMirror b)) { - if (expected.length != types.length) return false; - Iterator expectedIterator = expected.iterator; - Iterator typesIterator = types.iterator; - while (expectedIterator.moveNext() && typesIterator.moveNext()) { - if (!check(expectedIterator.current, typesIterator.current)) { - return false; - } - } - return true; -} +// Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +library mirror_system_helper; + +import 'dart:async'; +import 'package:compiler/src/mirrors/source_mirrors.dart'; +import 'package:compiler/src/mirrors/dart2js_mirrors.dart'; +import 'mock_compiler.dart'; + +export 'package:compiler/src/mirrors/source_mirrors.dart'; +export 'package:compiler/src/mirrors/mirrors_util.dart'; + +const String SOURCE = 'source'; +final Uri SOURCE_URI = new Uri(scheme: SOURCE, path: SOURCE); + +// TODO(johnniwinther): Move this to a mirrors helper library. +Future createMirrorSystem(String source) { + MockCompiler compiler = new MockCompiler.internal( + analyzeOnly: true, + analyzeAll: true, + preserveComments: true); + compiler.registerSource(SOURCE_URI, source); + compiler.librariesToAnalyzeWhenRun = [SOURCE_URI]; + return compiler.runCompiler(null).then((_) { + return new Dart2JsMirrorSystem(compiler); + }); +} + +/** + * Returns [:true:] if [type] is an instance of [:decl:] with type arguments + * equal to [typeArgument]. + */ +bool isInstance(ClassMirror decl, List typeArguments, + ClassMirror type) { + if (type.isOriginalDeclaration) return false; + if (!isSameDeclaration(decl, type)) return false; + return areEqualsTypes(typeArguments, type.typeArguments); +} + +/** + * Returns [:true:] if [type] is the same type as [expected]. This method + * equates a non-generic declaration with its instantiation. + */ +bool isEqualType(TypeMirror expected, TypeMirror type) { + if (expected == type) return true; + if (expected is ClassMirror && type is ClassMirror) { + if (!isSameDeclaration(expected, type)) return false; + if (expected.isOriginalDeclaration || expected.typeArguments.isEmpty) { + return type.isOriginalDeclaration || type.typeArguments.isEmpty; + } + return areEqualsTypes(expected.typeArguments, type.typeArguments); + } + return true; +} + +/** + * Returns [:true:] if [types] are equals to [expected] using the equalitry + * defined by [isEqualType]. + */ +bool areEqualsTypes(List expected, List types) { + return checkSameList(expected, types, isEqualType); +} + +/** + * Returns [:true:] if an instance of [type] with type arguments equal to + * [typeArguments] is found in [types]. + */ +bool containsType(ClassMirror decl, List typeArguments, + Iterable types) { + return types.any((type) => isInstance(decl, typeArguments, type)); +} + +/** + * Returns the declaration of [type]. + */ +TypeMirror toDeclaration(TypeMirror type) { + return type is ClassMirror ? type.originalDeclaration : type; +} + +/** + * Returns [:true:] if [type] is of the same declaration as [expected]. + */ +bool isSameDeclaration(TypeMirror expected, TypeMirror type) { + return toDeclaration(expected) == toDeclaration(type); +} + +/** + * Returns [:true:] if a type of the declaration of [expected] is in [types]. + */ +bool containsDeclaration(TypeMirror expected, Iterable types) { + for (var type in types) { + if (isSameDeclaration(expected, type)) { + return true; + } + } + return false; +} + +/** + * Returns [:true:] if declarations of [expected] are the same as those of + * [types], taking order into account. + */ +bool isSameDeclarationList(Iterable expected, + Iterable types) { + return checkSameList(expected, types, isSameDeclaration); +} + +/** + * Returns [:true:] if declarations of [expected] are the same as those of + * [iterable], not taking order into account. + */ +bool isSameDeclarationSet(Iterable expected, + Iterable types) { + Set expectedSet = expected.map(toDeclaration).toSet(); + Set typesSet = types.map(toDeclaration).toSet(); + return expectedSet.length == typesSet.length && + expectedSet.containsAll(typesSet); +} + +/** + * Utility method for checking whether [expected] and [iterable] contains the + * same elements with respect to the checking function [check], takin order + * into account. + */ +bool checkSameList(Iterable expected, + Iterable types, + bool check(TypeMirror a, TypeMirror b)) { + if (expected.length != types.length) return false; + Iterator expectedIterator = expected.iterator; + Iterator typesIterator = types.iterator; + while (expectedIterator.moveNext() && typesIterator.moveNext()) { + if (!check(expectedIterator.current, typesIterator.current)) { + return false; + } + } + return true; +} diff --git a/tests/compiler/dart2js/mirrors/class_mirror_type_variables_test.dart b/tests/compiler/dart2js/mirrors/class_mirror_type_variables_test.dart index a3f68716318..b8b2e56f595 100644 --- a/tests/compiler/dart2js/mirrors/class_mirror_type_variables_test.dart +++ b/tests/compiler/dart2js/mirrors/class_mirror_type_variables_test.dart @@ -1,42 +1,42 @@ -// Copyright (c) 2013, 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. - -import "dart:mirrors"; - -import "package:async_helper/async_helper.dart"; - -import "mirrors_test_helper.dart"; -import "../../../lib/mirrors/class_mirror_type_variables_expect.dart"; - -class CompileTimeEnv implements Env { - final MirrorSystem mirrors; - - CompileTimeEnv(this.mirrors); - - LibraryMirror get core => mirrors.libraries[Uri.parse('dart:core')]; - - LibraryMirror get test => - mirrors.findLibrary(#class_mirror_type_variables_data); - - - ClassMirror getA() => test.declarations[#A]; - ClassMirror getB() => test.declarations[#B]; - ClassMirror getC() => test.declarations[#C]; - ClassMirror getD() => test.declarations[#D]; - ClassMirror getE() => test.declarations[#E]; - ClassMirror getF() => test.declarations[#F]; - ClassMirror getNoTypeParams() => test.declarations[#NoTypeParams]; - ClassMirror getObject() => core.declarations[#Object]; - ClassMirror getString() => core.declarations[#String]; - ClassMirror getHelperOfString() => - createInstantiation(test.declarations[#Helper], [getString()]); -} - -main() { - asyncTest(() => analyze("class_mirror_type_variables_data.dart"). - then((MirrorSystem mirrors) { - test(new CompileTimeEnv(mirrors)); - })); - -} +// Copyright (c) 2013, 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. + +import "dart:mirrors"; + +import "package:async_helper/async_helper.dart"; + +import "mirrors_test_helper.dart"; +import "../../../lib/mirrors/class_mirror_type_variables_expect.dart"; + +class CompileTimeEnv implements Env { + final MirrorSystem mirrors; + + CompileTimeEnv(this.mirrors); + + LibraryMirror get core => mirrors.libraries[Uri.parse('dart:core')]; + + LibraryMirror get test => + mirrors.findLibrary(#class_mirror_type_variables_data); + + + ClassMirror getA() => test.declarations[#A]; + ClassMirror getB() => test.declarations[#B]; + ClassMirror getC() => test.declarations[#C]; + ClassMirror getD() => test.declarations[#D]; + ClassMirror getE() => test.declarations[#E]; + ClassMirror getF() => test.declarations[#F]; + ClassMirror getNoTypeParams() => test.declarations[#NoTypeParams]; + ClassMirror getObject() => core.declarations[#Object]; + ClassMirror getString() => core.declarations[#String]; + ClassMirror getHelperOfString() => + createInstantiation(test.declarations[#Helper], [getString()]); +} + +main() { + asyncTest(() => analyze("class_mirror_type_variables_data.dart"). + then((MirrorSystem mirrors) { + test(new CompileTimeEnv(mirrors)); + })); + +} diff --git a/tests/compiler/dart2js/mirrors/default_value_test.dart b/tests/compiler/dart2js/mirrors/default_value_test.dart index 53b872118c5..b4ea3dc2f2f 100644 --- a/tests/compiler/dart2js/mirrors/default_value_test.dart +++ b/tests/compiler/dart2js/mirrors/default_value_test.dart @@ -1,62 +1,62 @@ -// Copyright (c) 2013, 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. - -import "dart:mirrors"; - -import "package:async_helper/async_helper.dart"; -import "package:expect/expect.dart"; -import "../memory_compiler.dart"; - -const SOURCE = const { - 'main.dart': """ -library main; - -class Class { - var a, b, c, d, e, f, g, h; - Class.optional(this.a, int b, void this.c(), - [this.d, int this.e, void this.f(), - this.g = 0, int this.h = 0]); - Class.named(this.a, int b, void this.c(), - {this.d, int this.e, void this.f(), - this.g: 0, int this.h: 0}); - methodOptional(a, int b, void c(), - [d, int e, void f(), - g = 0, int h = 0]) {} - methodNamed(a, int b, void c(), - {d, int e, void f(), - g: 0, int h: 0}) {} -} -""", -}; - -main() { - asyncTest(() => mirrorSystemFor(SOURCE).then((MirrorSystem mirrors) { - LibraryMirror dartCore = mirrors.libraries[Uri.parse('memory:main.dart')]; - ClassMirror classMirror = dartCore.declarations[#Class]; - testMethod(classMirror.declarations[#optional]); - testMethod(classMirror.declarations[#named]); - testMethod(classMirror.declarations[#methodOptional]); - testMethod(classMirror.declarations[#methodNamed]); - })); -} - -testMethod(MethodMirror mirror) { - Expect.equals(8, mirror.parameters.length); - for (int i = 0 ; i < 6 ; i++) { - testParameter(mirror.parameters[i], false); - } - for (int i = 6 ; i < 8 ; i++) { - testParameter(mirror.parameters[i], true); - } -} - -testParameter(ParameterMirror mirror, bool expectDefaultValue) { - if (expectDefaultValue) { - Expect.isTrue(mirror.hasDefaultValue); - Expect.isNotNull(mirror.defaultValue); - } else { - Expect.isFalse(mirror.hasDefaultValue); - Expect.isNull(mirror.defaultValue); - } -} +// Copyright (c) 2013, 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. + +import "dart:mirrors"; + +import "package:async_helper/async_helper.dart"; +import "package:expect/expect.dart"; +import "../memory_compiler.dart"; + +const SOURCE = const { + 'main.dart': """ +library main; + +class Class { + var a, b, c, d, e, f, g, h; + Class.optional(this.a, int b, void this.c(), + [this.d, int this.e, void this.f(), + this.g = 0, int this.h = 0]); + Class.named(this.a, int b, void this.c(), + {this.d, int this.e, void this.f(), + this.g: 0, int this.h: 0}); + methodOptional(a, int b, void c(), + [d, int e, void f(), + g = 0, int h = 0]) {} + methodNamed(a, int b, void c(), + {d, int e, void f(), + g: 0, int h: 0}) {} +} +""", +}; + +main() { + asyncTest(() => mirrorSystemFor(SOURCE).then((MirrorSystem mirrors) { + LibraryMirror dartCore = mirrors.libraries[Uri.parse('memory:main.dart')]; + ClassMirror classMirror = dartCore.declarations[#Class]; + testMethod(classMirror.declarations[#optional]); + testMethod(classMirror.declarations[#named]); + testMethod(classMirror.declarations[#methodOptional]); + testMethod(classMirror.declarations[#methodNamed]); + })); +} + +testMethod(MethodMirror mirror) { + Expect.equals(8, mirror.parameters.length); + for (int i = 0 ; i < 6 ; i++) { + testParameter(mirror.parameters[i], false); + } + for (int i = 6 ; i < 8 ; i++) { + testParameter(mirror.parameters[i], true); + } +} + +testParameter(ParameterMirror mirror, bool expectDefaultValue) { + if (expectDefaultValue) { + Expect.isTrue(mirror.hasDefaultValue); + Expect.isNotNull(mirror.defaultValue); + } else { + Expect.isFalse(mirror.hasDefaultValue); + Expect.isNull(mirror.defaultValue); + } +} diff --git a/tests/compiler/dart2js/mirrors/library_exports_hidden_test.dart b/tests/compiler/dart2js/mirrors/library_exports_hidden_test.dart index f01441eb0ab..ec228981a2c 100644 --- a/tests/compiler/dart2js/mirrors/library_exports_hidden_test.dart +++ b/tests/compiler/dart2js/mirrors/library_exports_hidden_test.dart @@ -1,17 +1,17 @@ -// Copyright (c) 2014, 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. - -import "dart:mirrors"; - -import "package:async_helper/async_helper.dart"; - -import "mirrors_test_helper.dart"; -import "../../../lib/mirrors/library_exports_hidden_test.dart"; - -main() { - asyncTest(() => analyze("library_exports_hidden_test.dart"). - then((MirrorSystem mirrors) { - test(mirrors); - })); -} +// Copyright (c) 2014, 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. + +import "dart:mirrors"; + +import "package:async_helper/async_helper.dart"; + +import "mirrors_test_helper.dart"; +import "../../../lib/mirrors/library_exports_hidden_test.dart"; + +main() { + asyncTest(() => analyze("library_exports_hidden_test.dart"). + then((MirrorSystem mirrors) { + test(mirrors); + })); +} diff --git a/tests/compiler/dart2js/mirrors/library_exports_shown_test.dart b/tests/compiler/dart2js/mirrors/library_exports_shown_test.dart index 87f336931e8..0234524238c 100644 --- a/tests/compiler/dart2js/mirrors/library_exports_shown_test.dart +++ b/tests/compiler/dart2js/mirrors/library_exports_shown_test.dart @@ -1,17 +1,17 @@ -// Copyright (c) 2014, 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. - -import "dart:mirrors"; - -import "package:async_helper/async_helper.dart"; - -import "mirrors_test_helper.dart"; -import "../../../lib/mirrors/library_exports_shown_test.dart"; - -main() { - asyncTest(() => analyze("library_exports_shown_test.dart"). - then((MirrorSystem mirrors) { - test(mirrors); - })); -} +// Copyright (c) 2014, 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. + +import "dart:mirrors"; + +import "package:async_helper/async_helper.dart"; + +import "mirrors_test_helper.dart"; +import "../../../lib/mirrors/library_exports_shown_test.dart"; + +main() { + asyncTest(() => analyze("library_exports_shown_test.dart"). + then((MirrorSystem mirrors) { + test(mirrors); + })); +} diff --git a/tests/compiler/dart2js/mirrors/library_imports_hidden_test.dart b/tests/compiler/dart2js/mirrors/library_imports_hidden_test.dart index ad4ba20ff7b..d72132d7b35 100644 --- a/tests/compiler/dart2js/mirrors/library_imports_hidden_test.dart +++ b/tests/compiler/dart2js/mirrors/library_imports_hidden_test.dart @@ -1,17 +1,17 @@ -// Copyright (c) 2014, 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. - -import "dart:mirrors"; - -import "package:async_helper/async_helper.dart"; - -import "mirrors_test_helper.dart"; -import "../../../lib/mirrors/library_imports_hidden_test.dart"; - -main() { - asyncTest(() => analyze("library_imports_hidden_test.dart"). - then((MirrorSystem mirrors) { - test(mirrors); - })); -} +// Copyright (c) 2014, 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. + +import "dart:mirrors"; + +import "package:async_helper/async_helper.dart"; + +import "mirrors_test_helper.dart"; +import "../../../lib/mirrors/library_imports_hidden_test.dart"; + +main() { + asyncTest(() => analyze("library_imports_hidden_test.dart"). + then((MirrorSystem mirrors) { + test(mirrors); + })); +} diff --git a/tests/compiler/dart2js/mirrors/library_imports_prefixed_show_hide_test.dart b/tests/compiler/dart2js/mirrors/library_imports_prefixed_show_hide_test.dart index 910dde5d3de..45b7dd5f617 100644 --- a/tests/compiler/dart2js/mirrors/library_imports_prefixed_show_hide_test.dart +++ b/tests/compiler/dart2js/mirrors/library_imports_prefixed_show_hide_test.dart @@ -1,17 +1,17 @@ -// Copyright (c) 2014, 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. - -import "dart:mirrors"; - -import "package:async_helper/async_helper.dart"; - -import "mirrors_test_helper.dart"; -import "../../../lib/mirrors/library_imports_prefixed_show_hide_test.dart"; - -main() { - asyncTest(() => analyze("library_imports_prefixed_show_hide_test.dart"). - then((MirrorSystem mirrors) { - test(mirrors); - })); -} +// Copyright (c) 2014, 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. + +import "dart:mirrors"; + +import "package:async_helper/async_helper.dart"; + +import "mirrors_test_helper.dart"; +import "../../../lib/mirrors/library_imports_prefixed_show_hide_test.dart"; + +main() { + asyncTest(() => analyze("library_imports_prefixed_show_hide_test.dart"). + then((MirrorSystem mirrors) { + test(mirrors); + })); +} diff --git a/tests/compiler/dart2js/mirrors/library_imports_prefixed_test.dart b/tests/compiler/dart2js/mirrors/library_imports_prefixed_test.dart index 5695e98c0bb..528247d6713 100644 --- a/tests/compiler/dart2js/mirrors/library_imports_prefixed_test.dart +++ b/tests/compiler/dart2js/mirrors/library_imports_prefixed_test.dart @@ -1,17 +1,17 @@ -// Copyright (c) 2014, 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. - -import "dart:mirrors"; - -import "package:async_helper/async_helper.dart"; - -import "mirrors_test_helper.dart"; -import "../../../lib/mirrors/library_imports_prefixed_test.dart"; - -main() { - asyncTest(() => analyze("library_imports_prefixed_test.dart"). - then((MirrorSystem mirrors) { - test(mirrors); - })); -} +// Copyright (c) 2014, 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. + +import "dart:mirrors"; + +import "package:async_helper/async_helper.dart"; + +import "mirrors_test_helper.dart"; +import "../../../lib/mirrors/library_imports_prefixed_test.dart"; + +main() { + asyncTest(() => analyze("library_imports_prefixed_test.dart"). + then((MirrorSystem mirrors) { + test(mirrors); + })); +} diff --git a/tests/compiler/dart2js/mirrors/library_imports_shown_test.dart b/tests/compiler/dart2js/mirrors/library_imports_shown_test.dart index 3f84ce796d7..83a77b07340 100644 --- a/tests/compiler/dart2js/mirrors/library_imports_shown_test.dart +++ b/tests/compiler/dart2js/mirrors/library_imports_shown_test.dart @@ -1,17 +1,17 @@ -// Copyright (c) 2014, 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. - -import "dart:mirrors"; - -import "package:async_helper/async_helper.dart"; - -import "mirrors_test_helper.dart"; -import "../../../lib/mirrors/library_imports_shown_test.dart"; - -main() { - asyncTest(() => analyze("library_imports_shown_test.dart"). - then((MirrorSystem mirrors) { - test(mirrors); - })); -} +// Copyright (c) 2014, 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. + +import "dart:mirrors"; + +import "package:async_helper/async_helper.dart"; + +import "mirrors_test_helper.dart"; +import "../../../lib/mirrors/library_imports_shown_test.dart"; + +main() { + asyncTest(() => analyze("library_imports_shown_test.dart"). + then((MirrorSystem mirrors) { + test(mirrors); + })); +} diff --git a/tests/compiler/dart2js/mirrors/mirrors_reader_test.dart b/tests/compiler/dart2js/mirrors/mirrors_reader_test.dart index 908c20caa75..bd41ab2f63f 100644 --- a/tests/compiler/dart2js/mirrors/mirrors_reader_test.dart +++ b/tests/compiler/dart2js/mirrors/mirrors_reader_test.dart @@ -1,141 +1,141 @@ -// Copyright (c) 2013, 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. - -// Test that everything reachable from a [MirrorSystem] can be accessed. - -library test.mirrors.reader; - -import "dart:mirrors" hide SourceLocation; - -import "package:async_helper/async_helper.dart"; - -import "mirrors_test_helper.dart"; -import "../../../lib/mirrors/mirrors_reader.dart"; -import "package:compiler/src/util/util.dart"; -import "package:compiler/src/mirrors/dart2js_mirrors.dart"; -import "package:compiler/src/mirrors/source_mirrors.dart"; - -class SourceMirrorsReader extends MirrorsReader { - final Dart2JsMirrorSystem mirrorSystem; - - SourceMirrorsReader(this.mirrorSystem, - {bool verbose: false, bool includeStackTrace: false}) - : super(verbose: verbose, includeStackTrace: includeStackTrace); - - evaluate(f()) { - try { - return f(); - } on SpannableAssertionFailure catch (e) { - mirrorSystem.compiler.reportAssertionFailure(e); - rethrow; - } - } - - visitMirror(Mirror mirror) { - if (mirror is CombinatorMirror) { - visitCombinatorMirror(mirror); - } else if (mirror is LibraryDependencyMirror) { - visitLibraryDependencyMirror(mirror); - } else if (mirror is CommentInstanceMirror) { - visitCommentInstanceMirror(mirror); - } else if (mirror is ListInstanceMirror) { - visitListInstanceMirror(mirror); - } else if (mirror is MapInstanceMirror) { - visitMapInstanceMirror(mirror); - } else if (mirror is TypeInstanceMirror) { - visitTypeInstanceMirror(mirror); - } else { - super.visitMirror(mirror); - } - } - - visitDeclarationMirror(DeclarationSourceMirror mirror) { - super.visitDeclarationMirror(mirror); - visit(mirror, 'isNameSynthetic', () => mirror.isNameSynthetic); - } - - visitClassMirror(ClassSourceMirror mirror) { - super.visitClassMirror(mirror); - visit(mirror, 'isAbstract', () => mirror.isAbstract); - } - - visitLibraryMirror(LibrarySourceMirror mirror) { - super.visitLibraryMirror(mirror); - visit(mirror, 'libraryDependencies', () => mirror.libraryDependencies); - } - - visitParameterMirror(ParameterMirror mirror) { - super.visitParameterMirror(mirror); - if (mirror is ParameterSourceMirror) { - visit(mirror, 'isInitializingFormal', () => mirror.isInitializingFormal); - visit(mirror, 'initializedField', () => mirror.initializedField); - } - } - - visitTypeMirror(TypeSourceMirror mirror) { - super.visitTypeMirror(mirror); - visit(mirror, 'isVoid', () => mirror.isVoid); - visit(mirror, 'isDynamic', () => mirror.isDynamic); - } - - visitSourceLocation(SourceLocation location) { - super.visitSourceLocation(location); - visit(location, 'line', () => location.line); - visit(location, 'column', () => location.column); - visit(location, 'offset', () => location.offset); - visit(location, 'length', () => location.length); - visit(location, 'text', () => location.text); - visit(location, 'sourceUri', () => location.sourceUri); - visit(location, 'sourceText', () => location.sourceText); - } - - visitCombinatorMirror(CombinatorMirror mirror) { - visit(mirror, 'identifiers', () => mirror.identifiers); - visit(mirror, 'isShow', () => mirror.isShow); - visit(mirror, 'isHide', () => mirror.isHide); - } - - visitLibraryDependencyMirror(LibraryDependencyMirror mirror) { - visit(mirror, 'isImport', () => mirror.isImport); - visit(mirror, 'isExport', () => mirror.isExport); - visit(mirror, 'sourceLibrary', () => mirror.sourceLibrary); - visit(mirror, 'targetLibrary', () => mirror.targetLibrary); - visit(mirror, 'prefix', () => mirror.prefix); - visit(mirror, 'combinators', () => mirror.combinators); - visit(mirror, 'location', () => mirror.location); - } - - visitCommentInstanceMirror(CommentInstanceMirror mirror) { - visitInstanceMirror(mirror); - visit(mirror, 'text', () => mirror.text); - visit(mirror, 'trimmedText', () => mirror.trimmedText); - visit(mirror, 'isDocComment', () => mirror.isDocComment); - } - - visitListInstanceMirror(ListInstanceMirror mirror) { - visitInstanceMirror(mirror); - visit(mirror, 'length', () => mirror.length); - } - - visitMapInstanceMirror(MapInstanceMirror mirror) { - visitInstanceMirror(mirror); - visit(mirror, 'keys', () => mirror.keys); - visit(mirror, 'length', () => mirror.length); - } - - visitTypeInstanceMirror(TypeInstanceMirror mirror) { - visitInstanceMirror(mirror); - visit(mirror, 'representedType', () => mirror.representedType); - } -} - -main(List arguments) { - asyncTest(() => analyzeUri(Uri.parse('dart:core')). - then((MirrorSystem mirrors) { - MirrorsReader reader = new SourceMirrorsReader(mirrors, - verbose: arguments.contains('-v'), - includeStackTrace: arguments.contains('-s')); - reader.checkMirrorSystem(mirrors); - })); -} +// Copyright (c) 2013, 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. + +// Test that everything reachable from a [MirrorSystem] can be accessed. + +library test.mirrors.reader; + +import "dart:mirrors" hide SourceLocation; + +import "package:async_helper/async_helper.dart"; + +import "mirrors_test_helper.dart"; +import "../../../lib/mirrors/mirrors_reader.dart"; +import "package:compiler/src/util/util.dart"; +import "package:compiler/src/mirrors/dart2js_mirrors.dart"; +import "package:compiler/src/mirrors/source_mirrors.dart"; + +class SourceMirrorsReader extends MirrorsReader { + final Dart2JsMirrorSystem mirrorSystem; + + SourceMirrorsReader(this.mirrorSystem, + {bool verbose: false, bool includeStackTrace: false}) + : super(verbose: verbose, includeStackTrace: includeStackTrace); + + evaluate(f()) { + try { + return f(); + } on SpannableAssertionFailure catch (e) { + mirrorSystem.compiler.reportAssertionFailure(e); + rethrow; + } + } + + visitMirror(Mirror mirror) { + if (mirror is CombinatorMirror) { + visitCombinatorMirror(mirror); + } else if (mirror is LibraryDependencyMirror) { + visitLibraryDependencyMirror(mirror); + } else if (mirror is CommentInstanceMirror) { + visitCommentInstanceMirror(mirror); + } else if (mirror is ListInstanceMirror) { + visitListInstanceMirror(mirror); + } else if (mirror is MapInstanceMirror) { + visitMapInstanceMirror(mirror); + } else if (mirror is TypeInstanceMirror) { + visitTypeInstanceMirror(mirror); + } else { + super.visitMirror(mirror); + } + } + + visitDeclarationMirror(DeclarationSourceMirror mirror) { + super.visitDeclarationMirror(mirror); + visit(mirror, 'isNameSynthetic', () => mirror.isNameSynthetic); + } + + visitClassMirror(ClassSourceMirror mirror) { + super.visitClassMirror(mirror); + visit(mirror, 'isAbstract', () => mirror.isAbstract); + } + + visitLibraryMirror(LibrarySourceMirror mirror) { + super.visitLibraryMirror(mirror); + visit(mirror, 'libraryDependencies', () => mirror.libraryDependencies); + } + + visitParameterMirror(ParameterMirror mirror) { + super.visitParameterMirror(mirror); + if (mirror is ParameterSourceMirror) { + visit(mirror, 'isInitializingFormal', () => mirror.isInitializingFormal); + visit(mirror, 'initializedField', () => mirror.initializedField); + } + } + + visitTypeMirror(TypeSourceMirror mirror) { + super.visitTypeMirror(mirror); + visit(mirror, 'isVoid', () => mirror.isVoid); + visit(mirror, 'isDynamic', () => mirror.isDynamic); + } + + visitSourceLocation(SourceLocation location) { + super.visitSourceLocation(location); + visit(location, 'line', () => location.line); + visit(location, 'column', () => location.column); + visit(location, 'offset', () => location.offset); + visit(location, 'length', () => location.length); + visit(location, 'text', () => location.text); + visit(location, 'sourceUri', () => location.sourceUri); + visit(location, 'sourceText', () => location.sourceText); + } + + visitCombinatorMirror(CombinatorMirror mirror) { + visit(mirror, 'identifiers', () => mirror.identifiers); + visit(mirror, 'isShow', () => mirror.isShow); + visit(mirror, 'isHide', () => mirror.isHide); + } + + visitLibraryDependencyMirror(LibraryDependencyMirror mirror) { + visit(mirror, 'isImport', () => mirror.isImport); + visit(mirror, 'isExport', () => mirror.isExport); + visit(mirror, 'sourceLibrary', () => mirror.sourceLibrary); + visit(mirror, 'targetLibrary', () => mirror.targetLibrary); + visit(mirror, 'prefix', () => mirror.prefix); + visit(mirror, 'combinators', () => mirror.combinators); + visit(mirror, 'location', () => mirror.location); + } + + visitCommentInstanceMirror(CommentInstanceMirror mirror) { + visitInstanceMirror(mirror); + visit(mirror, 'text', () => mirror.text); + visit(mirror, 'trimmedText', () => mirror.trimmedText); + visit(mirror, 'isDocComment', () => mirror.isDocComment); + } + + visitListInstanceMirror(ListInstanceMirror mirror) { + visitInstanceMirror(mirror); + visit(mirror, 'length', () => mirror.length); + } + + visitMapInstanceMirror(MapInstanceMirror mirror) { + visitInstanceMirror(mirror); + visit(mirror, 'keys', () => mirror.keys); + visit(mirror, 'length', () => mirror.length); + } + + visitTypeInstanceMirror(TypeInstanceMirror mirror) { + visitInstanceMirror(mirror); + visit(mirror, 'representedType', () => mirror.representedType); + } +} + +main(List arguments) { + asyncTest(() => analyzeUri(Uri.parse('dart:core')). + then((MirrorSystem mirrors) { + MirrorsReader reader = new SourceMirrorsReader(mirrors, + verbose: arguments.contains('-v'), + includeStackTrace: arguments.contains('-s')); + reader.checkMirrorSystem(mirrors); + })); +} diff --git a/tests/compiler/dart2js/mirrors/mirrors_test_helper.dart b/tests/compiler/dart2js/mirrors/mirrors_test_helper.dart index 1f57a031b7d..0aa116f492c 100644 --- a/tests/compiler/dart2js/mirrors/mirrors_test_helper.dart +++ b/tests/compiler/dart2js/mirrors/mirrors_test_helper.dart @@ -1,37 +1,37 @@ -// Copyright (c) 2013, 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. - -import 'dart:io'; -import 'dart:async'; - -import 'package:compiler/src/mirrors/source_mirrors.dart'; -import 'package:compiler/src/mirrors/analyze.dart' as source_mirrors; -import 'package:compiler/src/source_file_provider.dart'; - -TypeMirror createInstantiation(TypeSourceMirror type, - List typeArguments) { - return type.createInstantiation(typeArguments); -} - -Future analyze(String test) { - Uri repository = Platform.script.resolve('../../../../'); - Uri testUri = repository.resolve('tests/lib/mirrors/$test'); - return analyzeUri(testUri); -} - - -Future analyzeUri(Uri testUri) { - Uri repository = Platform.script.resolve('../../../../'); - Uri libraryRoot = repository.resolve('sdk/'); - Uri packageRoot = Uri.base.resolveUri( - new Uri.file('${Platform.packageRoot}/')); - var provider = new CompilerSourceFileProvider(); - var handler = new FormattingDiagnosticHandler(provider); - return source_mirrors.analyze( - [testUri], - libraryRoot, - packageRoot, - provider, - handler); +// Copyright (c) 2013, 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. + +import 'dart:io'; +import 'dart:async'; + +import 'package:compiler/src/mirrors/source_mirrors.dart'; +import 'package:compiler/src/mirrors/analyze.dart' as source_mirrors; +import 'package:compiler/src/source_file_provider.dart'; + +TypeMirror createInstantiation(TypeSourceMirror type, + List typeArguments) { + return type.createInstantiation(typeArguments); +} + +Future analyze(String test) { + Uri repository = Platform.script.resolve('../../../../'); + Uri testUri = repository.resolve('tests/lib/mirrors/$test'); + return analyzeUri(testUri); +} + + +Future analyzeUri(Uri testUri) { + Uri repository = Platform.script.resolve('../../../../'); + Uri libraryRoot = repository.resolve('sdk/'); + Uri packageRoot = Uri.base.resolveUri( + new Uri.file('${Platform.packageRoot}/')); + var provider = new CompilerSourceFileProvider(); + var handler = new FormattingDiagnosticHandler(provider); + return source_mirrors.analyze( + [testUri], + libraryRoot, + packageRoot, + provider, + handler); } \ No newline at end of file diff --git a/tests/compiler/dart2js/mirrors/relation_assignable_test.dart b/tests/compiler/dart2js/mirrors/relation_assignable_test.dart index 3f57a14cb6f..eeb61905d9d 100644 --- a/tests/compiler/dart2js/mirrors/relation_assignable_test.dart +++ b/tests/compiler/dart2js/mirrors/relation_assignable_test.dart @@ -1,17 +1,17 @@ -// Copyright (c) 2013, 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. - -import "dart:mirrors"; - -import "package:async_helper/async_helper.dart"; - -import "mirrors_test_helper.dart"; -import "../../../lib/mirrors/relation_assignable_test.dart"; - -main() { - asyncTest(() => analyze("relation_assignable_test.dart"). - then((MirrorSystem mirrors) { - test(mirrors); - })); -} +// Copyright (c) 2013, 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. + +import "dart:mirrors"; + +import "package:async_helper/async_helper.dart"; + +import "mirrors_test_helper.dart"; +import "../../../lib/mirrors/relation_assignable_test.dart"; + +main() { + asyncTest(() => analyze("relation_assignable_test.dart"). + then((MirrorSystem mirrors) { + test(mirrors); + })); +} diff --git a/tests/compiler/dart2js/mirrors/relation_subclass_test.dart b/tests/compiler/dart2js/mirrors/relation_subclass_test.dart index eaab60827f5..86503eba833 100644 --- a/tests/compiler/dart2js/mirrors/relation_subclass_test.dart +++ b/tests/compiler/dart2js/mirrors/relation_subclass_test.dart @@ -1,17 +1,17 @@ -// Copyright (c) 2013, 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. - -import "dart:mirrors"; - -import "package:async_helper/async_helper.dart"; - -import "mirrors_test_helper.dart"; -import "../../../lib/mirrors/relation_subclass_test.dart"; - -main() { - asyncTest(() => analyze("relation_subclass_test.dart"). - then((MirrorSystem mirrors) { - test(mirrors); - })); -} +// Copyright (c) 2013, 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. + +import "dart:mirrors"; + +import "package:async_helper/async_helper.dart"; + +import "mirrors_test_helper.dart"; +import "../../../lib/mirrors/relation_subclass_test.dart"; + +main() { + asyncTest(() => analyze("relation_subclass_test.dart"). + then((MirrorSystem mirrors) { + test(mirrors); + })); +} diff --git a/tests/compiler/dart2js/mirrors/relation_subtype_test.dart b/tests/compiler/dart2js/mirrors/relation_subtype_test.dart index 036af05fc1f..2fca90c20d3 100644 --- a/tests/compiler/dart2js/mirrors/relation_subtype_test.dart +++ b/tests/compiler/dart2js/mirrors/relation_subtype_test.dart @@ -1,17 +1,17 @@ -// Copyright (c) 2013, 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. - -import "dart:mirrors"; - -import "package:async_helper/async_helper.dart"; - -import "mirrors_test_helper.dart"; -import "../../../lib/mirrors/relation_subtype_test.dart"; - -main() { - asyncTest(() => analyze("relation_subtype_test.dart"). - then((MirrorSystem mirrors) { - test(mirrors); - })); -} +// Copyright (c) 2013, 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. + +import "dart:mirrors"; + +import "package:async_helper/async_helper.dart"; + +import "mirrors_test_helper.dart"; +import "../../../lib/mirrors/relation_subtype_test.dart"; + +main() { + asyncTest(() => analyze("relation_subtype_test.dart"). + then((MirrorSystem mirrors) { + test(mirrors); + })); +} diff --git a/tests/compiler/dart2js/mirrors_exports_test.dart b/tests/compiler/dart2js/mirrors_exports_test.dart index 0f0a12770e8..07b70e714e2 100644 --- a/tests/compiler/dart2js/mirrors_exports_test.dart +++ b/tests/compiler/dart2js/mirrors_exports_test.dart @@ -1,183 +1,183 @@ -// Copyright (c) 2012, 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. - -import 'package:expect/expect.dart'; -import 'package:async_helper/async_helper.dart'; -import 'dart:async'; -import 'memory_compiler.dart'; -import 'package:compiler/src/mirrors/source_mirrors.dart'; - -const SOURCE_FILES = const { -'main.dart': ''' -import 'a.dart' show A1, A2; -import 'b.dart' as b hide B1; -export 'a.dart' show A2 hide A3, A1; -export 'b.dart' hide B1, B2 show B3; -import 'dart:core' as core; -import 'c.dart' deferred as c; - -main() {} -''', -'a.dart': ''' -class A1 {} -class A2 {} -class A3 {} -''', -'b.dart': ''' -class B1 {} -class B2 {} -class B3 {} -''', -'c.dart': ''' -foo() => 499; -''' -}; - -void main() { - asyncTest(() => mirrorSystemFor(SOURCE_FILES).then((MirrorSystem mirrors) { - LibrarySourceMirror mainLibrary = - mirrors.libraries[Uri.parse('memory:main.dart')]; - Expect.isNotNull(mainLibrary); - - LibrarySourceMirror aLibrary = - mirrors.libraries[Uri.parse('memory:a.dart')]; - Expect.isNotNull(aLibrary); - - LibrarySourceMirror bLibrary = - mirrors.libraries[Uri.parse('memory:b.dart')]; - Expect.isNotNull(bLibrary); - - LibrarySourceMirror cLibrary = - mirrors.libraries[Uri.parse('memory:c.dart')]; - Expect.isNotNull(cLibrary); - - LibrarySourceMirror coreLibrary = - mirrors.libraries[Uri.parse('dart:core')]; - Expect.isNotNull(coreLibrary); - - var dependencies = mainLibrary.libraryDependencies; - Expect.isNotNull(dependencies); - Expect.equals(6, dependencies.length); - - // import 'a.dart' show A1, A2; - var dependency = dependencies[0]; - Expect.isNotNull(dependency); - Expect.isTrue(dependency.isImport); - Expect.isFalse(dependency.isExport); - Expect.equals(mainLibrary, dependency.sourceLibrary); - Expect.equals(aLibrary, dependency.targetLibrary); - Expect.isNull(dependency.prefix); - Expect.isFalse(dependency.isDeferred); - - var combinators = dependency.combinators; - Expect.isNotNull(combinators); - Expect.equals(1, combinators.length); - - var combinator = combinators[0]; - Expect.isNotNull(combinator); - Expect.isTrue(combinator.isShow); - Expect.isFalse(combinator.isHide); - Expect.listEquals(['A1', 'A2'], combinator.identifiers); - - // import 'b.dart' as b hide B1; - dependency = dependencies[1]; - Expect.isNotNull(dependency); - Expect.isTrue(dependency.isImport); - Expect.isFalse(dependency.isExport); - Expect.equals(mainLibrary, dependency.sourceLibrary); - Expect.equals(bLibrary, dependency.targetLibrary); - Expect.equals('b', dependency.prefix); - Expect.isFalse(dependency.isDeferred); - - combinators = dependency.combinators; - Expect.isNotNull(combinators); - Expect.equals(1, combinators.length); - - combinator = combinators[0]; - Expect.isNotNull(combinator); - Expect.isFalse(combinator.isShow); - Expect.isTrue(combinator.isHide); - Expect.listEquals(['B1'], combinator.identifiers); - - // export 'a.dart' show A2 hide A3, A1; - dependency = dependencies[2]; - Expect.isNotNull(dependency); - Expect.isFalse(dependency.isImport); - Expect.isTrue(dependency.isExport); - Expect.equals(mainLibrary, dependency.sourceLibrary); - Expect.equals(aLibrary, dependency.targetLibrary); - Expect.isNull(dependency.prefix); - Expect.isFalse(dependency.isDeferred); - - combinators = dependency.combinators; - Expect.isNotNull(combinators); - Expect.equals(2, combinators.length); - - combinator = combinators[0]; - Expect.isNotNull(combinator); - Expect.isTrue(combinator.isShow); - Expect.isFalse(combinator.isHide); - Expect.listEquals(['A2'], combinator.identifiers); - - combinator = combinators[1]; - Expect.isNotNull(combinator); - Expect.isFalse(combinator.isShow); - Expect.isTrue(combinator.isHide); - Expect.listEquals(['A3', 'A1'], combinator.identifiers); - - // export 'b.dart' hide B1, B2 show B3; - dependency = dependencies[3]; - Expect.isNotNull(dependency); - Expect.isFalse(dependency.isImport); - Expect.isTrue(dependency.isExport); - Expect.equals(mainLibrary, dependency.sourceLibrary); - Expect.equals(bLibrary, dependency.targetLibrary); - Expect.isNull(dependency.prefix); - Expect.isFalse(dependency.isDeferred); - - combinators = dependency.combinators; - Expect.isNotNull(combinators); - Expect.equals(2, combinators.length); - - combinator = combinators[0]; - Expect.isNotNull(combinator); - Expect.isFalse(combinator.isShow); - Expect.isTrue(combinator.isHide); - Expect.listEquals(['B1', 'B2'], combinator.identifiers); - - combinator = combinators[1]; - Expect.isNotNull(combinator); - Expect.isTrue(combinator.isShow); - Expect.isFalse(combinator.isHide); - Expect.listEquals(['B3'], combinator.identifiers); - - // import 'dart:core' as core; - dependency = dependencies[4]; - Expect.isNotNull(dependency); - Expect.isTrue(dependency.isImport); - Expect.isFalse(dependency.isExport); - Expect.equals(mainLibrary, dependency.sourceLibrary); - Expect.equals(coreLibrary, dependency.targetLibrary); - Expect.equals('core', dependency.prefix); - Expect.isFalse(dependency.isDeferred); - - combinators = dependency.combinators; - Expect.isNotNull(combinators); - Expect.equals(0, combinators.length); - - // import 'c.dart' deferred as c; - dependency = dependencies[5]; - Expect.isNotNull(dependency); - Expect.isTrue(dependency.isImport); - Expect.isFalse(dependency.isExport); - Expect.equals(mainLibrary, dependency.sourceLibrary); - Expect.equals(cLibrary, dependency.targetLibrary); - Expect.equals('c', dependency.prefix); - Expect.isTrue(dependency.isDeferred); - - combinators = dependency.combinators; - Expect.isNotNull(combinators); - Expect.equals(0, combinators.length); - })); +// Copyright (c) 2012, 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. + +import 'package:expect/expect.dart'; +import 'package:async_helper/async_helper.dart'; +import 'dart:async'; +import 'memory_compiler.dart'; +import 'package:compiler/src/mirrors/source_mirrors.dart'; + +const SOURCE_FILES = const { +'main.dart': ''' +import 'a.dart' show A1, A2; +import 'b.dart' as b hide B1; +export 'a.dart' show A2 hide A3, A1; +export 'b.dart' hide B1, B2 show B3; +import 'dart:core' as core; +import 'c.dart' deferred as c; + +main() {} +''', +'a.dart': ''' +class A1 {} +class A2 {} +class A3 {} +''', +'b.dart': ''' +class B1 {} +class B2 {} +class B3 {} +''', +'c.dart': ''' +foo() => 499; +''' +}; + +void main() { + asyncTest(() => mirrorSystemFor(SOURCE_FILES).then((MirrorSystem mirrors) { + LibrarySourceMirror mainLibrary = + mirrors.libraries[Uri.parse('memory:main.dart')]; + Expect.isNotNull(mainLibrary); + + LibrarySourceMirror aLibrary = + mirrors.libraries[Uri.parse('memory:a.dart')]; + Expect.isNotNull(aLibrary); + + LibrarySourceMirror bLibrary = + mirrors.libraries[Uri.parse('memory:b.dart')]; + Expect.isNotNull(bLibrary); + + LibrarySourceMirror cLibrary = + mirrors.libraries[Uri.parse('memory:c.dart')]; + Expect.isNotNull(cLibrary); + + LibrarySourceMirror coreLibrary = + mirrors.libraries[Uri.parse('dart:core')]; + Expect.isNotNull(coreLibrary); + + var dependencies = mainLibrary.libraryDependencies; + Expect.isNotNull(dependencies); + Expect.equals(6, dependencies.length); + + // import 'a.dart' show A1, A2; + var dependency = dependencies[0]; + Expect.isNotNull(dependency); + Expect.isTrue(dependency.isImport); + Expect.isFalse(dependency.isExport); + Expect.equals(mainLibrary, dependency.sourceLibrary); + Expect.equals(aLibrary, dependency.targetLibrary); + Expect.isNull(dependency.prefix); + Expect.isFalse(dependency.isDeferred); + + var combinators = dependency.combinators; + Expect.isNotNull(combinators); + Expect.equals(1, combinators.length); + + var combinator = combinators[0]; + Expect.isNotNull(combinator); + Expect.isTrue(combinator.isShow); + Expect.isFalse(combinator.isHide); + Expect.listEquals(['A1', 'A2'], combinator.identifiers); + + // import 'b.dart' as b hide B1; + dependency = dependencies[1]; + Expect.isNotNull(dependency); + Expect.isTrue(dependency.isImport); + Expect.isFalse(dependency.isExport); + Expect.equals(mainLibrary, dependency.sourceLibrary); + Expect.equals(bLibrary, dependency.targetLibrary); + Expect.equals('b', dependency.prefix); + Expect.isFalse(dependency.isDeferred); + + combinators = dependency.combinators; + Expect.isNotNull(combinators); + Expect.equals(1, combinators.length); + + combinator = combinators[0]; + Expect.isNotNull(combinator); + Expect.isFalse(combinator.isShow); + Expect.isTrue(combinator.isHide); + Expect.listEquals(['B1'], combinator.identifiers); + + // export 'a.dart' show A2 hide A3, A1; + dependency = dependencies[2]; + Expect.isNotNull(dependency); + Expect.isFalse(dependency.isImport); + Expect.isTrue(dependency.isExport); + Expect.equals(mainLibrary, dependency.sourceLibrary); + Expect.equals(aLibrary, dependency.targetLibrary); + Expect.isNull(dependency.prefix); + Expect.isFalse(dependency.isDeferred); + + combinators = dependency.combinators; + Expect.isNotNull(combinators); + Expect.equals(2, combinators.length); + + combinator = combinators[0]; + Expect.isNotNull(combinator); + Expect.isTrue(combinator.isShow); + Expect.isFalse(combinator.isHide); + Expect.listEquals(['A2'], combinator.identifiers); + + combinator = combinators[1]; + Expect.isNotNull(combinator); + Expect.isFalse(combinator.isShow); + Expect.isTrue(combinator.isHide); + Expect.listEquals(['A3', 'A1'], combinator.identifiers); + + // export 'b.dart' hide B1, B2 show B3; + dependency = dependencies[3]; + Expect.isNotNull(dependency); + Expect.isFalse(dependency.isImport); + Expect.isTrue(dependency.isExport); + Expect.equals(mainLibrary, dependency.sourceLibrary); + Expect.equals(bLibrary, dependency.targetLibrary); + Expect.isNull(dependency.prefix); + Expect.isFalse(dependency.isDeferred); + + combinators = dependency.combinators; + Expect.isNotNull(combinators); + Expect.equals(2, combinators.length); + + combinator = combinators[0]; + Expect.isNotNull(combinator); + Expect.isFalse(combinator.isShow); + Expect.isTrue(combinator.isHide); + Expect.listEquals(['B1', 'B2'], combinator.identifiers); + + combinator = combinators[1]; + Expect.isNotNull(combinator); + Expect.isTrue(combinator.isShow); + Expect.isFalse(combinator.isHide); + Expect.listEquals(['B3'], combinator.identifiers); + + // import 'dart:core' as core; + dependency = dependencies[4]; + Expect.isNotNull(dependency); + Expect.isTrue(dependency.isImport); + Expect.isFalse(dependency.isExport); + Expect.equals(mainLibrary, dependency.sourceLibrary); + Expect.equals(coreLibrary, dependency.targetLibrary); + Expect.equals('core', dependency.prefix); + Expect.isFalse(dependency.isDeferred); + + combinators = dependency.combinators; + Expect.isNotNull(combinators); + Expect.equals(0, combinators.length); + + // import 'c.dart' deferred as c; + dependency = dependencies[5]; + Expect.isNotNull(dependency); + Expect.isTrue(dependency.isImport); + Expect.isFalse(dependency.isExport); + Expect.equals(mainLibrary, dependency.sourceLibrary); + Expect.equals(cLibrary, dependency.targetLibrary); + Expect.equals('c', dependency.prefix); + Expect.isTrue(dependency.isDeferred); + + combinators = dependency.combinators; + Expect.isNotNull(combinators); + Expect.equals(0, combinators.length); + })); } \ No newline at end of file diff --git a/tests/compiler/dart2js/mirrors_mixin_test.dart b/tests/compiler/dart2js/mirrors_mixin_test.dart index 0a94a06d6cf..d5ab8211baf 100644 --- a/tests/compiler/dart2js/mirrors_mixin_test.dart +++ b/tests/compiler/dart2js/mirrors_mixin_test.dart @@ -1,240 +1,240 @@ -// Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file -// for details. All rights reserved. Use of this source code is governed by a -// BSD-style license that can be found in the LICENSE file. - -library mirrors_mixin_test; - -import 'package:expect/expect.dart'; -import 'package:async_helper/async_helper.dart'; -import 'mirror_system_helper.dart'; - -const String CLASS_SOURCE = ''' -class A {} - -class S {} -class M1 {} -class M2 {} - -class C extends S with M1 {} -class D extends S with M1, M2 {} -class E extends S with M2, M1 implements A, M1 {} -class E2 extends E {} - -class F = S with M1; -abstract class G = S with M1, M2; -class H = S with M2, M1 implements A, M1; -class H2 extends H {} -'''; - -void main() { - asyncTest(() => createMirrorSystem(CLASS_SOURCE).then((MirrorSystem mirrors) { - LibraryMirror library = mirrors.libraries[SOURCE_URI]; - - checkSimpleClass(var cls) { - Expect.isNotNull(cls); - Expect.isTrue(cls is ClassMirror); - Expect.isFalse(isMixinApplication(cls)); - Expect.isFalse(cls.isNameSynthetic); - Expect.isFalse(isObject(cls)); - Expect.isTrue(isObject(cls.superclass)); - Expect.equals(0, cls.superinterfaces.length); - - Expect.isTrue(isObject(getSuperclass(cls))); - Expect.isTrue(getAppliedMixins(cls).isEmpty); - Expect.isTrue(getExplicitInterfaces(cls).isEmpty); - } - - // class A {} - var A = library.declarations[#A]; - checkSimpleClass(A); - - // class S {} - var S = library.declarations[#S]; - checkSimpleClass(S); - - // class M1 {} - var M1 = library.declarations[#M1]; - checkSimpleClass(M1); - - // class M2 {} - var M2 = library.declarations[#M2]; - checkSimpleClass(M2); - - // class C extends S with M1 {} - var C = library.declarations[#C]; - Expect.isNotNull(C); - Expect.isTrue(C is ClassMirror); - Expect.isFalse(isMixinApplication(C)); - Expect.isFalse(isObject(C)); - Expect.equals(0, C.superinterfaces.length); - var C_super = C.superclass; - Expect.isNotNull(C_super); - Expect.isTrue(C_super is ClassMirror); - Expect.isTrue(isMixinApplication(C_super)); - Expect.isTrue(C_super.isNameSynthetic); - Expect.equals(1, C_super.superinterfaces.length); - Expect.isTrue(containsType(M1, [A], C_super.superinterfaces)); - Expect.isTrue(isInstance(M1, [A], C_super.mixin)); - Expect.isFalse(isObject(C_super)); - Expect.isTrue(isSameDeclaration(S, C_super.superclass)); - - Expect.isTrue(isSameDeclaration(S, getSuperclass(C))); - Expect.isTrue(isSameDeclarationList([M1], getAppliedMixins(C))); - Expect.isTrue(getExplicitInterfaces(C).isEmpty); - - // D extends S with M1, M2 {} - var D = library.declarations[#D]; - Expect.isNotNull(D); - Expect.isTrue(D is ClassMirror); - Expect.isFalse(isMixinApplication(D)); - Expect.isFalse(isObject(D)); - Expect.equals(0, D.superinterfaces.length); - var D_super = D.superclass; - Expect.isNotNull(D_super); - Expect.isTrue(D_super is ClassMirror); - Expect.isTrue(isMixinApplication(D_super)); - Expect.isTrue(D_super.isNameSynthetic); - Expect.equals(1, D_super.superinterfaces.length); - Expect.isTrue(containsDeclaration(M2, D_super.superinterfaces)); - Expect.isTrue(isSameDeclaration(M2, D_super.mixin)); - Expect.isFalse(isObject(D_super)); - Expect.isFalse(isSameDeclaration(S, D_super.superclass)); - var D_super_super = D_super.superclass; - Expect.isNotNull(D_super_super); - Expect.isTrue(D_super_super is ClassMirror); - Expect.isTrue(isMixinApplication(D_super_super)); - Expect.isTrue(D_super_super.isNameSynthetic); - Expect.equals(1, D_super_super.superinterfaces.length); - Expect.isTrue(containsDeclaration(M1, D_super_super.superinterfaces)); - Expect.isTrue(isSameDeclaration(M1, D_super_super.mixin)); - Expect.isFalse(isObject(D_super_super)); - Expect.isTrue(isSameDeclaration(S, D_super_super.superclass)); - - Expect.isTrue(isSameDeclaration(S, getSuperclass(D))); - Expect.isTrue(isSameDeclarationList([M1, M2], getAppliedMixins(D))); - Expect.isTrue(getExplicitInterfaces(D).isEmpty); - - // class E extends S with M2, M1 implements A, M1 {} - var E = library.declarations[#E]; - Expect.isNotNull(E); - Expect.isTrue(E is ClassMirror); - Expect.isFalse(isMixinApplication(E)); - Expect.isFalse(isObject(E)); - Expect.equals(2, E.superinterfaces.length); - Expect.isTrue(containsDeclaration(A, E.superinterfaces)); - Expect.isTrue(containsDeclaration(M1, E.superinterfaces)); - var E_super = E.superclass; - Expect.isNotNull(E_super); - Expect.isTrue(E_super is ClassMirror); - Expect.isTrue(isMixinApplication(E_super)); - Expect.isTrue(E_super.isNameSynthetic); - Expect.equals(1, E_super.superinterfaces.length); - Expect.isTrue(containsDeclaration(M1, E_super.superinterfaces)); - Expect.isTrue(isSameDeclaration(M1, E_super.mixin)); - Expect.isFalse(isObject(E_super)); - Expect.isFalse(isSameDeclaration(S, E_super.superclass)); - var E_super_super = E_super.superclass; - Expect.isNotNull(E_super_super); - Expect.isTrue(E_super_super is ClassMirror); - Expect.isTrue(isMixinApplication(E_super_super)); - Expect.isTrue(E_super_super.isNameSynthetic); - Expect.equals(1, E_super_super.superinterfaces.length); - Expect.isTrue(containsDeclaration(M2, E_super_super.superinterfaces)); - Expect.isTrue(isSameDeclaration(M2, E_super_super.mixin)); - Expect.isFalse(isObject(E_super_super)); - Expect.isTrue(isSameDeclaration(S, E_super_super.superclass)); - - Expect.isTrue(isSameDeclaration(S, getSuperclass(E))); - Expect.isTrue(isSameDeclarationList([M2, M1], getAppliedMixins(E))); - Expect.isTrue(isSameDeclarationSet([A, M1], getExplicitInterfaces(E))); - - // class E2 extends E {} - var E2 = library.declarations[#E2]; - Expect.isTrue(isSameDeclaration(E, getSuperclass(E2))); - Expect.isTrue(getAppliedMixins(E2).isEmpty); - Expect.isTrue(getExplicitInterfaces(E2).isEmpty); - - // class F = S with M1; - var F = library.declarations[#F]; - Expect.isNotNull(F); - Expect.isTrue(F is ClassMirror); - Expect.isFalse(F.isAbstract); - Expect.isTrue(isMixinApplication(F)); - Expect.isFalse(F.isNameSynthetic); - Expect.equals(#F, F.simpleName); - Expect.isFalse(isObject(F)); - Expect.equals(1, F.superinterfaces.length); - Expect.isTrue(containsDeclaration(M1, F.superinterfaces)); - Expect.isTrue(isInstance(M1, [A], F.mixin)); - var F_super = F.superclass; - Expect.isNotNull(F_super); - Expect.isTrue(F_super is ClassMirror); - Expect.isFalse(isMixinApplication(F_super)); - Expect.isFalse(isObject(F_super)); - Expect.isTrue(isSameDeclaration(S, F_super)); - - Expect.isTrue(isSameDeclaration(S, getSuperclass(F))); - Expect.isTrue(isSameDeclarationList([M1], getAppliedMixins(F))); - Expect.isTrue(getExplicitInterfaces(F).isEmpty); - - // typedef G = abstract S with M1, M2; - var G = library.declarations[#G]; - Expect.isNotNull(G); - Expect.isTrue(G is ClassMirror); - Expect.isTrue(G.isAbstract); - Expect.isTrue(isMixinApplication(G)); - Expect.isFalse(G.isNameSynthetic); - Expect.equals(#G, G.simpleName); - Expect.isFalse(isObject(G)); - Expect.equals(1, G.superinterfaces.length); - Expect.isTrue(containsDeclaration(M2, G.superinterfaces)); - Expect.isTrue(isSameDeclaration(M2, G.mixin)); - var G_super = G.superclass; - Expect.isNotNull(G_super); - Expect.isTrue(G_super is ClassMirror); - Expect.isTrue(isMixinApplication(G_super)); - Expect.equals(1, G_super.superinterfaces.length); - Expect.isTrue(containsDeclaration(M1, G_super.superinterfaces)); - Expect.isTrue(isSameDeclaration(M1, G_super.mixin)); - Expect.isFalse(isObject(G_super)); - Expect.isTrue(isSameDeclaration(S, G_super.superclass)); - - Expect.isTrue(isSameDeclaration(S, getSuperclass(G))); - Expect.isTrue(isSameDeclarationList([M1, M2], getAppliedMixins(G))); - Expect.isTrue(getExplicitInterfaces(G).isEmpty); - - // typedef H = S with M2, M1 implements A, M1; - var H = library.declarations[#H]; - Expect.isNotNull(H); - Expect.isTrue(H is ClassMirror); - Expect.isFalse(H.isAbstract); - Expect.isTrue(isMixinApplication(H)); - Expect.isFalse(H.isNameSynthetic); - Expect.equals(#H, H.simpleName); - Expect.isFalse(isObject(H)); - Expect.equals(3, H.superinterfaces.length); - Expect.isTrue(containsDeclaration(A, H.superinterfaces)); - Expect.isTrue(containsDeclaration(M1, H.superinterfaces)); - Expect.isFalse(containsDeclaration(M2, H.superinterfaces)); - Expect.isTrue(isSameDeclaration(M1, H.mixin)); - var H_super = H.superclass; - Expect.isNotNull(H_super); - Expect.isTrue(H_super is ClassMirror); - Expect.isTrue(isMixinApplication(H_super)); - Expect.equals(1, H_super.superinterfaces.length); - Expect.isTrue(containsDeclaration(M2, H_super.superinterfaces)); - Expect.isTrue(isSameDeclaration(M2, H_super.mixin)); - Expect.isFalse(isObject(H_super)); - Expect.isTrue(isSameDeclaration(S, H_super.superclass)); - - Expect.isTrue(isSameDeclaration(S, getSuperclass(H))); - Expect.isTrue(isSameDeclarationList([M2, M1], getAppliedMixins(H))); - Expect.isTrue(isSameDeclarationSet([A, M1], getExplicitInterfaces(H))); - - // class H2 extends H {} - var H2 = library.declarations[#H2]; - Expect.isTrue(isSameDeclaration(H, getSuperclass(H2))); - Expect.isTrue(getAppliedMixins(H2).isEmpty); - Expect.isTrue(getExplicitInterfaces(H2).isEmpty); - })); +// Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +library mirrors_mixin_test; + +import 'package:expect/expect.dart'; +import 'package:async_helper/async_helper.dart'; +import 'mirror_system_helper.dart'; + +const String CLASS_SOURCE = ''' +class A {} + +class S {} +class M1 {} +class M2 {} + +class C extends S with M1 {} +class D extends S with M1, M2 {} +class E extends S with M2, M1 implements A, M1 {} +class E2 extends E {} + +class F = S with M1; +abstract class G = S with M1, M2; +class H = S with M2, M1 implements A, M1; +class H2 extends H {} +'''; + +void main() { + asyncTest(() => createMirrorSystem(CLASS_SOURCE).then((MirrorSystem mirrors) { + LibraryMirror library = mirrors.libraries[SOURCE_URI]; + + checkSimpleClass(var cls) { + Expect.isNotNull(cls); + Expect.isTrue(cls is ClassMirror); + Expect.isFalse(isMixinApplication(cls)); + Expect.isFalse(cls.isNameSynthetic); + Expect.isFalse(isObject(cls)); + Expect.isTrue(isObject(cls.superclass)); + Expect.equals(0, cls.superinterfaces.length); + + Expect.isTrue(isObject(getSuperclass(cls))); + Expect.isTrue(getAppliedMixins(cls).isEmpty); + Expect.isTrue(getExplicitInterfaces(cls).isEmpty); + } + + // class A {} + var A = library.declarations[#A]; + checkSimpleClass(A); + + // class S {} + var S = library.declarations[#S]; + checkSimpleClass(S); + + // class M1 {} + var M1 = library.declarations[#M1]; + checkSimpleClass(M1); + + // class M2 {} + var M2 = library.declarations[#M2]; + checkSimpleClass(M2); + + // class C extends S with M1 {} + var C = library.declarations[#C]; + Expect.isNotNull(C); + Expect.isTrue(C is ClassMirror); + Expect.isFalse(isMixinApplication(C)); + Expect.isFalse(isObject(C)); + Expect.equals(0, C.superinterfaces.length); + var C_super = C.superclass; + Expect.isNotNull(C_super); + Expect.isTrue(C_super is ClassMirror); + Expect.isTrue(isMixinApplication(C_super)); + Expect.isTrue(C_super.isNameSynthetic); + Expect.equals(1, C_super.superinterfaces.length); + Expect.isTrue(containsType(M1, [A], C_super.superinterfaces)); + Expect.isTrue(isInstance(M1, [A], C_super.mixin)); + Expect.isFalse(isObject(C_super)); + Expect.isTrue(isSameDeclaration(S, C_super.superclass)); + + Expect.isTrue(isSameDeclaration(S, getSuperclass(C))); + Expect.isTrue(isSameDeclarationList([M1], getAppliedMixins(C))); + Expect.isTrue(getExplicitInterfaces(C).isEmpty); + + // D extends S with M1, M2 {} + var D = library.declarations[#D]; + Expect.isNotNull(D); + Expect.isTrue(D is ClassMirror); + Expect.isFalse(isMixinApplication(D)); + Expect.isFalse(isObject(D)); + Expect.equals(0, D.superinterfaces.length); + var D_super = D.superclass; + Expect.isNotNull(D_super); + Expect.isTrue(D_super is ClassMirror); + Expect.isTrue(isMixinApplication(D_super)); + Expect.isTrue(D_super.isNameSynthetic); + Expect.equals(1, D_super.superinterfaces.length); + Expect.isTrue(containsDeclaration(M2, D_super.superinterfaces)); + Expect.isTrue(isSameDeclaration(M2, D_super.mixin)); + Expect.isFalse(isObject(D_super)); + Expect.isFalse(isSameDeclaration(S, D_super.superclass)); + var D_super_super = D_super.superclass; + Expect.isNotNull(D_super_super); + Expect.isTrue(D_super_super is ClassMirror); + Expect.isTrue(isMixinApplication(D_super_super)); + Expect.isTrue(D_super_super.isNameSynthetic); + Expect.equals(1, D_super_super.superinterfaces.length); + Expect.isTrue(containsDeclaration(M1, D_super_super.superinterfaces)); + Expect.isTrue(isSameDeclaration(M1, D_super_super.mixin)); + Expect.isFalse(isObject(D_super_super)); + Expect.isTrue(isSameDeclaration(S, D_super_super.superclass)); + + Expect.isTrue(isSameDeclaration(S, getSuperclass(D))); + Expect.isTrue(isSameDeclarationList([M1, M2], getAppliedMixins(D))); + Expect.isTrue(getExplicitInterfaces(D).isEmpty); + + // class E extends S with M2, M1 implements A, M1 {} + var E = library.declarations[#E]; + Expect.isNotNull(E); + Expect.isTrue(E is ClassMirror); + Expect.isFalse(isMixinApplication(E)); + Expect.isFalse(isObject(E)); + Expect.equals(2, E.superinterfaces.length); + Expect.isTrue(containsDeclaration(A, E.superinterfaces)); + Expect.isTrue(containsDeclaration(M1, E.superinterfaces)); + var E_super = E.superclass; + Expect.isNotNull(E_super); + Expect.isTrue(E_super is ClassMirror); + Expect.isTrue(isMixinApplication(E_super)); + Expect.isTrue(E_super.isNameSynthetic); + Expect.equals(1, E_super.superinterfaces.length); + Expect.isTrue(containsDeclaration(M1, E_super.superinterfaces)); + Expect.isTrue(isSameDeclaration(M1, E_super.mixin)); + Expect.isFalse(isObject(E_super)); + Expect.isFalse(isSameDeclaration(S, E_super.superclass)); + var E_super_super = E_super.superclass; + Expect.isNotNull(E_super_super); + Expect.isTrue(E_super_super is ClassMirror); + Expect.isTrue(isMixinApplication(E_super_super)); + Expect.isTrue(E_super_super.isNameSynthetic); + Expect.equals(1, E_super_super.superinterfaces.length); + Expect.isTrue(containsDeclaration(M2, E_super_super.superinterfaces)); + Expect.isTrue(isSameDeclaration(M2, E_super_super.mixin)); + Expect.isFalse(isObject(E_super_super)); + Expect.isTrue(isSameDeclaration(S, E_super_super.superclass)); + + Expect.isTrue(isSameDeclaration(S, getSuperclass(E))); + Expect.isTrue(isSameDeclarationList([M2, M1], getAppliedMixins(E))); + Expect.isTrue(isSameDeclarationSet([A, M1], getExplicitInterfaces(E))); + + // class E2 extends E {} + var E2 = library.declarations[#E2]; + Expect.isTrue(isSameDeclaration(E, getSuperclass(E2))); + Expect.isTrue(getAppliedMixins(E2).isEmpty); + Expect.isTrue(getExplicitInterfaces(E2).isEmpty); + + // class F = S with M1; + var F = library.declarations[#F]; + Expect.isNotNull(F); + Expect.isTrue(F is ClassMirror); + Expect.isFalse(F.isAbstract); + Expect.isTrue(isMixinApplication(F)); + Expect.isFalse(F.isNameSynthetic); + Expect.equals(#F, F.simpleName); + Expect.isFalse(isObject(F)); + Expect.equals(1, F.superinterfaces.length); + Expect.isTrue(containsDeclaration(M1, F.superinterfaces)); + Expect.isTrue(isInstance(M1, [A], F.mixin)); + var F_super = F.superclass; + Expect.isNotNull(F_super); + Expect.isTrue(F_super is ClassMirror); + Expect.isFalse(isMixinApplication(F_super)); + Expect.isFalse(isObject(F_super)); + Expect.isTrue(isSameDeclaration(S, F_super)); + + Expect.isTrue(isSameDeclaration(S, getSuperclass(F))); + Expect.isTrue(isSameDeclarationList([M1], getAppliedMixins(F))); + Expect.isTrue(getExplicitInterfaces(F).isEmpty); + + // typedef G = abstract S with M1, M2; + var G = library.declarations[#G]; + Expect.isNotNull(G); + Expect.isTrue(G is ClassMirror); + Expect.isTrue(G.isAbstract); + Expect.isTrue(isMixinApplication(G)); + Expect.isFalse(G.isNameSynthetic); + Expect.equals(#G, G.simpleName); + Expect.isFalse(isObject(G)); + Expect.equals(1, G.superinterfaces.length); + Expect.isTrue(containsDeclaration(M2, G.superinterfaces)); + Expect.isTrue(isSameDeclaration(M2, G.mixin)); + var G_super = G.superclass; + Expect.isNotNull(G_super); + Expect.isTrue(G_super is ClassMirror); + Expect.isTrue(isMixinApplication(G_super)); + Expect.equals(1, G_super.superinterfaces.length); + Expect.isTrue(containsDeclaration(M1, G_super.superinterfaces)); + Expect.isTrue(isSameDeclaration(M1, G_super.mixin)); + Expect.isFalse(isObject(G_super)); + Expect.isTrue(isSameDeclaration(S, G_super.superclass)); + + Expect.isTrue(isSameDeclaration(S, getSuperclass(G))); + Expect.isTrue(isSameDeclarationList([M1, M2], getAppliedMixins(G))); + Expect.isTrue(getExplicitInterfaces(G).isEmpty); + + // typedef H = S with M2, M1 implements A, M1; + var H = library.declarations[#H]; + Expect.isNotNull(H); + Expect.isTrue(H is ClassMirror); + Expect.isFalse(H.isAbstract); + Expect.isTrue(isMixinApplication(H)); + Expect.isFalse(H.isNameSynthetic); + Expect.equals(#H, H.simpleName); + Expect.isFalse(isObject(H)); + Expect.equals(3, H.superinterfaces.length); + Expect.isTrue(containsDeclaration(A, H.superinterfaces)); + Expect.isTrue(containsDeclaration(M1, H.superinterfaces)); + Expect.isFalse(containsDeclaration(M2, H.superinterfaces)); + Expect.isTrue(isSameDeclaration(M1, H.mixin)); + var H_super = H.superclass; + Expect.isNotNull(H_super); + Expect.isTrue(H_super is ClassMirror); + Expect.isTrue(isMixinApplication(H_super)); + Expect.equals(1, H_super.superinterfaces.length); + Expect.isTrue(containsDeclaration(M2, H_super.superinterfaces)); + Expect.isTrue(isSameDeclaration(M2, H_super.mixin)); + Expect.isFalse(isObject(H_super)); + Expect.isTrue(isSameDeclaration(S, H_super.superclass)); + + Expect.isTrue(isSameDeclaration(S, getSuperclass(H))); + Expect.isTrue(isSameDeclarationList([M2, M1], getAppliedMixins(H))); + Expect.isTrue(isSameDeclarationSet([A, M1], getExplicitInterfaces(H))); + + // class H2 extends H {} + var H2 = library.declarations[#H2]; + Expect.isTrue(isSameDeclaration(H, getSuperclass(H2))); + Expect.isTrue(getAppliedMixins(H2).isEmpty); + Expect.isTrue(getExplicitInterfaces(H2).isEmpty); + })); } \ No newline at end of file diff --git a/tests/compiler/dart2js/mixin_language_test.dart b/tests/compiler/dart2js/mixin_language_test.dart index f4be3b20117..11f708b810a 100644 --- a/tests/compiler/dart2js/mixin_language_test.dart +++ b/tests/compiler/dart2js/mixin_language_test.dart @@ -1,21 +1,21 @@ -// Copyright (c) 2013, 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. - -// Test that dart2js produces the expected static type warnings for these -// language tests. This ensures that the analyzer and dart2js agrees on the -// tests. - -import 'warnings_checker.dart'; - -/// Map from test files to a map of their expected status. If the status map is -/// `null` no warnings must be missing or unexpected, otherwise the status map -/// can contain a list of line numbers for keys 'missing' and 'unexpected' for -/// the warnings of each category. -const Map TESTS = const { - 'language/typevariable_substitution2_test.dart': null, -}; - -void main(List arguments) { - checkWarnings(TESTS, arguments); -} +// Copyright (c) 2013, 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. + +// Test that dart2js produces the expected static type warnings for these +// language tests. This ensures that the analyzer and dart2js agrees on the +// tests. + +import 'warnings_checker.dart'; + +/// Map from test files to a map of their expected status. If the status map is +/// `null` no warnings must be missing or unexpected, otherwise the status map +/// can contain a list of line numbers for keys 'missing' and 'unexpected' for +/// the warnings of each category. +const Map TESTS = const { + 'language/typevariable_substitution2_test.dart': null, +}; + +void main(List arguments) { + checkWarnings(TESTS, arguments); +} diff --git a/tests/compiler/dart2js/mixin_typevariable_test.dart b/tests/compiler/dart2js/mixin_typevariable_test.dart index 0553589c21d..27fe4bbe568 100644 --- a/tests/compiler/dart2js/mixin_typevariable_test.dart +++ b/tests/compiler/dart2js/mixin_typevariable_test.dart @@ -1,158 +1,158 @@ -// Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file -// for details. All rights reserved. Use of this source code is governed by a -// BSD-style license that can be found in the LICENSE file. - -library mixin_typevariable_test; - -import 'package:expect/expect.dart'; -import "package:async_helper/async_helper.dart"; -import 'type_test_helper.dart'; -import 'package:compiler/src/dart_types.dart'; -import "package:compiler/src/elements/elements.dart" - show Element, ClassElement; - -void main() { - testMixinSupertypes(); - testNonTrivialSubstitutions(); -} - -void testMixinSupertypes() { - asyncTest(() => TypeEnvironment.create(r""" - class S {} - class M1 {} - class M2 {} - class M3 {} - - class C1 extends S with M1, M2, M3 {} - class C2 = S with M1, M2, M3; - """, expectNoWarningsOrErrors: true).then((env) { - - ClassElement Object = env.getElement('Object'); - ClassElement S = env.getElement('S'); - ClassElement M1 = env.getElement('M1'); - ClassElement M2 = env.getElement('M2'); - ClassElement M3 = env.getElement('M3'); - ClassElement C1 = env.getElement('C1'); - ClassElement C2 = env.getElement('C2'); - - ClassElement C1_S_M1_M2_M3 = C1.superclass; - ClassElement C1_S_M1_M2 = C1_S_M1_M2_M3.superclass; - ClassElement C1_S_M1 = C1_S_M1_M2.superclass; - - ClassElement C2_S_M1_M2 = C2.superclass; - ClassElement C2_S_M1 = C2_S_M1_M2.superclass; - - void testSupertypes(ClassElement element) { - if (element != Object) { - Expect.isTrue(element.typeVariables.length == 1); - Expect.equals(element, - element.typeVariables.first.element.enclosingElement); - } - for (InterfaceType supertype in element.allSupertypesAndSelf.types) { - if (!supertype.typeArguments.isEmpty) { - Expect.listEquals(element.typeVariables, supertype.typeArguments, - "Type argument mismatch on supertype $supertype of $element."); - } else { - Expect.equals(Object, supertype.element); - } - } - } - - testSupertypes(Object); - testSupertypes(S); - testSupertypes(M1); - testSupertypes(M2); - testSupertypes(C1_S_M1); - testSupertypes(C1_S_M1_M2); - testSupertypes(C1_S_M1_M2_M3); - testSupertypes(C1); - testSupertypes(C2_S_M1); - testSupertypes(C2_S_M1_M2); - testSupertypes(C2); - })); -} - -void testNonTrivialSubstitutions() { - asyncTest(() => TypeEnvironment.create(r""" - class _ {} - class A {} - class B {} - - class C1 extends A with B {} - class C2 = A with B; - - class D1 extends A with B> {} - class D2 = A with B>; - - class E1 extends A<_> with B<_, A<_>> {} - class E2 = A<_> with B<_, A<_>>; - - class F1 extends A<_> with B<_, B> {} - class F2 = A<_> with B<_, B>; - """, expectNoWarningsOrErrors: true).then((env) { - DartType _dynamic = env['dynamic']; - DartType _ = env['_']; - - ClassElement Object = env.getElement('Object'); - ClassElement A = env.getElement('A'); - ClassElement B = env.getElement('B'); - ClassElement C1 = env.getElement('C1'); - ClassElement C2 = env.getElement('C2'); - ClassElement D1 = env.getElement('D1'); - ClassElement D2 = env.getElement('D2'); - ClassElement E1 = env.getElement('E1'); - ClassElement E2 = env.getElement('E2'); - ClassElement F1 = env.getElement('F1'); - ClassElement F2 = env.getElement('F2'); - - ClassElement C1_A_B = C1.superclass; - ClassElement D1_A_B = D1.superclass; - ClassElement E1_A_B = E1.superclass; - ClassElement F1_A_B = F1.superclass; - - void testSupertypes(ClassElement element, - Map> typeArguments) { - if (element != Object) { - Expect.isTrue(element.typeVariables.length == 1); - Expect.equals(element, - element.typeVariables.first.element.enclosingElement); - } - for (InterfaceType supertype in element.allSupertypesAndSelf.types) { - if (typeArguments.containsKey(supertype.element)) { - Expect.listEquals(typeArguments[supertype.element], - supertype.typeArguments, - "Type argument mismatch on supertype $supertype of $element."); - } else if (!supertype.typeArguments.isEmpty) { - Expect.listEquals(element.typeVariables, supertype.typeArguments, - "Type argument mismatch on supertype $supertype of $element."); - } else { - Expect.equals(Object, supertype.element); - } - } - } - - testSupertypes(C1, {A: [_dynamic], B: [_dynamic, _dynamic]}); - testSupertypes(C1.superclass, {A: [_dynamic], B: [_dynamic, _dynamic]}); - testSupertypes(C2, {A: [_dynamic], B: [_dynamic, _dynamic]}); - - DartType D1_T = D1.typeVariables.first; - testSupertypes(D1, {A: [D1_T], B: [D1_T, instantiate(A, [D1_T])]}); - DartType D1_superclass_T = D1.superclass.typeVariables.first; - testSupertypes(D1.superclass, - {A: [D1_superclass_T], - B: [D1_superclass_T, instantiate(A, [D1_superclass_T])]}); - DartType D2_T = D2.typeVariables.first; - testSupertypes(D2, {A: [D2_T], B: [D2_T, instantiate(A, [D2_T])]}); - - testSupertypes(E1, {A: [_], B: [_, instantiate(A, [_])]}); - testSupertypes(E1.superclass, {A: [_], B: [_, instantiate(A, [_])]}); - testSupertypes(E2, {A: [_], B: [_, instantiate(A, [_])]}); - - DartType F1_T = F1.typeVariables.first; - testSupertypes(F1, {A: [_], B: [_, instantiate(B, [F1_T, _])]}); - DartType F1_superclass_T = F1.superclass.typeVariables.first; - testSupertypes(F1.superclass, {A: [_], B: [_, instantiate(B, [F1_superclass_T, _])]}); - DartType F2_T = F2.typeVariables.first; - testSupertypes(F2, {A: [_], B: [_, instantiate(B, [F2_T, _])]}); - })); -} +// Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +library mixin_typevariable_test; + +import 'package:expect/expect.dart'; +import "package:async_helper/async_helper.dart"; +import 'type_test_helper.dart'; +import 'package:compiler/src/dart_types.dart'; +import "package:compiler/src/elements/elements.dart" + show Element, ClassElement; + +void main() { + testMixinSupertypes(); + testNonTrivialSubstitutions(); +} + +void testMixinSupertypes() { + asyncTest(() => TypeEnvironment.create(r""" + class S {} + class M1 {} + class M2 {} + class M3 {} + + class C1 extends S with M1, M2, M3 {} + class C2 = S with M1, M2, M3; + """, expectNoWarningsOrErrors: true).then((env) { + + ClassElement Object = env.getElement('Object'); + ClassElement S = env.getElement('S'); + ClassElement M1 = env.getElement('M1'); + ClassElement M2 = env.getElement('M2'); + ClassElement M3 = env.getElement('M3'); + ClassElement C1 = env.getElement('C1'); + ClassElement C2 = env.getElement('C2'); + + ClassElement C1_S_M1_M2_M3 = C1.superclass; + ClassElement C1_S_M1_M2 = C1_S_M1_M2_M3.superclass; + ClassElement C1_S_M1 = C1_S_M1_M2.superclass; + + ClassElement C2_S_M1_M2 = C2.superclass; + ClassElement C2_S_M1 = C2_S_M1_M2.superclass; + + void testSupertypes(ClassElement element) { + if (element != Object) { + Expect.isTrue(element.typeVariables.length == 1); + Expect.equals(element, + element.typeVariables.first.element.enclosingElement); + } + for (InterfaceType supertype in element.allSupertypesAndSelf.types) { + if (!supertype.typeArguments.isEmpty) { + Expect.listEquals(element.typeVariables, supertype.typeArguments, + "Type argument mismatch on supertype $supertype of $element."); + } else { + Expect.equals(Object, supertype.element); + } + } + } + + testSupertypes(Object); + testSupertypes(S); + testSupertypes(M1); + testSupertypes(M2); + testSupertypes(C1_S_M1); + testSupertypes(C1_S_M1_M2); + testSupertypes(C1_S_M1_M2_M3); + testSupertypes(C1); + testSupertypes(C2_S_M1); + testSupertypes(C2_S_M1_M2); + testSupertypes(C2); + })); +} + +void testNonTrivialSubstitutions() { + asyncTest(() => TypeEnvironment.create(r""" + class _ {} + class A {} + class B {} + + class C1 extends A with B {} + class C2 = A with B; + + class D1 extends A with B> {} + class D2 = A with B>; + + class E1 extends A<_> with B<_, A<_>> {} + class E2 = A<_> with B<_, A<_>>; + + class F1 extends A<_> with B<_, B> {} + class F2 = A<_> with B<_, B>; + """, expectNoWarningsOrErrors: true).then((env) { + DartType _dynamic = env['dynamic']; + DartType _ = env['_']; + + ClassElement Object = env.getElement('Object'); + ClassElement A = env.getElement('A'); + ClassElement B = env.getElement('B'); + ClassElement C1 = env.getElement('C1'); + ClassElement C2 = env.getElement('C2'); + ClassElement D1 = env.getElement('D1'); + ClassElement D2 = env.getElement('D2'); + ClassElement E1 = env.getElement('E1'); + ClassElement E2 = env.getElement('E2'); + ClassElement F1 = env.getElement('F1'); + ClassElement F2 = env.getElement('F2'); + + ClassElement C1_A_B = C1.superclass; + ClassElement D1_A_B = D1.superclass; + ClassElement E1_A_B = E1.superclass; + ClassElement F1_A_B = F1.superclass; + + void testSupertypes(ClassElement element, + Map> typeArguments) { + if (element != Object) { + Expect.isTrue(element.typeVariables.length == 1); + Expect.equals(element, + element.typeVariables.first.element.enclosingElement); + } + for (InterfaceType supertype in element.allSupertypesAndSelf.types) { + if (typeArguments.containsKey(supertype.element)) { + Expect.listEquals(typeArguments[supertype.element], + supertype.typeArguments, + "Type argument mismatch on supertype $supertype of $element."); + } else if (!supertype.typeArguments.isEmpty) { + Expect.listEquals(element.typeVariables, supertype.typeArguments, + "Type argument mismatch on supertype $supertype of $element."); + } else { + Expect.equals(Object, supertype.element); + } + } + } + + testSupertypes(C1, {A: [_dynamic], B: [_dynamic, _dynamic]}); + testSupertypes(C1.superclass, {A: [_dynamic], B: [_dynamic, _dynamic]}); + testSupertypes(C2, {A: [_dynamic], B: [_dynamic, _dynamic]}); + + DartType D1_T = D1.typeVariables.first; + testSupertypes(D1, {A: [D1_T], B: [D1_T, instantiate(A, [D1_T])]}); + DartType D1_superclass_T = D1.superclass.typeVariables.first; + testSupertypes(D1.superclass, + {A: [D1_superclass_T], + B: [D1_superclass_T, instantiate(A, [D1_superclass_T])]}); + DartType D2_T = D2.typeVariables.first; + testSupertypes(D2, {A: [D2_T], B: [D2_T, instantiate(A, [D2_T])]}); + + testSupertypes(E1, {A: [_], B: [_, instantiate(A, [_])]}); + testSupertypes(E1.superclass, {A: [_], B: [_, instantiate(A, [_])]}); + testSupertypes(E2, {A: [_], B: [_, instantiate(A, [_])]}); + + DartType F1_T = F1.typeVariables.first; + testSupertypes(F1, {A: [_], B: [_, instantiate(B, [F1_T, _])]}); + DartType F1_superclass_T = F1.superclass.typeVariables.first; + testSupertypes(F1.superclass, {A: [_], B: [_, instantiate(B, [F1_superclass_T, _])]}); + DartType F2_T = F2.typeVariables.first; + testSupertypes(F2, {A: [_], B: [_, instantiate(B, [F2_T, _])]}); + })); +} diff --git a/tests/compiler/dart2js/override_inheritance_test.dart b/tests/compiler/dart2js/override_inheritance_test.dart index 14071561a28..0e247855d31 100644 --- a/tests/compiler/dart2js/override_inheritance_test.dart +++ b/tests/compiler/dart2js/override_inheritance_test.dart @@ -1,1546 +1,1546 @@ -// Copyright (c) 2014, 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. - -import 'dart:async'; -import 'package:async_helper/async_helper.dart'; -import 'compiler_helper.dart'; -import 'package:compiler/src/resolution/class_members.dart' - show MembersCreator; - -main() { - asyncTest(() => Future.wait([ - testRequiredParameters(), - testPositionalParameters(), - testNamedParameters(), - testNotSubtype(), - testGetterNotSubtype(), - testSetterNotSubtype(), - testGenericNotSubtype(), - testFieldNotSubtype(), - testMixedOverride(), - testAbstractMethods(), - testNoSuchMethod(), - ])); -} - -Future check(String source, {errors, warnings, hints, infos}) { - return MockCompiler.create((MockCompiler compiler) { - compiler.diagnosticHandler = createHandler(compiler, source); - compiler.parseScript(source); - var cls = compiler.mainApp.find('Class'); - cls.ensureResolved(compiler); - MembersCreator.computeAllClassMembers(compiler, cls); - - toList(o) => o == null ? [] : o is List ? o : [o]; - - compareMessageKinds(source, toList(errors), compiler.errors, 'error'); - - compareMessageKinds(source, toList(warnings), compiler.warnings, 'warning'); - - if (infos != null) { - compareMessageKinds(source, toList(infos), compiler.infos, 'info'); - } - - if (hints != null) { - compareMessageKinds(source, toList(hints), compiler.hints, 'hint'); - } - }); -} - -Future testRequiredParameters() { - return Future.wait([ - check(""" - class A { - method() => null; // testRequiredParameters:0 - } - class Class extends A { - method() => null; // testRequiredParameters:1 - } - """), - - check(""" - class A { - method(a) => null; // testRequiredParameters:2 - } - class Class extends A { - method(b) => null; // testRequiredParameters:3 - } - """), - - check(""" - class A { - method(a, b, c, d) => null; // testRequiredParameters:3 - } - class Class extends A { - method(b, a, d, c) => null; // testRequiredParameters:4 - } - """), - - check(""" - class A { - method() => null; // testRequiredParameters:5 - } - class Class extends A { - method(a) => null; // testRequiredParameters:6 - } - """, warnings: MessageKind.INVALID_OVERRIDE_METHOD, - infos: MessageKind.INVALID_OVERRIDDEN_METHOD), - - check(""" - class A { - method() => null; // testRequiredParameters:7 - } - class Class implements A { - method(a) => null; // testRequiredParameters:8 - } - """, warnings: MessageKind.INVALID_OVERRIDE_METHOD, - infos: MessageKind.INVALID_OVERRIDDEN_METHOD), - - check(""" - class A { - method(a, b, c) => null; // testRequiredParameters:9 - } - class Class extends A { - method(a, b, c, d) => null; // testRequiredParameters:10 - } - """, warnings: MessageKind.INVALID_OVERRIDE_METHOD, - infos: MessageKind.INVALID_OVERRIDDEN_METHOD), - ]); -} - -Future testPositionalParameters() { - return Future.wait([ - check(""" - class A { - method([a]) => null; // testPositionalParameters:1 - } - class Class extends A { - method([a]) => null; // testPositionalParameters:2 - } - """), - - check(""" - class A { - method([a, b]) => null; // testPositionalParameters:3 - } - class Class extends A { - method([b, a]) => null; // testPositionalParameters:4 - } - """), - - check(""" - class A { - method([a, b, c]) => null; // testPositionalParameters:5 - } - class Class extends A { - method([b, d, a, c]) => null; // testPositionalParameters:6 - } - """), - - check(""" - class A { - method([a]) => null; // testPositionalParameters:7 - } - class Class extends A { - method([a]) => null; // testPositionalParameters:8 - } - """), - - check(""" - class A { - method(a) => null; // testPositionalParameters:9 - } - class Class extends A { - method() => null; // testPositionalParameters:10 - } - """, warnings: MessageKind.INVALID_OVERRIDE_METHOD, - infos: MessageKind.INVALID_OVERRIDDEN_METHOD), - - check(""" - class A { - method(a, [b]) => null; // testPositionalParameters:11 - } - class Class extends A { - method(a) => null; // testPositionalParameters:12 - } - """, warnings: MessageKind.INVALID_OVERRIDE_METHOD, - infos: MessageKind.INVALID_OVERRIDDEN_METHOD), - - check(""" - class A { - method(a, [b]) => null; // testPositionalParameters:13 - } - class Class extends A { - method([a]) => null; // testPositionalParameters:14 - } - """, warnings: MessageKind.INVALID_OVERRIDE_METHOD, - infos: MessageKind.INVALID_OVERRIDDEN_METHOD), - - check(""" - class A { - method(a, b, [c, d, e]) => null; // testPositionalParameters:15 - } - class Class extends A { - method([a, b, c, d]) => null; // testPositionalParameters:16 - } - """, warnings: MessageKind.INVALID_OVERRIDE_METHOD, - infos: MessageKind.INVALID_OVERRIDDEN_METHOD), - ]); -} - -Future testNamedParameters() { - return Future.wait([ - check(""" - class A { - method({a}) => null; // testNamedParameters:1 - } - class Class extends A { - method({a}) => null; // testNamedParameters:2 - } - """), - - check(""" - class A { - method({a, b}) => null; // testNamedParameters:3 - } - class Class extends A { - method({b, a}) => null; // testNamedParameters:4 - } - """), - - check(""" - class A { - method({a, b, c}) => null; // testNamedParameters:5 - } - class Class extends A { - method({b, c, a, d}) => null; // testNamedParameters:6 - } - """), - - check(""" - class A { - method(d, {a, b, c}) => null; // testNamedParameters:7 - } - class Class extends A { - method(e, {b, c, a, d}) => null; // testNamedParameters:8 - } - """), - - check(""" - class A { - method({a}) => null; // testNamedParameters:9 - } - class Class extends A { - method() => null; // testNamedParameters:10 - } - """, warnings: MessageKind.INVALID_OVERRIDE_METHOD, - infos: MessageKind.INVALID_OVERRIDDEN_METHOD), - - check(""" - class A { - method({a, b}) => null; // testNamedParameters:11 - } - class Class extends A { - method({b}) => null; // testNamedParameters:12 - } - """, warnings: MessageKind.INVALID_OVERRIDE_METHOD, - infos: MessageKind.INVALID_OVERRIDDEN_METHOD), - - check(""" - class A { - method({a, b, c, d}) => null; // testNamedParameters:13 - } - class Class extends A { - method({a, e, d, c}) => null; // testNamedParameters:14 - } - """, warnings: MessageKind.INVALID_OVERRIDE_METHOD, - infos: MessageKind.INVALID_OVERRIDDEN_METHOD), - ]); -} - -Future testNotSubtype() { - return Future.wait([ - check(""" - class A { - method(int a) => null; // testNotSubtype:1 - } - class Class extends A { - method(int a) => null; // testNotSubtype:2 - } - """), - - check(""" - class A { - method(int a) => null; // testNotSubtype:3 - } - class Class extends A { - method(num a) => null; // testNotSubtype:4 - } - """), - - check(""" - class A { - void method() {} // testNotSubtype:5 - } - class Class extends A { - method() => null; // testNotSubtype:6 - } - """), - - check(""" - class A { - method() => null; // testNotSubtype:7 - } - class Class extends A { - void method() {} // testNotSubtype:8 - } - """), - - check(""" - class A { - void method() {} // testNotSubtype:9 - } - class Class extends A { - int method() => null; // testNotSubtype:10 - } - """), - - check(""" - class A { - int method() => null; // testNotSubtype:11 - } - class Class extends A { - void method() {} // testNotSubtype:12 - } - """, warnings: MessageKind.INVALID_OVERRIDE_METHOD, - infos: MessageKind.INVALID_OVERRIDDEN_METHOD), - - check(""" - class A { - method(int a) => null; // testNotSubtype:13 - } - class B extends A { - method(num a) => null; // testNotSubtype:14 - } - class Class extends B { - method(double a) => null; // testNotSubtype:15 - } - """), - - check(""" - class A { - method(int a) => null; // testNotSubtype:16 - } - class B extends A { - method(a) => null; // testNotSubtype:17 - } - class Class extends B { - method(String a) => null; // testNotSubtype:18 - } - """), - - check(""" - class A { - method(int a) => null; // testNotSubtype:19 - } - class Class extends A { - method(String a) => null; // testNotSubtype:20 - } - """, warnings: MessageKind.INVALID_OVERRIDE_METHOD, - infos: MessageKind.INVALID_OVERRIDDEN_METHOD), - - // TODO(johnniwinther): These are unclear. Issue 16443 has been filed. - check(""" - class A { - method(int a) => null; // testNotSubtype:23 - } - class B { - method(num a) => null; // testNotSubtype:24 - } - abstract class C implements A, B { - } - class Class implements C { - method(double a) => null; // testNotSubtype:25 - } - """, warnings: MessageKind.INVALID_OVERRIDE_METHOD, - infos: MessageKind.INVALID_OVERRIDDEN_METHOD), - - check(""" - class A { - method(num a) => null; // testNotSubtype:29 - } - class B { - method(int a) => null; // testNotSubtype:30 - } - abstract class C implements A, B { - } - class Class implements C { - method(double a) => null; // testNotSubtype:31 - } - """, warnings: MessageKind.INVALID_OVERRIDE_METHOD, - infos: MessageKind.INVALID_OVERRIDDEN_METHOD), - - check(""" - class A { - method(int a) => null; // testNotSubtype:26 - } - class B { - method(num a) => null; // testNotSubtype:27 - } - abstract class C implements A, B { - } - class Class implements C { - method(String a) => null; // testNotSubtype:28 - } - """, warnings: [MessageKind.INVALID_OVERRIDE_METHOD, - MessageKind.INVALID_OVERRIDE_METHOD], - infos: [MessageKind.INVALID_OVERRIDDEN_METHOD, - MessageKind.INVALID_OVERRIDDEN_METHOD]), - ]); -} - -Future testGetterNotSubtype() { - return Future.wait([ - check(""" - class A { - get getter => null; // testGetterNotSubtype:1 - } - class Class extends A { - get getter => null; // testGetterNotSubtype:2 - } - """), - - check(""" - class A { - num get getter => null; // testGetterNotSubtype:3 - } - class Class extends A { - num get getter => null; // testGetterNotSubtype:4 - } - """), - - check(""" - class A { - num get getter => null; // testGetterNotSubtype:5 - } - class Class extends A { - int get getter => null; // testGetterNotSubtype:6 - } - """), - - check(""" - class A { - int get getter => null; // testGetterNotSubtype:7 - } - class Class extends A { - num get getter => null; // testGetterNotSubtype:8 - } - """), - - check(""" - class A { - int get getter => null; // testGetterNotSubtype:9 - } - class Class extends A { - double get getter => null; // testGetterNotSubtype:10 - } - """, warnings: MessageKind.INVALID_OVERRIDE_GETTER, - infos: MessageKind.INVALID_OVERRIDDEN_GETTER), - - check(""" - class A { - int get getter => null; // testGetterNotSubtype:11 - } - class B extends A { - num get getter => null; // testGetterNotSubtype:12 - } - class Class extends B { - double get getter => null; // testGetterNotSubtype:13 - } - """), - - check(""" - class A { - int get getter => null; // testGetterNotSubtype:14 - } - class B { - num get getter => null; // testGetterNotSubtype:15 - } - class Class extends A implements B { - double get getter => null; // testGetterNotSubtype:16 - } - """, warnings: MessageKind.INVALID_OVERRIDE_GETTER, - infos: MessageKind.INVALID_OVERRIDDEN_GETTER), - - check(""" - class A { - int get getter => null; // testGetterNotSubtype:17 - } - class B { - String get getter => null; // testGetterNotSubtype:18 - } - class Class extends A implements B { - double get getter => null; // testGetterNotSubtype:19 - } - """, warnings: [MessageKind.INVALID_OVERRIDE_GETTER, - MessageKind.INVALID_OVERRIDE_GETTER], - infos: [MessageKind.INVALID_OVERRIDDEN_GETTER, - MessageKind.INVALID_OVERRIDDEN_GETTER]), - - check(""" - class A { - int get getter => null; // testGetterNotSubtype:20 - } - class B { - String get getter => null; // testGetterNotSubtype:21 - } - class Class implements A, B { - double get getter => null; // testGetterNotSubtype:22 - } - """, warnings: [MessageKind.INVALID_OVERRIDE_GETTER, - MessageKind.INVALID_OVERRIDE_GETTER], - infos: [MessageKind.INVALID_OVERRIDDEN_GETTER, - MessageKind.INVALID_OVERRIDDEN_GETTER]), - - // TODO(johnniwinther): These are unclear. Issue 16443 has been filed. - check(""" - class A { - int get getter => null; // testGetterNotSubtype:23 - } - class B { - num get getter => null; // testGetterNotSubtype:24 - } - abstract class C implements A, B { - } - class Class implements C { - double get getter => null; // testGetterNotSubtype:25 - } - """, warnings: MessageKind.INVALID_OVERRIDE_GETTER, - infos: MessageKind.INVALID_OVERRIDDEN_GETTER), - - check(""" - class A { - int get getter => null; // testGetterNotSubtype:26 - } - class B { - num get getter => null; // testGetterNotSubtype:27 - } - abstract class C implements A, B { - } - class Class implements C { - String get getter => null; // testGetterNotSubtype:28 - } - """, warnings: [MessageKind.INVALID_OVERRIDE_GETTER, - MessageKind.INVALID_OVERRIDE_GETTER], - infos: [MessageKind.INVALID_OVERRIDDEN_GETTER, - MessageKind.INVALID_OVERRIDDEN_GETTER]), - ]); -} - -Future testGenericNotSubtype() { - return Future.wait([ - check(""" - class A { - method(T t) => null; // testGenericNotSubtype:1 - } - class Class extends A { - method(S s) => null; // testGenericNotSubtype:2 - } - """), - - check(""" - class A { - method(T t) => null; // testGenericNotSubtype:3 - } - class Class extends A { - method(int i) => null; // testGenericNotSubtype:4 - } - """), - - check(""" - class A { - method(T t) => null; // testGenericNotSubtype:5 - } - class B { - method(S s) => null; // testGenericNotSubtype:6 - } - class Class extends A implements B { - method(num i) => null; // testGenericNotSubtype:7 - } - """), - - check(""" - class A { - method(T t) => null; // testGenericNotSubtype:8 - } - class Class extends A { - method(int i) => null; // testGenericNotSubtype:9 - } - """, warnings: MessageKind.INVALID_OVERRIDE_METHOD, - infos: MessageKind.INVALID_OVERRIDDEN_METHOD), - - check(""" - class A { - method(T t) => null; // testGenericNotSubtype:10 - } - class B extends A { - - } - class Class extends B { - method(U u) => null; // testGenericNotSubtype:11 - } - """), - - check(""" - class A { - method(T t) => null; // testGenericNotSubtype:12 - } - class B { - method(S s) => null; // testGenericNotSubtype:13 - } - class Class extends A implements B { - method(int i) => null; // testGenericNotSubtype:14 - } - """, warnings: MessageKind.INVALID_OVERRIDE_METHOD, - infos: MessageKind.INVALID_OVERRIDDEN_METHOD), - - check(""" - class A { - method(T t) => null; // testGenericNotSubtype:15 - } - class B { - method(S s) => null; // testGenericNotSubtype:16 - } - class Class extends A implements B { - method(double d) => null; // testGenericNotSubtype:17 - } - """, warnings: [MessageKind.INVALID_OVERRIDE_METHOD, - MessageKind.INVALID_OVERRIDE_METHOD], - infos: [MessageKind.INVALID_OVERRIDDEN_METHOD, - MessageKind.INVALID_OVERRIDDEN_METHOD]), - - check(""" - class A { - method(T t) => null; // testGenericNotSubtype:18 - } - class B { - method(S s) => null; // testGenericNotSubtype:19 - } - class Class implements A, B { - method(double d) => null; // testGenericNotSubtype:20 - } - """, warnings: [MessageKind.INVALID_OVERRIDE_METHOD, - MessageKind.INVALID_OVERRIDE_METHOD], - infos: [MessageKind.INVALID_OVERRIDDEN_METHOD, - MessageKind.INVALID_OVERRIDDEN_METHOD]), - - // TODO(johnniwinther): These are unclear. Issue 16443 has been filed. - check(""" - class A { - method(T t) => null; // testGenericNotSubtype:21 - } - class B { - method(S s) => null; // testGenericNotSubtype:22 - } - abstract class C implements A, B { - } - class Class implements C { - method(double d) => null; // testGenericNotSubtype:23 - } - """, warnings: MessageKind.INVALID_OVERRIDE_METHOD, - infos: MessageKind.INVALID_OVERRIDDEN_METHOD), - - check(""" - class A { - method(T t) => null; // testGenericNotSubtype:24 - } - class B { - method(S s) => null; // testGenericNotSubtype:25 - } - abstract class C implements A, B { - } - class Class implements C { - method(String s) => null; // testGenericNotSubtype:26 - } - """, warnings: [MessageKind.INVALID_OVERRIDE_METHOD, - MessageKind.INVALID_OVERRIDE_METHOD], - infos: [MessageKind.INVALID_OVERRIDDEN_METHOD, - MessageKind.INVALID_OVERRIDDEN_METHOD]), - ]); -} - -Future testSetterNotSubtype() { - return Future.wait([ - check(""" - class A { - set setter(_) => null; // testSetterNotSubtype:1 - } - class Class extends A { - set setter(_) => null; // testSetterNotSubtype:2 - } - """), - - check(""" - class A { - void set setter(_) {} // testSetterNotSubtype:3 - } - class Class extends A { - set setter(_) => null; // testSetterNotSubtype:4 - } - """), - - check(""" - class A { - set setter(_) => null; // testSetterNotSubtype:5 - } - class Class extends A { - void set setter(_) {} // testSetterNotSubtype:6 - } - """), - - check(""" - class A { - set setter(_) => null; // testSetterNotSubtype:7 - } - class Class extends A { - void set setter(_) {} // testSetterNotSubtype:8 - } - """), - - check(""" - class A { - set setter(num _) => null; // testSetterNotSubtype:9 - } - class Class extends A { - set setter(num _) => null; // testSetterNotSubtype:10 - } - """), - - check(""" - class A { - set setter(num _) => null; // testSetterNotSubtype:11 - } - class Class extends A { - set setter(int _) => null; // testSetterNotSubtype:12 - } - """), - - check(""" - class A { - set setter(int _) => null; // testSetterNotSubtype:13 - } - class Class extends A { - set setter(num _) => null; // testSetterNotSubtype:14 - } - """), - - check(""" - class A { - set setter(int _) => null; // testSetterNotSubtype:15 - } - class Class extends A { - set setter(double _) => null; // testSetterNotSubtype:16 - } - """, warnings: MessageKind.INVALID_OVERRIDE_SETTER, - infos: MessageKind.INVALID_OVERRIDDEN_SETTER), - - check(""" - class A { - set setter(int _) => null; // testSetterNotSubtype:17 - } - class B extends A { - set setter(num _) => null; // testSetterNotSubtype:18 - } - class Class extends B { - set setter(double _) => null; // testSetterNotSubtype:19 - } - """), - - check(""" - class A { - set setter(int _) => null; // testSetterNotSubtype:20 - } - class B { - set setter(num _) => null; // testSetterNotSubtype:21 - } - class Class extends A implements B { - set setter(double _) => null; // testSetterNotSubtype:22 - } - """, warnings: MessageKind.INVALID_OVERRIDE_SETTER, - infos: MessageKind.INVALID_OVERRIDDEN_SETTER), - - check(""" - class A { - set setter(int _) => null; // testSetterNotSubtype:23 - } - class B { - set setter(String _) => null; // testSetterNotSubtype:24 - } - class Class extends A implements B { - set setter(double _) => null; // testSetterNotSubtype:25 - } - """, warnings: [MessageKind.INVALID_OVERRIDE_SETTER, - MessageKind.INVALID_OVERRIDE_SETTER], - infos: [MessageKind.INVALID_OVERRIDDEN_SETTER, - MessageKind.INVALID_OVERRIDDEN_SETTER]), - - check(""" - class A { - set setter(int _) => null; // testSetterNotSubtype:26 - } - class B { - set setter(String _) => null; // testSetterNotSubtype:27 - } - class Class implements A, B { - set setter(double _) => null; // testSetterNotSubtype:28 - } - """, warnings: [MessageKind.INVALID_OVERRIDE_SETTER, - MessageKind.INVALID_OVERRIDE_SETTER], - infos: [MessageKind.INVALID_OVERRIDDEN_SETTER, - MessageKind.INVALID_OVERRIDDEN_SETTER]), - - // TODO(johnniwinther): These are unclear. Issue 16443 has been filed. - check(""" - class A { - set setter(int _) => null; // testSetterNotSubtype:29 - } - class B { - set setter(num _) => null; // testSetterNotSubtype:30 - } - abstract class C implements A, B { - } - class Class implements C { - set setter(double _) => null; // testSetterNotSubtype:31 - } - """, warnings: MessageKind.INVALID_OVERRIDE_SETTER, - infos: MessageKind.INVALID_OVERRIDDEN_SETTER), - - check(""" - class A { - set setter(int _) => null; // testSetterNotSubtype:32 - } - class B { - set setter(num _) => null; // testSetterNotSubtype:33 - } - abstract class C implements A, B { - } - class Class implements C { - set setter(String _) => null; // testSetterNotSubtype:34 - } - """, warnings: [MessageKind.INVALID_OVERRIDE_SETTER, - MessageKind.INVALID_OVERRIDE_SETTER], - infos: [MessageKind.INVALID_OVERRIDDEN_SETTER, - MessageKind.INVALID_OVERRIDDEN_SETTER]), - ]); -} - -Future testFieldNotSubtype() { - return Future.wait([ - check(""" - class A { - int field; // testFieldNotSubtype:1 - } - class Class extends A { - int field; // testFieldNotSubtype:2 - } - """), - - check(""" - class A { - num field; // testFieldNotSubtype:3 - } - class Class extends A { - int field; // testFieldNotSubtype:4 - } - """), - - check(""" - class A { - int field; // testFieldNotSubtype:5 - } - class Class extends A { - num field; // testFieldNotSubtype:6 - } - """), - - check(""" - class A { - int field; // testFieldNotSubtype:7 - } - class Class extends A { - double field; // testFieldNotSubtype:8 - } - """, warnings: MessageKind.INVALID_OVERRIDE_FIELD, - infos: MessageKind.INVALID_OVERRIDDEN_FIELD), - - check(""" - class A { - int field; // testFieldNotSubtype:9 - } - class B extends A { - num field; // testFieldNotSubtype:10 - } - class Class extends B { - double field; // testFieldNotSubtype:11 - } - """), - - check(""" - class A { - num field; // testFieldNotSubtype:12 - } - class Class extends A { - int get field => null; // testFieldNotSubtype:13 - } - """), - - check(""" - class A { - num field; // testFieldNotSubtype:14 - } - class Class extends A { - String get field => null; // testFieldNotSubtype:15 - } - """, warnings: MessageKind.INVALID_OVERRIDE_FIELD_WITH_GETTER, - infos: MessageKind.INVALID_OVERRIDDEN_FIELD), - - check(""" - class A { - num get field => null; // testFieldNotSubtype:16 - } - class Class extends A { - String field; // testFieldNotSubtype:17 - } - """, warnings: MessageKind.INVALID_OVERRIDE_GETTER_WITH_FIELD, - infos: MessageKind.INVALID_OVERRIDDEN_GETTER), - - check(""" - class A { - num field; // testFieldNotSubtype:18 - } - class Class extends A { - set field(int _) {} // testFieldNotSubtype:19 - } - """), - - check(""" - class A { - num field; // testFieldNotSubtype:19 - } - class Class extends A { - void set field(int _) {} // testFieldNotSubtype:20 - } - """), - - check(""" - class A { - set field(int _) {} // testFieldNotSubtype:21 - } - class Class extends A { - num field; // testFieldNotSubtype:22 - } - """), - - check(""" - class A { - void set field(int _) {} // testFieldNotSubtype:23 - } - class Class extends A { - num field; // testFieldNotSubtype:24 - } - """), - - check(""" - class A { - num field; // testFieldNotSubtype:25 - } - class Class extends A { - set field(String _) {} // testFieldNotSubtype:26 - } - """, warnings: MessageKind.INVALID_OVERRIDE_FIELD_WITH_SETTER, - infos: MessageKind.INVALID_OVERRIDDEN_FIELD), - - check(""" - class A { - set field(num _) {} // testFieldNotSubtype:27 - } - class Class extends A { - String field; // testFieldNotSubtype:28 - } - """, warnings: MessageKind.INVALID_OVERRIDE_SETTER_WITH_FIELD, - infos: MessageKind.INVALID_OVERRIDDEN_SETTER), - - check(""" - class A { - int field; // testFieldNotSubtype:29 - } - class Class implements A { - String get field => null; // testFieldNotSubtype:30 - void set field(String s) {} // testFieldNotSubtype:31 - } - """, warnings: [MessageKind.INVALID_OVERRIDE_FIELD_WITH_GETTER, - MessageKind.INVALID_OVERRIDE_FIELD_WITH_SETTER], - infos: [MessageKind.INVALID_OVERRIDDEN_FIELD, - MessageKind.INVALID_OVERRIDDEN_FIELD]), - - - check(""" - class A { - String get field => null; // testFieldNotSubtype:32 - void set field(String s) {} // testFieldNotSubtype:33 - } - class Class implements A { - int field; // testFieldNotSubtype:34 - } - """, warnings: [MessageKind.INVALID_OVERRIDE_GETTER_WITH_FIELD, - MessageKind.INVALID_OVERRIDE_SETTER_WITH_FIELD], - infos: [MessageKind.INVALID_OVERRIDDEN_GETTER, - MessageKind.INVALID_OVERRIDDEN_SETTER]), - ]); -} - -Future testMixedOverride() { - return Future.wait([ - check(""" - class A { - var member; // testMixedOverride:1 - } - class Class extends A { - member() {} // testMixedOverride:2 - } - """, errors: MessageKind.CANNOT_OVERRIDE_FIELD_WITH_METHOD, - infos: MessageKind.CANNOT_OVERRIDE_FIELD_WITH_METHOD_CONT), - - check(""" - class A { - member() {} // testMixedOverride:3 - } - class Class extends A { - var member; // testMixedOverride:4 - } - """, errors: MessageKind.CANNOT_OVERRIDE_METHOD_WITH_FIELD, - infos: MessageKind.CANNOT_OVERRIDE_METHOD_WITH_FIELD_CONT), - - check(""" - class A { - get member => null; // testMixedOverride:5 - } - class Class extends A { - member() {} // testMixedOverride:6 - } - """, errors: MessageKind.CANNOT_OVERRIDE_GETTER_WITH_METHOD, - infos: MessageKind.CANNOT_OVERRIDE_GETTER_WITH_METHOD_CONT), - - check(""" - class A { - member() {} // testMixedOverride:7 - } - class Class extends A { - get member => null; // testMixedOverride:8 - } - """, errors: MessageKind.CANNOT_OVERRIDE_METHOD_WITH_GETTER, - infos: MessageKind.CANNOT_OVERRIDE_METHOD_WITH_GETTER_CONT), - - check(""" - abstract class A { - var member; // testMixedOverride:9 - } - abstract class B { - get member; // testMixedOverride:10 - } - abstract class Class implements A, B { - } - """), - - check(""" - abstract class A { - var member; // testMixedOverride:11 - } - abstract class B { - member() {} // testMixedOverride:12 - } - abstract class Class implements A, B { - } - """, warnings: MessageKind.INHERIT_GETTER_AND_METHOD, - infos: [MessageKind.INHERITED_METHOD, - MessageKind.INHERITED_IMPLICIT_GETTER]), - - check(""" - abstract class A { - get member; // testMixedOverride:13 - } - abstract class B { - member() {} // testMixedOverride:14 - } - abstract class Class implements A, B { - } - """, warnings: MessageKind.INHERIT_GETTER_AND_METHOD, - infos: [MessageKind.INHERITED_METHOD, - MessageKind.INHERITED_EXPLICIT_GETTER]), - - check(""" - abstract class A { - get member; // testMixedOverride:15 - } - abstract class B { - member() {} // testMixedOverride:16 - } - abstract class C { - var member; // testMixedOverride:17 - } - abstract class D { - member() {} // testMixedOverride:18 - } - abstract class E { - get member; // testMixedOverride:19 - } - abstract class Class implements A, B, C, D, E { - } - """, warnings: MessageKind.INHERIT_GETTER_AND_METHOD, - infos: [MessageKind.INHERITED_EXPLICIT_GETTER, - MessageKind.INHERITED_METHOD, - MessageKind.INHERITED_IMPLICIT_GETTER, - MessageKind.INHERITED_METHOD, - MessageKind.INHERITED_EXPLICIT_GETTER]), - - check(""" - abstract class A { - get member; // testMixedOverride:20 - } - abstract class B { - member() {} // testMixedOverride:21 - } - abstract class C implements A, B { - } - class Class extends C { - member() {} // testMixedOverride:22 - } - """, errors: MessageKind.CANNOT_OVERRIDE_GETTER_WITH_METHOD, - warnings: MessageKind.INHERIT_GETTER_AND_METHOD, - infos: [MessageKind.INHERITED_METHOD, - MessageKind.INHERITED_EXPLICIT_GETTER, - MessageKind.CANNOT_OVERRIDE_GETTER_WITH_METHOD_CONT]), - - check(""" - abstract class A { - get member; // testMixedOverride:23 - } - abstract class B { - member() {} // testMixedOverride:24 - } - abstract class C implements A, B { - } - class Class extends C { - get member => null; // testMixedOverride:25 - } - """, errors: MessageKind.CANNOT_OVERRIDE_METHOD_WITH_GETTER, - warnings: MessageKind.INHERIT_GETTER_AND_METHOD, - infos: [MessageKind.INHERITED_METHOD, - MessageKind.INHERITED_EXPLICIT_GETTER, - MessageKind.CANNOT_OVERRIDE_METHOD_WITH_GETTER_CONT]), - ]); -} - -Future testAbstractMethods() { - return Future.wait([ - check(""" - abstract class Class { - method(); // testAbstractMethod:1 - } - """), - - check(""" - class Class { - method(); // testAbstractMethod:2 - } - """, warnings: MessageKind.ABSTRACT_METHOD, - infos: []), - - check(""" - class Class { - get getter; // testAbstractMethod:3 - } - """, warnings: MessageKind.ABSTRACT_GETTER, - infos: []), - - check(""" - class Class { - set setter(_); // testAbstractMethod:4 - } - """, warnings: MessageKind.ABSTRACT_SETTER, - infos: []), - - check(""" - abstract class A { - method(); // testAbstractMethod:5 - } - class Class extends A { - method() {} // testAbstractMethod:6 - } - """), - - check(""" - abstract class A { - method(); // testAbstractMethod:7 - } - class Class extends A { - method([a]) {} // testAbstractMethod:8 - } - """), - - check(""" - abstract class A { - method(); // testAbstractMethod:9 - } - class Class extends A { - } - """, warnings: MessageKind.UNIMPLEMENTED_METHOD_ONE, - infos: MessageKind.UNIMPLEMENTED_METHOD_CONT), - - check(""" - abstract class A { - get getter; // testAbstractMethod:10 - } - class Class extends A { - } - """, warnings: MessageKind.UNIMPLEMENTED_GETTER_ONE, - infos: MessageKind.UNIMPLEMENTED_EXPLICIT_GETTER), - - check(""" - abstract class A { - set setter(_); // testAbstractMethod:11 - } - class Class extends A { - } - """, warnings: MessageKind.UNIMPLEMENTED_SETTER_ONE, - infos: MessageKind.UNIMPLEMENTED_EXPLICIT_SETTER), - - check(""" - abstract class A { - method(); // testAbstractMethod:12 - } - class B { - method() {} // testAbstractMethod:13 - } - class Class extends A implements B { - } - """, warnings: MessageKind.UNIMPLEMENTED_METHOD, - infos: [MessageKind.UNIMPLEMENTED_METHOD_CONT, - MessageKind.UNIMPLEMENTED_METHOD_CONT]), - - check(""" - class Class implements Function { - } - """, warnings: MessageKind.UNIMPLEMENTED_METHOD_ONE, - infos: []), - - check(""" - abstract class A { - get getter; // testAbstractMethod:14 - } - class B { - get getter => 0; // testAbstractMethod:15 - } - class Class extends A implements B { - } - """, warnings: MessageKind.UNIMPLEMENTED_GETTER, - infos: [MessageKind.UNIMPLEMENTED_EXPLICIT_GETTER, - MessageKind.UNIMPLEMENTED_EXPLICIT_GETTER]), - - check(""" - abstract class A { - set setter(_); // testAbstractMethod:16 - } - class B { - set setter(_) {} // testAbstractMethod:17 - } - class Class extends A implements B { - } - """, warnings: MessageKind.UNIMPLEMENTED_SETTER, - infos: [MessageKind.UNIMPLEMENTED_EXPLICIT_SETTER, - MessageKind.UNIMPLEMENTED_EXPLICIT_SETTER]), - - check(""" - abstract class A { - get field; // testAbstractMethod:18 - } - class B { - var field; // testAbstractMethod:19 - } - class Class extends A implements B { - set field(_) {} // testAbstractMethod:20 - } - """, warnings: MessageKind.UNIMPLEMENTED_GETTER, - infos: [MessageKind.UNIMPLEMENTED_EXPLICIT_GETTER, - MessageKind.UNIMPLEMENTED_IMPLICIT_GETTER]), - - check(""" - abstract class A { - set field(_); // testAbstractMethod:21 - } - class B { - var field; // testAbstractMethod:22 - } - class Class extends A implements B { - get field => 0; // testAbstractMethod:23 - } - """, warnings: MessageKind.UNIMPLEMENTED_SETTER, - infos: [MessageKind.UNIMPLEMENTED_EXPLICIT_SETTER, - MessageKind.UNIMPLEMENTED_IMPLICIT_SETTER]), - - check(""" - class A { - method() {} // testAbstractMethod:24 - } - class Class implements A { - method() {} // testAbstractMethod:25 - } - """), - - check(""" - class A { - method() {} // testAbstractMethod:26 - } - class Class implements A { - method([a]) {} // testAbstractMethod:27 - } - """), - - check(""" - class A { - method() {} // testAbstractMethod:28 - } - class Class implements A { - } - """, warnings: MessageKind.UNIMPLEMENTED_METHOD_ONE, - infos: MessageKind.UNIMPLEMENTED_METHOD_CONT), - - check(""" - class A { - method() {} // testAbstractMethod:29 - } - class B { - method() {} // testAbstractMethod:30 - } - class Class extends A implements B { - } - """), - - check(""" - class A { - var member; // testAbstractMethod:31 - } - class Class implements A { - } - """, warnings: [MessageKind.UNIMPLEMENTED_GETTER_ONE, - MessageKind.UNIMPLEMENTED_SETTER_ONE], - infos: [MessageKind.UNIMPLEMENTED_IMPLICIT_GETTER, - MessageKind.UNIMPLEMENTED_IMPLICIT_SETTER]), - - check(""" - class A { - var member; // testAbstractMethod:32 - } - class B { - get member => null; // testAbstractMethod:33 - set member(_) {} // testAbstractMethod:34 - } - class Class implements A, B { - } - """, warnings: [MessageKind.UNIMPLEMENTED_GETTER, - MessageKind.UNIMPLEMENTED_SETTER], - infos: [MessageKind.UNIMPLEMENTED_EXPLICIT_GETTER, - MessageKind.UNIMPLEMENTED_IMPLICIT_GETTER, - MessageKind.UNIMPLEMENTED_EXPLICIT_SETTER, - MessageKind.UNIMPLEMENTED_IMPLICIT_SETTER]), - - check(""" - class A { - var member; // testAbstractMethod:35 - } - class B { - var member; // testAbstractMethod:36 - } - class Class implements A, B { - } - """, warnings: [MessageKind.UNIMPLEMENTED_GETTER, - MessageKind.UNIMPLEMENTED_SETTER], - infos: [MessageKind.UNIMPLEMENTED_IMPLICIT_GETTER, - MessageKind.UNIMPLEMENTED_IMPLICIT_GETTER, - MessageKind.UNIMPLEMENTED_IMPLICIT_SETTER, - MessageKind.UNIMPLEMENTED_IMPLICIT_SETTER]), - - check(""" - class A { - get member => 0; // testAbstractMethod:37 - } - class Class implements A { - } - """, warnings: MessageKind.UNIMPLEMENTED_GETTER_ONE, - infos: MessageKind.UNIMPLEMENTED_EXPLICIT_GETTER), - - check(""" - class A { - set member(_) {} // testAbstractMethod:38 - } - class Class implements A { - } - """, warnings: MessageKind.UNIMPLEMENTED_SETTER_ONE, - infos: MessageKind.UNIMPLEMENTED_EXPLICIT_SETTER), - - check(""" - class A { - var member; // testAbstractMethod:39 - } - class Class implements A { - get member => 0; - } - """, warnings: MessageKind.UNIMPLEMENTED_SETTER_ONE, - infos: MessageKind.UNIMPLEMENTED_IMPLICIT_SETTER), - - check(""" - class A { - var field; // testAbstractMethod:40 - } - class Class implements A { - final field = 0; // testAbstractMethod:41 - } - """, warnings: MessageKind.UNIMPLEMENTED_SETTER_ONE, - infos: MessageKind.UNIMPLEMENTED_IMPLICIT_SETTER), - - check(""" - class A { - var member; // testAbstractMethod:42 - } - class Class implements A { - set member(_) {} - } - """, warnings: MessageKind.UNIMPLEMENTED_GETTER_ONE, - infos: MessageKind.UNIMPLEMENTED_IMPLICIT_GETTER), - - check(""" - abstract class A { - method() {} // testAbstractMethod:43 - } - class Class extends A { - method(); - } - """), - ]); -} - -Future testNoSuchMethod() { - return Future.wait([ - check(""" - class Class { - method(); // testNoSuchMethod:1 - } - """, warnings: MessageKind.ABSTRACT_METHOD, - infos: []), - - check(""" - @proxy - class Class { - method(); // testNoSuchMethod:2 - } - """, warnings: MessageKind.ABSTRACT_METHOD, - infos: []), - - check(""" - class Class { - noSuchMethod(_) => null; - method(); // testNoSuchMethod:3 - } - """), - - check(""" - class Class { - noSuchMethod(_, [__]) => null; - method(); // testNoSuchMethod:4 - } - """), - - check(""" - class Class { - noSuchMethod(_); - method(); // testNoSuchMethod:5 - } - """), - - check(""" - abstract class A { - method(); // testNoSuchMethod:6 - } - class Class extends A { - } - """, warnings: MessageKind.UNIMPLEMENTED_METHOD_ONE, - infos: MessageKind.UNIMPLEMENTED_METHOD_CONT), - - check(""" - abstract class A { - method(); // testNoSuchMethod:7 - } - @proxy - class Class extends A { - } - """, warnings: MessageKind.UNIMPLEMENTED_METHOD_ONE, - infos: MessageKind.UNIMPLEMENTED_METHOD_CONT), - - check(""" - abstract class A { - method(); // testNoSuchMethod:8 - } - class Class extends A { - noSuchMethod(_) => null; - } - """), - - check(""" - class A { - method() {} // testNoSuchMethod:9 - } - class Class implements A { - } - """, warnings: MessageKind.UNIMPLEMENTED_METHOD_ONE, - infos: MessageKind.UNIMPLEMENTED_METHOD_CONT), - - check(""" - class A { - method() {} // testNoSuchMethod:10 - } - class Class implements A { - } - """, warnings: MessageKind.UNIMPLEMENTED_METHOD_ONE, - infos: MessageKind.UNIMPLEMENTED_METHOD_CONT), - - check(""" - class A { - method() {} // testNoSuchMethod:11 - } - @proxy - class Class implements A { - } - """, warnings: MessageKind.UNIMPLEMENTED_METHOD_ONE, - infos: MessageKind.UNIMPLEMENTED_METHOD_CONT), - - check(""" - class A { - method() {} // testNoSuchMethod:12 - } - class Class implements A { - noSuchMethod(_) => null; - } - """), - - check(""" - class A { - noSuchMethod(_) => null; - method(); // testNoSuchMethod:13 - } - class Class extends A { - } - """, warnings: MessageKind.UNIMPLEMENTED_METHOD_ONE, - infos: MessageKind.UNIMPLEMENTED_METHOD_CONT), - ]); -} +// Copyright (c) 2014, 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. + +import 'dart:async'; +import 'package:async_helper/async_helper.dart'; +import 'compiler_helper.dart'; +import 'package:compiler/src/resolution/class_members.dart' + show MembersCreator; + +main() { + asyncTest(() => Future.wait([ + testRequiredParameters(), + testPositionalParameters(), + testNamedParameters(), + testNotSubtype(), + testGetterNotSubtype(), + testSetterNotSubtype(), + testGenericNotSubtype(), + testFieldNotSubtype(), + testMixedOverride(), + testAbstractMethods(), + testNoSuchMethod(), + ])); +} + +Future check(String source, {errors, warnings, hints, infos}) { + return MockCompiler.create((MockCompiler compiler) { + compiler.diagnosticHandler = createHandler(compiler, source); + compiler.parseScript(source); + var cls = compiler.mainApp.find('Class'); + cls.ensureResolved(compiler); + MembersCreator.computeAllClassMembers(compiler, cls); + + toList(o) => o == null ? [] : o is List ? o : [o]; + + compareMessageKinds(source, toList(errors), compiler.errors, 'error'); + + compareMessageKinds(source, toList(warnings), compiler.warnings, 'warning'); + + if (infos != null) { + compareMessageKinds(source, toList(infos), compiler.infos, 'info'); + } + + if (hints != null) { + compareMessageKinds(source, toList(hints), compiler.hints, 'hint'); + } + }); +} + +Future testRequiredParameters() { + return Future.wait([ + check(""" + class A { + method() => null; // testRequiredParameters:0 + } + class Class extends A { + method() => null; // testRequiredParameters:1 + } + """), + + check(""" + class A { + method(a) => null; // testRequiredParameters:2 + } + class Class extends A { + method(b) => null; // testRequiredParameters:3 + } + """), + + check(""" + class A { + method(a, b, c, d) => null; // testRequiredParameters:3 + } + class Class extends A { + method(b, a, d, c) => null; // testRequiredParameters:4 + } + """), + + check(""" + class A { + method() => null; // testRequiredParameters:5 + } + class Class extends A { + method(a) => null; // testRequiredParameters:6 + } + """, warnings: MessageKind.INVALID_OVERRIDE_METHOD, + infos: MessageKind.INVALID_OVERRIDDEN_METHOD), + + check(""" + class A { + method() => null; // testRequiredParameters:7 + } + class Class implements A { + method(a) => null; // testRequiredParameters:8 + } + """, warnings: MessageKind.INVALID_OVERRIDE_METHOD, + infos: MessageKind.INVALID_OVERRIDDEN_METHOD), + + check(""" + class A { + method(a, b, c) => null; // testRequiredParameters:9 + } + class Class extends A { + method(a, b, c, d) => null; // testRequiredParameters:10 + } + """, warnings: MessageKind.INVALID_OVERRIDE_METHOD, + infos: MessageKind.INVALID_OVERRIDDEN_METHOD), + ]); +} + +Future testPositionalParameters() { + return Future.wait([ + check(""" + class A { + method([a]) => null; // testPositionalParameters:1 + } + class Class extends A { + method([a]) => null; // testPositionalParameters:2 + } + """), + + check(""" + class A { + method([a, b]) => null; // testPositionalParameters:3 + } + class Class extends A { + method([b, a]) => null; // testPositionalParameters:4 + } + """), + + check(""" + class A { + method([a, b, c]) => null; // testPositionalParameters:5 + } + class Class extends A { + method([b, d, a, c]) => null; // testPositionalParameters:6 + } + """), + + check(""" + class A { + method([a]) => null; // testPositionalParameters:7 + } + class Class extends A { + method([a]) => null; // testPositionalParameters:8 + } + """), + + check(""" + class A { + method(a) => null; // testPositionalParameters:9 + } + class Class extends A { + method() => null; // testPositionalParameters:10 + } + """, warnings: MessageKind.INVALID_OVERRIDE_METHOD, + infos: MessageKind.INVALID_OVERRIDDEN_METHOD), + + check(""" + class A { + method(a, [b]) => null; // testPositionalParameters:11 + } + class Class extends A { + method(a) => null; // testPositionalParameters:12 + } + """, warnings: MessageKind.INVALID_OVERRIDE_METHOD, + infos: MessageKind.INVALID_OVERRIDDEN_METHOD), + + check(""" + class A { + method(a, [b]) => null; // testPositionalParameters:13 + } + class Class extends A { + method([a]) => null; // testPositionalParameters:14 + } + """, warnings: MessageKind.INVALID_OVERRIDE_METHOD, + infos: MessageKind.INVALID_OVERRIDDEN_METHOD), + + check(""" + class A { + method(a, b, [c, d, e]) => null; // testPositionalParameters:15 + } + class Class extends A { + method([a, b, c, d]) => null; // testPositionalParameters:16 + } + """, warnings: MessageKind.INVALID_OVERRIDE_METHOD, + infos: MessageKind.INVALID_OVERRIDDEN_METHOD), + ]); +} + +Future testNamedParameters() { + return Future.wait([ + check(""" + class A { + method({a}) => null; // testNamedParameters:1 + } + class Class extends A { + method({a}) => null; // testNamedParameters:2 + } + """), + + check(""" + class A { + method({a, b}) => null; // testNamedParameters:3 + } + class Class extends A { + method({b, a}) => null; // testNamedParameters:4 + } + """), + + check(""" + class A { + method({a, b, c}) => null; // testNamedParameters:5 + } + class Class extends A { + method({b, c, a, d}) => null; // testNamedParameters:6 + } + """), + + check(""" + class A { + method(d, {a, b, c}) => null; // testNamedParameters:7 + } + class Class extends A { + method(e, {b, c, a, d}) => null; // testNamedParameters:8 + } + """), + + check(""" + class A { + method({a}) => null; // testNamedParameters:9 + } + class Class extends A { + method() => null; // testNamedParameters:10 + } + """, warnings: MessageKind.INVALID_OVERRIDE_METHOD, + infos: MessageKind.INVALID_OVERRIDDEN_METHOD), + + check(""" + class A { + method({a, b}) => null; // testNamedParameters:11 + } + class Class extends A { + method({b}) => null; // testNamedParameters:12 + } + """, warnings: MessageKind.INVALID_OVERRIDE_METHOD, + infos: MessageKind.INVALID_OVERRIDDEN_METHOD), + + check(""" + class A { + method({a, b, c, d}) => null; // testNamedParameters:13 + } + class Class extends A { + method({a, e, d, c}) => null; // testNamedParameters:14 + } + """, warnings: MessageKind.INVALID_OVERRIDE_METHOD, + infos: MessageKind.INVALID_OVERRIDDEN_METHOD), + ]); +} + +Future testNotSubtype() { + return Future.wait([ + check(""" + class A { + method(int a) => null; // testNotSubtype:1 + } + class Class extends A { + method(int a) => null; // testNotSubtype:2 + } + """), + + check(""" + class A { + method(int a) => null; // testNotSubtype:3 + } + class Class extends A { + method(num a) => null; // testNotSubtype:4 + } + """), + + check(""" + class A { + void method() {} // testNotSubtype:5 + } + class Class extends A { + method() => null; // testNotSubtype:6 + } + """), + + check(""" + class A { + method() => null; // testNotSubtype:7 + } + class Class extends A { + void method() {} // testNotSubtype:8 + } + """), + + check(""" + class A { + void method() {} // testNotSubtype:9 + } + class Class extends A { + int method() => null; // testNotSubtype:10 + } + """), + + check(""" + class A { + int method() => null; // testNotSubtype:11 + } + class Class extends A { + void method() {} // testNotSubtype:12 + } + """, warnings: MessageKind.INVALID_OVERRIDE_METHOD, + infos: MessageKind.INVALID_OVERRIDDEN_METHOD), + + check(""" + class A { + method(int a) => null; // testNotSubtype:13 + } + class B extends A { + method(num a) => null; // testNotSubtype:14 + } + class Class extends B { + method(double a) => null; // testNotSubtype:15 + } + """), + + check(""" + class A { + method(int a) => null; // testNotSubtype:16 + } + class B extends A { + method(a) => null; // testNotSubtype:17 + } + class Class extends B { + method(String a) => null; // testNotSubtype:18 + } + """), + + check(""" + class A { + method(int a) => null; // testNotSubtype:19 + } + class Class extends A { + method(String a) => null; // testNotSubtype:20 + } + """, warnings: MessageKind.INVALID_OVERRIDE_METHOD, + infos: MessageKind.INVALID_OVERRIDDEN_METHOD), + + // TODO(johnniwinther): These are unclear. Issue 16443 has been filed. + check(""" + class A { + method(int a) => null; // testNotSubtype:23 + } + class B { + method(num a) => null; // testNotSubtype:24 + } + abstract class C implements A, B { + } + class Class implements C { + method(double a) => null; // testNotSubtype:25 + } + """, warnings: MessageKind.INVALID_OVERRIDE_METHOD, + infos: MessageKind.INVALID_OVERRIDDEN_METHOD), + + check(""" + class A { + method(num a) => null; // testNotSubtype:29 + } + class B { + method(int a) => null; // testNotSubtype:30 + } + abstract class C implements A, B { + } + class Class implements C { + method(double a) => null; // testNotSubtype:31 + } + """, warnings: MessageKind.INVALID_OVERRIDE_METHOD, + infos: MessageKind.INVALID_OVERRIDDEN_METHOD), + + check(""" + class A { + method(int a) => null; // testNotSubtype:26 + } + class B { + method(num a) => null; // testNotSubtype:27 + } + abstract class C implements A, B { + } + class Class implements C { + method(String a) => null; // testNotSubtype:28 + } + """, warnings: [MessageKind.INVALID_OVERRIDE_METHOD, + MessageKind.INVALID_OVERRIDE_METHOD], + infos: [MessageKind.INVALID_OVERRIDDEN_METHOD, + MessageKind.INVALID_OVERRIDDEN_METHOD]), + ]); +} + +Future testGetterNotSubtype() { + return Future.wait([ + check(""" + class A { + get getter => null; // testGetterNotSubtype:1 + } + class Class extends A { + get getter => null; // testGetterNotSubtype:2 + } + """), + + check(""" + class A { + num get getter => null; // testGetterNotSubtype:3 + } + class Class extends A { + num get getter => null; // testGetterNotSubtype:4 + } + """), + + check(""" + class A { + num get getter => null; // testGetterNotSubtype:5 + } + class Class extends A { + int get getter => null; // testGetterNotSubtype:6 + } + """), + + check(""" + class A { + int get getter => null; // testGetterNotSubtype:7 + } + class Class extends A { + num get getter => null; // testGetterNotSubtype:8 + } + """), + + check(""" + class A { + int get getter => null; // testGetterNotSubtype:9 + } + class Class extends A { + double get getter => null; // testGetterNotSubtype:10 + } + """, warnings: MessageKind.INVALID_OVERRIDE_GETTER, + infos: MessageKind.INVALID_OVERRIDDEN_GETTER), + + check(""" + class A { + int get getter => null; // testGetterNotSubtype:11 + } + class B extends A { + num get getter => null; // testGetterNotSubtype:12 + } + class Class extends B { + double get getter => null; // testGetterNotSubtype:13 + } + """), + + check(""" + class A { + int get getter => null; // testGetterNotSubtype:14 + } + class B { + num get getter => null; // testGetterNotSubtype:15 + } + class Class extends A implements B { + double get getter => null; // testGetterNotSubtype:16 + } + """, warnings: MessageKind.INVALID_OVERRIDE_GETTER, + infos: MessageKind.INVALID_OVERRIDDEN_GETTER), + + check(""" + class A { + int get getter => null; // testGetterNotSubtype:17 + } + class B { + String get getter => null; // testGetterNotSubtype:18 + } + class Class extends A implements B { + double get getter => null; // testGetterNotSubtype:19 + } + """, warnings: [MessageKind.INVALID_OVERRIDE_GETTER, + MessageKind.INVALID_OVERRIDE_GETTER], + infos: [MessageKind.INVALID_OVERRIDDEN_GETTER, + MessageKind.INVALID_OVERRIDDEN_GETTER]), + + check(""" + class A { + int get getter => null; // testGetterNotSubtype:20 + } + class B { + String get getter => null; // testGetterNotSubtype:21 + } + class Class implements A, B { + double get getter => null; // testGetterNotSubtype:22 + } + """, warnings: [MessageKind.INVALID_OVERRIDE_GETTER, + MessageKind.INVALID_OVERRIDE_GETTER], + infos: [MessageKind.INVALID_OVERRIDDEN_GETTER, + MessageKind.INVALID_OVERRIDDEN_GETTER]), + + // TODO(johnniwinther): These are unclear. Issue 16443 has been filed. + check(""" + class A { + int get getter => null; // testGetterNotSubtype:23 + } + class B { + num get getter => null; // testGetterNotSubtype:24 + } + abstract class C implements A, B { + } + class Class implements C { + double get getter => null; // testGetterNotSubtype:25 + } + """, warnings: MessageKind.INVALID_OVERRIDE_GETTER, + infos: MessageKind.INVALID_OVERRIDDEN_GETTER), + + check(""" + class A { + int get getter => null; // testGetterNotSubtype:26 + } + class B { + num get getter => null; // testGetterNotSubtype:27 + } + abstract class C implements A, B { + } + class Class implements C { + String get getter => null; // testGetterNotSubtype:28 + } + """, warnings: [MessageKind.INVALID_OVERRIDE_GETTER, + MessageKind.INVALID_OVERRIDE_GETTER], + infos: [MessageKind.INVALID_OVERRIDDEN_GETTER, + MessageKind.INVALID_OVERRIDDEN_GETTER]), + ]); +} + +Future testGenericNotSubtype() { + return Future.wait([ + check(""" + class A { + method(T t) => null; // testGenericNotSubtype:1 + } + class Class extends A { + method(S s) => null; // testGenericNotSubtype:2 + } + """), + + check(""" + class A { + method(T t) => null; // testGenericNotSubtype:3 + } + class Class extends A { + method(int i) => null; // testGenericNotSubtype:4 + } + """), + + check(""" + class A { + method(T t) => null; // testGenericNotSubtype:5 + } + class B { + method(S s) => null; // testGenericNotSubtype:6 + } + class Class extends A implements B { + method(num i) => null; // testGenericNotSubtype:7 + } + """), + + check(""" + class A { + method(T t) => null; // testGenericNotSubtype:8 + } + class Class extends A { + method(int i) => null; // testGenericNotSubtype:9 + } + """, warnings: MessageKind.INVALID_OVERRIDE_METHOD, + infos: MessageKind.INVALID_OVERRIDDEN_METHOD), + + check(""" + class A { + method(T t) => null; // testGenericNotSubtype:10 + } + class B extends A { + + } + class Class extends B { + method(U u) => null; // testGenericNotSubtype:11 + } + """), + + check(""" + class A { + method(T t) => null; // testGenericNotSubtype:12 + } + class B { + method(S s) => null; // testGenericNotSubtype:13 + } + class Class extends A implements B { + method(int i) => null; // testGenericNotSubtype:14 + } + """, warnings: MessageKind.INVALID_OVERRIDE_METHOD, + infos: MessageKind.INVALID_OVERRIDDEN_METHOD), + + check(""" + class A { + method(T t) => null; // testGenericNotSubtype:15 + } + class B { + method(S s) => null; // testGenericNotSubtype:16 + } + class Class extends A implements B { + method(double d) => null; // testGenericNotSubtype:17 + } + """, warnings: [MessageKind.INVALID_OVERRIDE_METHOD, + MessageKind.INVALID_OVERRIDE_METHOD], + infos: [MessageKind.INVALID_OVERRIDDEN_METHOD, + MessageKind.INVALID_OVERRIDDEN_METHOD]), + + check(""" + class A { + method(T t) => null; // testGenericNotSubtype:18 + } + class B { + method(S s) => null; // testGenericNotSubtype:19 + } + class Class implements A, B { + method(double d) => null; // testGenericNotSubtype:20 + } + """, warnings: [MessageKind.INVALID_OVERRIDE_METHOD, + MessageKind.INVALID_OVERRIDE_METHOD], + infos: [MessageKind.INVALID_OVERRIDDEN_METHOD, + MessageKind.INVALID_OVERRIDDEN_METHOD]), + + // TODO(johnniwinther): These are unclear. Issue 16443 has been filed. + check(""" + class A { + method(T t) => null; // testGenericNotSubtype:21 + } + class B { + method(S s) => null; // testGenericNotSubtype:22 + } + abstract class C implements A, B { + } + class Class implements C { + method(double d) => null; // testGenericNotSubtype:23 + } + """, warnings: MessageKind.INVALID_OVERRIDE_METHOD, + infos: MessageKind.INVALID_OVERRIDDEN_METHOD), + + check(""" + class A { + method(T t) => null; // testGenericNotSubtype:24 + } + class B { + method(S s) => null; // testGenericNotSubtype:25 + } + abstract class C implements A, B { + } + class Class implements C { + method(String s) => null; // testGenericNotSubtype:26 + } + """, warnings: [MessageKind.INVALID_OVERRIDE_METHOD, + MessageKind.INVALID_OVERRIDE_METHOD], + infos: [MessageKind.INVALID_OVERRIDDEN_METHOD, + MessageKind.INVALID_OVERRIDDEN_METHOD]), + ]); +} + +Future testSetterNotSubtype() { + return Future.wait([ + check(""" + class A { + set setter(_) => null; // testSetterNotSubtype:1 + } + class Class extends A { + set setter(_) => null; // testSetterNotSubtype:2 + } + """), + + check(""" + class A { + void set setter(_) {} // testSetterNotSubtype:3 + } + class Class extends A { + set setter(_) => null; // testSetterNotSubtype:4 + } + """), + + check(""" + class A { + set setter(_) => null; // testSetterNotSubtype:5 + } + class Class extends A { + void set setter(_) {} // testSetterNotSubtype:6 + } + """), + + check(""" + class A { + set setter(_) => null; // testSetterNotSubtype:7 + } + class Class extends A { + void set setter(_) {} // testSetterNotSubtype:8 + } + """), + + check(""" + class A { + set setter(num _) => null; // testSetterNotSubtype:9 + } + class Class extends A { + set setter(num _) => null; // testSetterNotSubtype:10 + } + """), + + check(""" + class A { + set setter(num _) => null; // testSetterNotSubtype:11 + } + class Class extends A { + set setter(int _) => null; // testSetterNotSubtype:12 + } + """), + + check(""" + class A { + set setter(int _) => null; // testSetterNotSubtype:13 + } + class Class extends A { + set setter(num _) => null; // testSetterNotSubtype:14 + } + """), + + check(""" + class A { + set setter(int _) => null; // testSetterNotSubtype:15 + } + class Class extends A { + set setter(double _) => null; // testSetterNotSubtype:16 + } + """, warnings: MessageKind.INVALID_OVERRIDE_SETTER, + infos: MessageKind.INVALID_OVERRIDDEN_SETTER), + + check(""" + class A { + set setter(int _) => null; // testSetterNotSubtype:17 + } + class B extends A { + set setter(num _) => null; // testSetterNotSubtype:18 + } + class Class extends B { + set setter(double _) => null; // testSetterNotSubtype:19 + } + """), + + check(""" + class A { + set setter(int _) => null; // testSetterNotSubtype:20 + } + class B { + set setter(num _) => null; // testSetterNotSubtype:21 + } + class Class extends A implements B { + set setter(double _) => null; // testSetterNotSubtype:22 + } + """, warnings: MessageKind.INVALID_OVERRIDE_SETTER, + infos: MessageKind.INVALID_OVERRIDDEN_SETTER), + + check(""" + class A { + set setter(int _) => null; // testSetterNotSubtype:23 + } + class B { + set setter(String _) => null; // testSetterNotSubtype:24 + } + class Class extends A implements B { + set setter(double _) => null; // testSetterNotSubtype:25 + } + """, warnings: [MessageKind.INVALID_OVERRIDE_SETTER, + MessageKind.INVALID_OVERRIDE_SETTER], + infos: [MessageKind.INVALID_OVERRIDDEN_SETTER, + MessageKind.INVALID_OVERRIDDEN_SETTER]), + + check(""" + class A { + set setter(int _) => null; // testSetterNotSubtype:26 + } + class B { + set setter(String _) => null; // testSetterNotSubtype:27 + } + class Class implements A, B { + set setter(double _) => null; // testSetterNotSubtype:28 + } + """, warnings: [MessageKind.INVALID_OVERRIDE_SETTER, + MessageKind.INVALID_OVERRIDE_SETTER], + infos: [MessageKind.INVALID_OVERRIDDEN_SETTER, + MessageKind.INVALID_OVERRIDDEN_SETTER]), + + // TODO(johnniwinther): These are unclear. Issue 16443 has been filed. + check(""" + class A { + set setter(int _) => null; // testSetterNotSubtype:29 + } + class B { + set setter(num _) => null; // testSetterNotSubtype:30 + } + abstract class C implements A, B { + } + class Class implements C { + set setter(double _) => null; // testSetterNotSubtype:31 + } + """, warnings: MessageKind.INVALID_OVERRIDE_SETTER, + infos: MessageKind.INVALID_OVERRIDDEN_SETTER), + + check(""" + class A { + set setter(int _) => null; // testSetterNotSubtype:32 + } + class B { + set setter(num _) => null; // testSetterNotSubtype:33 + } + abstract class C implements A, B { + } + class Class implements C { + set setter(String _) => null; // testSetterNotSubtype:34 + } + """, warnings: [MessageKind.INVALID_OVERRIDE_SETTER, + MessageKind.INVALID_OVERRIDE_SETTER], + infos: [MessageKind.INVALID_OVERRIDDEN_SETTER, + MessageKind.INVALID_OVERRIDDEN_SETTER]), + ]); +} + +Future testFieldNotSubtype() { + return Future.wait([ + check(""" + class A { + int field; // testFieldNotSubtype:1 + } + class Class extends A { + int field; // testFieldNotSubtype:2 + } + """), + + check(""" + class A { + num field; // testFieldNotSubtype:3 + } + class Class extends A { + int field; // testFieldNotSubtype:4 + } + """), + + check(""" + class A { + int field; // testFieldNotSubtype:5 + } + class Class extends A { + num field; // testFieldNotSubtype:6 + } + """), + + check(""" + class A { + int field; // testFieldNotSubtype:7 + } + class Class extends A { + double field; // testFieldNotSubtype:8 + } + """, warnings: MessageKind.INVALID_OVERRIDE_FIELD, + infos: MessageKind.INVALID_OVERRIDDEN_FIELD), + + check(""" + class A { + int field; // testFieldNotSubtype:9 + } + class B extends A { + num field; // testFieldNotSubtype:10 + } + class Class extends B { + double field; // testFieldNotSubtype:11 + } + """), + + check(""" + class A { + num field; // testFieldNotSubtype:12 + } + class Class extends A { + int get field => null; // testFieldNotSubtype:13 + } + """), + + check(""" + class A { + num field; // testFieldNotSubtype:14 + } + class Class extends A { + String get field => null; // testFieldNotSubtype:15 + } + """, warnings: MessageKind.INVALID_OVERRIDE_FIELD_WITH_GETTER, + infos: MessageKind.INVALID_OVERRIDDEN_FIELD), + + check(""" + class A { + num get field => null; // testFieldNotSubtype:16 + } + class Class extends A { + String field; // testFieldNotSubtype:17 + } + """, warnings: MessageKind.INVALID_OVERRIDE_GETTER_WITH_FIELD, + infos: MessageKind.INVALID_OVERRIDDEN_GETTER), + + check(""" + class A { + num field; // testFieldNotSubtype:18 + } + class Class extends A { + set field(int _) {} // testFieldNotSubtype:19 + } + """), + + check(""" + class A { + num field; // testFieldNotSubtype:19 + } + class Class extends A { + void set field(int _) {} // testFieldNotSubtype:20 + } + """), + + check(""" + class A { + set field(int _) {} // testFieldNotSubtype:21 + } + class Class extends A { + num field; // testFieldNotSubtype:22 + } + """), + + check(""" + class A { + void set field(int _) {} // testFieldNotSubtype:23 + } + class Class extends A { + num field; // testFieldNotSubtype:24 + } + """), + + check(""" + class A { + num field; // testFieldNotSubtype:25 + } + class Class extends A { + set field(String _) {} // testFieldNotSubtype:26 + } + """, warnings: MessageKind.INVALID_OVERRIDE_FIELD_WITH_SETTER, + infos: MessageKind.INVALID_OVERRIDDEN_FIELD), + + check(""" + class A { + set field(num _) {} // testFieldNotSubtype:27 + } + class Class extends A { + String field; // testFieldNotSubtype:28 + } + """, warnings: MessageKind.INVALID_OVERRIDE_SETTER_WITH_FIELD, + infos: MessageKind.INVALID_OVERRIDDEN_SETTER), + + check(""" + class A { + int field; // testFieldNotSubtype:29 + } + class Class implements A { + String get field => null; // testFieldNotSubtype:30 + void set field(String s) {} // testFieldNotSubtype:31 + } + """, warnings: [MessageKind.INVALID_OVERRIDE_FIELD_WITH_GETTER, + MessageKind.INVALID_OVERRIDE_FIELD_WITH_SETTER], + infos: [MessageKind.INVALID_OVERRIDDEN_FIELD, + MessageKind.INVALID_OVERRIDDEN_FIELD]), + + + check(""" + class A { + String get field => null; // testFieldNotSubtype:32 + void set field(String s) {} // testFieldNotSubtype:33 + } + class Class implements A { + int field; // testFieldNotSubtype:34 + } + """, warnings: [MessageKind.INVALID_OVERRIDE_GETTER_WITH_FIELD, + MessageKind.INVALID_OVERRIDE_SETTER_WITH_FIELD], + infos: [MessageKind.INVALID_OVERRIDDEN_GETTER, + MessageKind.INVALID_OVERRIDDEN_SETTER]), + ]); +} + +Future testMixedOverride() { + return Future.wait([ + check(""" + class A { + var member; // testMixedOverride:1 + } + class Class extends A { + member() {} // testMixedOverride:2 + } + """, errors: MessageKind.CANNOT_OVERRIDE_FIELD_WITH_METHOD, + infos: MessageKind.CANNOT_OVERRIDE_FIELD_WITH_METHOD_CONT), + + check(""" + class A { + member() {} // testMixedOverride:3 + } + class Class extends A { + var member; // testMixedOverride:4 + } + """, errors: MessageKind.CANNOT_OVERRIDE_METHOD_WITH_FIELD, + infos: MessageKind.CANNOT_OVERRIDE_METHOD_WITH_FIELD_CONT), + + check(""" + class A { + get member => null; // testMixedOverride:5 + } + class Class extends A { + member() {} // testMixedOverride:6 + } + """, errors: MessageKind.CANNOT_OVERRIDE_GETTER_WITH_METHOD, + infos: MessageKind.CANNOT_OVERRIDE_GETTER_WITH_METHOD_CONT), + + check(""" + class A { + member() {} // testMixedOverride:7 + } + class Class extends A { + get member => null; // testMixedOverride:8 + } + """, errors: MessageKind.CANNOT_OVERRIDE_METHOD_WITH_GETTER, + infos: MessageKind.CANNOT_OVERRIDE_METHOD_WITH_GETTER_CONT), + + check(""" + abstract class A { + var member; // testMixedOverride:9 + } + abstract class B { + get member; // testMixedOverride:10 + } + abstract class Class implements A, B { + } + """), + + check(""" + abstract class A { + var member; // testMixedOverride:11 + } + abstract class B { + member() {} // testMixedOverride:12 + } + abstract class Class implements A, B { + } + """, warnings: MessageKind.INHERIT_GETTER_AND_METHOD, + infos: [MessageKind.INHERITED_METHOD, + MessageKind.INHERITED_IMPLICIT_GETTER]), + + check(""" + abstract class A { + get member; // testMixedOverride:13 + } + abstract class B { + member() {} // testMixedOverride:14 + } + abstract class Class implements A, B { + } + """, warnings: MessageKind.INHERIT_GETTER_AND_METHOD, + infos: [MessageKind.INHERITED_METHOD, + MessageKind.INHERITED_EXPLICIT_GETTER]), + + check(""" + abstract class A { + get member; // testMixedOverride:15 + } + abstract class B { + member() {} // testMixedOverride:16 + } + abstract class C { + var member; // testMixedOverride:17 + } + abstract class D { + member() {} // testMixedOverride:18 + } + abstract class E { + get member; // testMixedOverride:19 + } + abstract class Class implements A, B, C, D, E { + } + """, warnings: MessageKind.INHERIT_GETTER_AND_METHOD, + infos: [MessageKind.INHERITED_EXPLICIT_GETTER, + MessageKind.INHERITED_METHOD, + MessageKind.INHERITED_IMPLICIT_GETTER, + MessageKind.INHERITED_METHOD, + MessageKind.INHERITED_EXPLICIT_GETTER]), + + check(""" + abstract class A { + get member; // testMixedOverride:20 + } + abstract class B { + member() {} // testMixedOverride:21 + } + abstract class C implements A, B { + } + class Class extends C { + member() {} // testMixedOverride:22 + } + """, errors: MessageKind.CANNOT_OVERRIDE_GETTER_WITH_METHOD, + warnings: MessageKind.INHERIT_GETTER_AND_METHOD, + infos: [MessageKind.INHERITED_METHOD, + MessageKind.INHERITED_EXPLICIT_GETTER, + MessageKind.CANNOT_OVERRIDE_GETTER_WITH_METHOD_CONT]), + + check(""" + abstract class A { + get member; // testMixedOverride:23 + } + abstract class B { + member() {} // testMixedOverride:24 + } + abstract class C implements A, B { + } + class Class extends C { + get member => null; // testMixedOverride:25 + } + """, errors: MessageKind.CANNOT_OVERRIDE_METHOD_WITH_GETTER, + warnings: MessageKind.INHERIT_GETTER_AND_METHOD, + infos: [MessageKind.INHERITED_METHOD, + MessageKind.INHERITED_EXPLICIT_GETTER, + MessageKind.CANNOT_OVERRIDE_METHOD_WITH_GETTER_CONT]), + ]); +} + +Future testAbstractMethods() { + return Future.wait([ + check(""" + abstract class Class { + method(); // testAbstractMethod:1 + } + """), + + check(""" + class Class { + method(); // testAbstractMethod:2 + } + """, warnings: MessageKind.ABSTRACT_METHOD, + infos: []), + + check(""" + class Class { + get getter; // testAbstractMethod:3 + } + """, warnings: MessageKind.ABSTRACT_GETTER, + infos: []), + + check(""" + class Class { + set setter(_); // testAbstractMethod:4 + } + """, warnings: MessageKind.ABSTRACT_SETTER, + infos: []), + + check(""" + abstract class A { + method(); // testAbstractMethod:5 + } + class Class extends A { + method() {} // testAbstractMethod:6 + } + """), + + check(""" + abstract class A { + method(); // testAbstractMethod:7 + } + class Class extends A { + method([a]) {} // testAbstractMethod:8 + } + """), + + check(""" + abstract class A { + method(); // testAbstractMethod:9 + } + class Class extends A { + } + """, warnings: MessageKind.UNIMPLEMENTED_METHOD_ONE, + infos: MessageKind.UNIMPLEMENTED_METHOD_CONT), + + check(""" + abstract class A { + get getter; // testAbstractMethod:10 + } + class Class extends A { + } + """, warnings: MessageKind.UNIMPLEMENTED_GETTER_ONE, + infos: MessageKind.UNIMPLEMENTED_EXPLICIT_GETTER), + + check(""" + abstract class A { + set setter(_); // testAbstractMethod:11 + } + class Class extends A { + } + """, warnings: MessageKind.UNIMPLEMENTED_SETTER_ONE, + infos: MessageKind.UNIMPLEMENTED_EXPLICIT_SETTER), + + check(""" + abstract class A { + method(); // testAbstractMethod:12 + } + class B { + method() {} // testAbstractMethod:13 + } + class Class extends A implements B { + } + """, warnings: MessageKind.UNIMPLEMENTED_METHOD, + infos: [MessageKind.UNIMPLEMENTED_METHOD_CONT, + MessageKind.UNIMPLEMENTED_METHOD_CONT]), + + check(""" + class Class implements Function { + } + """, warnings: MessageKind.UNIMPLEMENTED_METHOD_ONE, + infos: []), + + check(""" + abstract class A { + get getter; // testAbstractMethod:14 + } + class B { + get getter => 0; // testAbstractMethod:15 + } + class Class extends A implements B { + } + """, warnings: MessageKind.UNIMPLEMENTED_GETTER, + infos: [MessageKind.UNIMPLEMENTED_EXPLICIT_GETTER, + MessageKind.UNIMPLEMENTED_EXPLICIT_GETTER]), + + check(""" + abstract class A { + set setter(_); // testAbstractMethod:16 + } + class B { + set setter(_) {} // testAbstractMethod:17 + } + class Class extends A implements B { + } + """, warnings: MessageKind.UNIMPLEMENTED_SETTER, + infos: [MessageKind.UNIMPLEMENTED_EXPLICIT_SETTER, + MessageKind.UNIMPLEMENTED_EXPLICIT_SETTER]), + + check(""" + abstract class A { + get field; // testAbstractMethod:18 + } + class B { + var field; // testAbstractMethod:19 + } + class Class extends A implements B { + set field(_) {} // testAbstractMethod:20 + } + """, warnings: MessageKind.UNIMPLEMENTED_GETTER, + infos: [MessageKind.UNIMPLEMENTED_EXPLICIT_GETTER, + MessageKind.UNIMPLEMENTED_IMPLICIT_GETTER]), + + check(""" + abstract class A { + set field(_); // testAbstractMethod:21 + } + class B { + var field; // testAbstractMethod:22 + } + class Class extends A implements B { + get field => 0; // testAbstractMethod:23 + } + """, warnings: MessageKind.UNIMPLEMENTED_SETTER, + infos: [MessageKind.UNIMPLEMENTED_EXPLICIT_SETTER, + MessageKind.UNIMPLEMENTED_IMPLICIT_SETTER]), + + check(""" + class A { + method() {} // testAbstractMethod:24 + } + class Class implements A { + method() {} // testAbstractMethod:25 + } + """), + + check(""" + class A { + method() {} // testAbstractMethod:26 + } + class Class implements A { + method([a]) {} // testAbstractMethod:27 + } + """), + + check(""" + class A { + method() {} // testAbstractMethod:28 + } + class Class implements A { + } + """, warnings: MessageKind.UNIMPLEMENTED_METHOD_ONE, + infos: MessageKind.UNIMPLEMENTED_METHOD_CONT), + + check(""" + class A { + method() {} // testAbstractMethod:29 + } + class B { + method() {} // testAbstractMethod:30 + } + class Class extends A implements B { + } + """), + + check(""" + class A { + var member; // testAbstractMethod:31 + } + class Class implements A { + } + """, warnings: [MessageKind.UNIMPLEMENTED_GETTER_ONE, + MessageKind.UNIMPLEMENTED_SETTER_ONE], + infos: [MessageKind.UNIMPLEMENTED_IMPLICIT_GETTER, + MessageKind.UNIMPLEMENTED_IMPLICIT_SETTER]), + + check(""" + class A { + var member; // testAbstractMethod:32 + } + class B { + get member => null; // testAbstractMethod:33 + set member(_) {} // testAbstractMethod:34 + } + class Class implements A, B { + } + """, warnings: [MessageKind.UNIMPLEMENTED_GETTER, + MessageKind.UNIMPLEMENTED_SETTER], + infos: [MessageKind.UNIMPLEMENTED_EXPLICIT_GETTER, + MessageKind.UNIMPLEMENTED_IMPLICIT_GETTER, + MessageKind.UNIMPLEMENTED_EXPLICIT_SETTER, + MessageKind.UNIMPLEMENTED_IMPLICIT_SETTER]), + + check(""" + class A { + var member; // testAbstractMethod:35 + } + class B { + var member; // testAbstractMethod:36 + } + class Class implements A, B { + } + """, warnings: [MessageKind.UNIMPLEMENTED_GETTER, + MessageKind.UNIMPLEMENTED_SETTER], + infos: [MessageKind.UNIMPLEMENTED_IMPLICIT_GETTER, + MessageKind.UNIMPLEMENTED_IMPLICIT_GETTER, + MessageKind.UNIMPLEMENTED_IMPLICIT_SETTER, + MessageKind.UNIMPLEMENTED_IMPLICIT_SETTER]), + + check(""" + class A { + get member => 0; // testAbstractMethod:37 + } + class Class implements A { + } + """, warnings: MessageKind.UNIMPLEMENTED_GETTER_ONE, + infos: MessageKind.UNIMPLEMENTED_EXPLICIT_GETTER), + + check(""" + class A { + set member(_) {} // testAbstractMethod:38 + } + class Class implements A { + } + """, warnings: MessageKind.UNIMPLEMENTED_SETTER_ONE, + infos: MessageKind.UNIMPLEMENTED_EXPLICIT_SETTER), + + check(""" + class A { + var member; // testAbstractMethod:39 + } + class Class implements A { + get member => 0; + } + """, warnings: MessageKind.UNIMPLEMENTED_SETTER_ONE, + infos: MessageKind.UNIMPLEMENTED_IMPLICIT_SETTER), + + check(""" + class A { + var field; // testAbstractMethod:40 + } + class Class implements A { + final field = 0; // testAbstractMethod:41 + } + """, warnings: MessageKind.UNIMPLEMENTED_SETTER_ONE, + infos: MessageKind.UNIMPLEMENTED_IMPLICIT_SETTER), + + check(""" + class A { + var member; // testAbstractMethod:42 + } + class Class implements A { + set member(_) {} + } + """, warnings: MessageKind.UNIMPLEMENTED_GETTER_ONE, + infos: MessageKind.UNIMPLEMENTED_IMPLICIT_GETTER), + + check(""" + abstract class A { + method() {} // testAbstractMethod:43 + } + class Class extends A { + method(); + } + """), + ]); +} + +Future testNoSuchMethod() { + return Future.wait([ + check(""" + class Class { + method(); // testNoSuchMethod:1 + } + """, warnings: MessageKind.ABSTRACT_METHOD, + infos: []), + + check(""" + @proxy + class Class { + method(); // testNoSuchMethod:2 + } + """, warnings: MessageKind.ABSTRACT_METHOD, + infos: []), + + check(""" + class Class { + noSuchMethod(_) => null; + method(); // testNoSuchMethod:3 + } + """), + + check(""" + class Class { + noSuchMethod(_, [__]) => null; + method(); // testNoSuchMethod:4 + } + """), + + check(""" + class Class { + noSuchMethod(_); + method(); // testNoSuchMethod:5 + } + """), + + check(""" + abstract class A { + method(); // testNoSuchMethod:6 + } + class Class extends A { + } + """, warnings: MessageKind.UNIMPLEMENTED_METHOD_ONE, + infos: MessageKind.UNIMPLEMENTED_METHOD_CONT), + + check(""" + abstract class A { + method(); // testNoSuchMethod:7 + } + @proxy + class Class extends A { + } + """, warnings: MessageKind.UNIMPLEMENTED_METHOD_ONE, + infos: MessageKind.UNIMPLEMENTED_METHOD_CONT), + + check(""" + abstract class A { + method(); // testNoSuchMethod:8 + } + class Class extends A { + noSuchMethod(_) => null; + } + """), + + check(""" + class A { + method() {} // testNoSuchMethod:9 + } + class Class implements A { + } + """, warnings: MessageKind.UNIMPLEMENTED_METHOD_ONE, + infos: MessageKind.UNIMPLEMENTED_METHOD_CONT), + + check(""" + class A { + method() {} // testNoSuchMethod:10 + } + class Class implements A { + } + """, warnings: MessageKind.UNIMPLEMENTED_METHOD_ONE, + infos: MessageKind.UNIMPLEMENTED_METHOD_CONT), + + check(""" + class A { + method() {} // testNoSuchMethod:11 + } + @proxy + class Class implements A { + } + """, warnings: MessageKind.UNIMPLEMENTED_METHOD_ONE, + infos: MessageKind.UNIMPLEMENTED_METHOD_CONT), + + check(""" + class A { + method() {} // testNoSuchMethod:12 + } + class Class implements A { + noSuchMethod(_) => null; + } + """), + + check(""" + class A { + noSuchMethod(_) => null; + method(); // testNoSuchMethod:13 + } + class Class extends A { + } + """, warnings: MessageKind.UNIMPLEMENTED_METHOD_ONE, + infos: MessageKind.UNIMPLEMENTED_METHOD_CONT), + ]); +} diff --git a/tests/compiler/dart2js/proxy_test.dart b/tests/compiler/dart2js/proxy_test.dart index c558350c120..b9d844482e0 100644 --- a/tests/compiler/dart2js/proxy_test.dart +++ b/tests/compiler/dart2js/proxy_test.dart @@ -1,22 +1,22 @@ -// Copyright (c) 2013, 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. - -// Test that dart2js produces the expected static type warnings for proxy -// language tests. This ensures that the analyzer and dart2js agrees on these -// tests. - -import 'warnings_checker.dart'; - -/// Map from test files to a map of their expected status. If the status map is -/// `null` no warnings must be missing or unexpected, otherwise the status map -/// can contain a list of line numbers for keys 'missing' and 'unexpected' for -/// the warnings of each category. -const Map TESTS = const { - 'language/proxy_test.dart': null, - 'language/proxy2_test.dart': null, -}; - -void main() { - checkWarnings(TESTS); -} +// Copyright (c) 2013, 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. + +// Test that dart2js produces the expected static type warnings for proxy +// language tests. This ensures that the analyzer and dart2js agrees on these +// tests. + +import 'warnings_checker.dart'; + +/// Map from test files to a map of their expected status. If the status map is +/// `null` no warnings must be missing or unexpected, otherwise the status map +/// can contain a list of line numbers for keys 'missing' and 'unexpected' for +/// the warnings of each category. +const Map TESTS = const { + 'language/proxy_test.dart': null, + 'language/proxy2_test.dart': null, +}; + +void main() { + checkWarnings(TESTS); +} diff --git a/tests/compiler/dart2js/semantic_visitor_test.dart b/tests/compiler/dart2js/semantic_visitor_test.dart index 69fad43ff5f..19c16947c75 100644 --- a/tests/compiler/dart2js/semantic_visitor_test.dart +++ b/tests/compiler/dart2js/semantic_visitor_test.dart @@ -1,706 +1,706 @@ -// Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file -// for details. All rights reserved. Use of this source code is governed by a -// BSD-style license that can be found in the LICENSE file. - -library dart2js.semantics_visitor_test; - -import 'dart:async'; -import 'dart:mirrors'; -import 'package:async_helper/async_helper.dart'; -import 'package:expect/expect.dart'; -import 'package:compiler/src/constants/expressions.dart'; -import 'package:compiler/src/dart_types.dart'; -import 'package:compiler/src/dart2jslib.dart'; -import 'package:compiler/src/elements/elements.dart'; -import 'package:compiler/src/resolution/resolution.dart'; -import 'package:compiler/src/resolution/semantic_visitor.dart'; -import 'package:compiler/src/resolution/operators.dart'; -import 'package:compiler/src/tree/tree.dart'; -import 'package:compiler/src/util/util.dart'; -import 'memory_compiler.dart'; - -part 'semantic_visitor_test_send_data.dart'; -part 'semantic_visitor_test_send_visitor.dart'; -part 'semantic_visitor_test_decl_data.dart'; -part 'semantic_visitor_test_decl_visitor.dart'; - -class Visit { - final VisitKind method; - final element; - final rhs; - final arguments; - final receiver; - final name; - final expression; - final left; - final right; - final type; - final operator; - final index; - final getter; - final setter; - final constant; - final selector; - final parameters; - final body; - final target; - final targetType; - final initializers; - - const Visit(this.method, - {this.element, - this.rhs, - this.arguments, - this.receiver, - this.name, - this.expression, - this.left, - this.right, - this.type, - this.operator, - this.index, - this.getter, - this.setter, - this.constant, - this.selector, - this.parameters, - this.body, - this.target, - this.targetType, - this.initializers}); - - int get hashCode => toString().hashCode; - - bool operator ==(other) => '$this' == '$other'; - - String toString() { - StringBuffer sb = new StringBuffer(); - sb.write('method=$method'); - if (element != null) { - sb.write(',element=$element'); - } - if (rhs != null) { - sb.write(',rhs=$rhs'); - } - if (arguments != null) { - sb.write(',arguments=$arguments'); - } - if (receiver != null) { - sb.write(',receiver=$receiver'); - } - if (name != null) { - sb.write(',name=$name'); - } - if (expression != null) { - sb.write(',expression=$expression'); - } - if (left != null) { - sb.write(',left=$left'); - } - if (right != null) { - sb.write(',right=$right'); - } - if (type != null) { - sb.write(',type=$type'); - } - if (operator != null) { - sb.write(',operator=$operator'); - } - if (index != null) { - sb.write(',index=$index'); - } - if (getter != null) { - sb.write(',getter=$getter'); - } - if (setter != null) { - sb.write(',setter=$setter'); - } - if (constant != null) { - sb.write(',constant=$constant'); - } - if (selector != null) { - sb.write(',selector=$selector'); - } - if (parameters != null) { - sb.write(',parameters=$parameters'); - } - if (body != null) { - sb.write(',body=$body'); - } - if (target != null) { - sb.write(',target=$target'); - } - if (targetType != null) { - sb.write(',targetType=$targetType'); - } - if (initializers != null) { - sb.write(',initializers=$initializers'); - } - return sb.toString(); - } -} - -class Test { - final String codeByPrefix; - final String code; - final /*Visit | List*/ expectedVisits; - final String cls; - final String method; - - const Test(this.code, this.expectedVisits) - : cls = null, method = 'm', codeByPrefix = null; - const Test.clazz(this.code, this.expectedVisits, - {this.cls: 'C', this.method: 'm'}) - : codeByPrefix = null; - const Test.prefix(this.codeByPrefix, this.code, this.expectedVisits) - : cls = null, method = 'm'; - - String toString() { - StringBuffer sb = new StringBuffer(); - sb.writeln(); - sb.writeln(code); - if (codeByPrefix != null) { - sb.writeln('imported by prefix:'); - sb.writeln(codeByPrefix); - } - return sb.toString(); - } -} - -const List UNTESTABLE_KINDS = const [ - // A final field shadowing a non-final field is currently not supported in - // resolution. - VisitKind.VISIT_SUPER_FIELD_FIELD_COMPOUND, - VisitKind.VISIT_SUPER_FIELD_FIELD_PREFIX, - VisitKind.VISIT_SUPER_FIELD_FIELD_POSTFIX, - // Combination of method and setter with the same name is currently not - // supported by the element model. - VisitKind.VISIT_STATIC_METHOD_SETTER_COMPOUND, - VisitKind.VISIT_STATIC_METHOD_SETTER_PREFIX, - VisitKind.VISIT_STATIC_METHOD_SETTER_POSTFIX, - VisitKind.VISIT_TOP_LEVEL_METHOD_SETTER_COMPOUND, - VisitKind.VISIT_TOP_LEVEL_METHOD_SETTER_PREFIX, - VisitKind.VISIT_TOP_LEVEL_METHOD_SETTER_POSTFIX, - VisitKind.VISIT_SUPER_METHOD_SETTER_COMPOUND, - VisitKind.VISIT_SUPER_METHOD_SETTER_PREFIX, - VisitKind.VISIT_SUPER_METHOD_SETTER_POSTFIX, - // The constant expressions of assignment to constant type literals cannot be - // handled the compile constant evaluator. - VisitKind.VISIT_CLASS_TYPE_LITERAL_SET, - VisitKind.VISIT_TYPEDEF_TYPE_LITERAL_SET, - VisitKind.VISIT_DYNAMIC_TYPE_LITERAL_SET, - // Invalid assignments is currently report through an erroneous element. - VisitKind.VISIT_TYPE_VARIABLE_TYPE_LITERAL_SET, - VisitKind.VISIT_FINAL_PARAMETER_SET, - VisitKind.VISIT_FINAL_LOCAL_VARIABLE_SET, - VisitKind.VISIT_LOCAL_FUNCTION_SET, - VisitKind.VISIT_STATIC_GETTER_SET, - VisitKind.VISIT_FINAL_STATIC_FIELD_SET, - VisitKind.VISIT_STATIC_FUNCTION_SET, - VisitKind.VISIT_FINAL_TOP_LEVEL_FIELD_SET, - VisitKind.VISIT_TOP_LEVEL_GETTER_SET, - VisitKind.VISIT_TOP_LEVEL_FUNCTION_SET, - VisitKind.VISIT_FINAL_SUPER_FIELD_SET, - VisitKind.VISIT_SUPER_GETTER_SET, - VisitKind.VISIT_SUPER_METHOD_SET, - // The only undefined unary, `+`, is currently handled and skipped in the - // parser. - VisitKind.ERROR_UNDEFINED_UNARY_EXPRESSION, - // Constant expression are currently not computed during resolution. - VisitKind.VISIT_CONSTANT_GET, - VisitKind.VISIT_CONSTANT_INVOKE, -]; - -main(List arguments) { - Set kinds = new Set.from(VisitKind.values); - asyncTest(() => Future.forEach([ - () { - return test( - kinds, - arguments, - SEND_TESTS, - (elements) => new SemanticSendTestVisitor(elements)); - }, - () { - return test( - kinds, - arguments, - DECL_TESTS, - (elements) => new SemanticDeclarationTestVisitor(elements)); - }, - () { - Set unvisitedKindSet = - kinds.toSet()..removeAll(UNTESTABLE_KINDS); - List unvisitedKindList = unvisitedKindSet.toList(); - unvisitedKindList..sort((a, b) => a.index.compareTo(b.index)); - - Expect.isTrue(unvisitedKindList.isEmpty, - "Untested visit kinds:\n ${unvisitedKindList.join(',\n ')},\n"); - - Set testedUntestableKinds = - UNTESTABLE_KINDS.toSet()..removeAll(kinds); - Expect.isTrue(testedUntestableKinds.isEmpty, - "Tested untestable visit kinds (remove from UNTESTABLE_KINDS):\n " - "${testedUntestableKinds.join(',\n ')},\n"); - }, - () { - ClassMirror mirror1 = reflectType(SemanticSendTestVisitor); - Set symbols1 = mirror1.declarations.keys.toSet(); - ClassMirror mirror2 = reflectType(SemanticSendVisitor); - Set symbols2 = - mirror2.declarations.values - .where((m) => m is MethodMirror && - !m.isConstructor && - m.simpleName != #apply) - .map((m) => m.simpleName).toSet(); - symbols2.removeAll(symbols1); - Expect.isTrue(symbols2.isEmpty, - "Untested visit methods:\n ${symbols2.join(',\n ')},\n"); - } - ], (f) => f())); -} - -Future test(Set unvisitedKinds, - List arguments, - Map> TESTS, - SemanticTestVisitor createVisitor(TreeElements elements)) { - Map sourceFiles = {}; - Map testMap = {}; - StringBuffer mainSource = new StringBuffer(); - int index = 0; - TESTS.forEach((String group, List tests) { - if (arguments.isNotEmpty && !arguments.contains(group)) return; - - tests.forEach((Test test) { - StringBuffer testSource = new StringBuffer(); - if (test.codeByPrefix != null) { - String prefixFilename = 'pre$index.dart'; - sourceFiles[prefixFilename] = test.codeByPrefix; - testSource.writeln("import '$prefixFilename' as p;"); - } - - String filename = 'lib$index.dart'; - testSource.writeln(test.code); - sourceFiles[filename] = testSource.toString(); - mainSource.writeln("import '$filename';"); - testMap[filename] = test; - index++; - }); - }); - mainSource.writeln("main() {}"); - sourceFiles['main.dart'] = mainSource.toString(); - - Compiler compiler = compilerFor(sourceFiles, - options: ['--analyze-all', - '--analyze-only', - '--enable-null-aware-operators']); - return compiler.run(Uri.parse('memory:main.dart')).then((_) { - testMap.forEach((String filename, Test test) { - LibraryElement library = compiler.libraryLoader.lookupLibrary( - Uri.parse('memory:$filename')); - Element element; - String cls = test.cls; - String method = test.method; - if (cls == null) { - element = library.find(method); - } else { - ClassElement classElement = library.find(cls); - Expect.isNotNull(classElement, - "Class '$cls' not found in:\n" - "${library.compilationUnit.script.text}"); - element = classElement.localLookup(method); - } - var expectedVisits = test.expectedVisits; - if (expectedVisits == null) { - Expect.isTrue(element.isErroneous, - "Element '$method' expected to be have parse errors in:\n" - "${library.compilationUnit.script.text}"); - return; - } else if (expectedVisits is! List) { - expectedVisits = [expectedVisits]; - } - Expect.isFalse(element.isErroneous, - "Element '$method' is not expected to be have parse errors in:\n" - "${library.compilationUnit.script.text}"); - - void testAstElement(AstElement astElement) { - Expect.isNotNull(astElement, "Element '$method' not found in:\n" - "${library.compilationUnit.script.text}"); - ResolvedAst resolvedAst = astElement.resolvedAst; - SemanticTestVisitor visitor = createVisitor(resolvedAst.elements); - try { - compiler.withCurrentElement(resolvedAst.element, () { - //print(resolvedAst.node.toDebugString()); - resolvedAst.node.accept(visitor); - }); - } catch (e, s) { - Expect.fail("$e:\n$s\nIn test:\n" - "${library.compilationUnit.script.text}"); - } - Expect.listEquals(expectedVisits, visitor.visits, - "In test:\n" - "${library.compilationUnit.script.text}\n\n" - "Expected: $expectedVisits\n" - "Found: ${visitor.visits}"); - unvisitedKinds.removeAll(visitor.visits.map((visit) => visit.method)); - } - if (element.isAbstractField) { - AbstractFieldElement abstractFieldElement = element; - if (abstractFieldElement.getter != null) { - testAstElement(abstractFieldElement.getter); - } else if (abstractFieldElement.setter != null) { - testAstElement(abstractFieldElement.setter); - } - } else { - testAstElement(element); - } - }); - }); -} - -abstract class SemanticTestVisitor extends TraversalVisitor { - List visits = []; - - SemanticTestVisitor(TreeElements elements) : super(elements); - - apply(Node node, arg) => node.accept(this); - - internalError(Spannable spannable, String message) { - throw new SpannableAssertionFailure(spannable, message); - } -} - -enum VisitKind { - VISIT_PARAMETER_GET, - VISIT_PARAMETER_SET, - VISIT_PARAMETER_INVOKE, - VISIT_PARAMETER_COMPOUND, - VISIT_PARAMETER_PREFIX, - VISIT_PARAMETER_POSTFIX, - VISIT_FINAL_PARAMETER_SET, - VISIT_FINAL_PARAMETER_COMPOUND, - VISIT_FINAL_PARAMETER_PREFIX, - VISIT_FINAL_PARAMETER_POSTFIX, - - VISIT_LOCAL_VARIABLE_GET, - VISIT_LOCAL_VARIABLE_SET, - VISIT_LOCAL_VARIABLE_INVOKE, - VISIT_LOCAL_VARIABLE_COMPOUND, - VISIT_LOCAL_VARIABLE_PREFIX, - VISIT_LOCAL_VARIABLE_POSTFIX, - VISIT_LOCAL_VARIABLE_DECL, - VISIT_LOCAL_CONSTANT_DECL, - VISIT_FINAL_LOCAL_VARIABLE_SET, - VISIT_FINAL_LOCAL_VARIABLE_COMPOUND, - VISIT_FINAL_LOCAL_VARIABLE_PREFIX, - VISIT_FINAL_LOCAL_VARIABLE_POSTFIX, - - VISIT_LOCAL_FUNCTION_GET, - VISIT_LOCAL_FUNCTION_INVOKE, - VISIT_LOCAL_FUNCTION_INCOMPATIBLE_INVOKE, - VISIT_LOCAL_FUNCTION_DECL, - VISIT_CLOSURE_DECL, - VISIT_LOCAL_FUNCTION_SET, - VISIT_LOCAL_FUNCTION_COMPOUND, - VISIT_LOCAL_FUNCTION_PREFIX, - VISIT_LOCAL_FUNCTION_POSTFIX, - - VISIT_STATIC_FIELD_GET, - VISIT_STATIC_FIELD_SET, - VISIT_STATIC_FIELD_INVOKE, - VISIT_STATIC_FIELD_COMPOUND, - VISIT_STATIC_FIELD_PREFIX, - VISIT_STATIC_FIELD_POSTFIX, - VISIT_STATIC_FIELD_DECL, - VISIT_STATIC_CONSTANT_DECL, - - VISIT_STATIC_GETTER_GET, - VISIT_STATIC_GETTER_SET, - VISIT_STATIC_GETTER_INVOKE, - - VISIT_STATIC_SETTER_GET, - VISIT_STATIC_SETTER_SET, - VISIT_STATIC_SETTER_INVOKE, - - VISIT_STATIC_GETTER_SETTER_COMPOUND, - VISIT_STATIC_METHOD_SETTER_COMPOUND, - VISIT_STATIC_GETTER_SETTER_PREFIX, - VISIT_STATIC_GETTER_SETTER_POSTFIX, - - VISIT_STATIC_GETTER_DECL, - VISIT_STATIC_SETTER_DECL, - - VISIT_FINAL_STATIC_FIELD_SET, - VISIT_STATIC_FINAL_FIELD_COMPOUND, - VISIT_STATIC_FINAL_FIELD_POSTFIX, - VISIT_STATIC_FINAL_FIELD_PREFIX, - - VISIT_STATIC_FUNCTION_GET, - VISIT_STATIC_FUNCTION_SET, - VISIT_STATIC_FUNCTION_INVOKE, - VISIT_STATIC_FUNCTION_INCOMPATIBLE_INVOKE, - VISIT_STATIC_FUNCTION_DECL, - VISIT_STATIC_METHOD_SETTER_PREFIX, - VISIT_STATIC_METHOD_SETTER_POSTFIX, - - VISIT_UNRESOLVED_STATIC_GETTER_COMPOUND, - VISIT_UNRESOLVED_STATIC_SETTER_COMPOUND, - VISIT_STATIC_METHOD_COMPOUND, - VISIT_UNRESOLVED_STATIC_GETTER_PREFIX, - VISIT_UNRESOLVED_STATIC_SETTER_PREFIX, - VISIT_STATIC_METHOD_PREFIX, - VISIT_UNRESOLVED_STATIC_GETTER_POSTFIX, - VISIT_UNRESOLVED_STATIC_SETTER_POSTFIX, - VISIT_STATIC_METHOD_POSTFIX, - - VISIT_TOP_LEVEL_FIELD_GET, - VISIT_TOP_LEVEL_FIELD_SET, - VISIT_TOP_LEVEL_FIELD_INVOKE, - VISIT_FINAL_TOP_LEVEL_FIELD_SET, - VISIT_TOP_LEVEL_FIELD_COMPOUND, - VISIT_TOP_LEVEL_FIELD_PREFIX, - VISIT_TOP_LEVEL_FIELD_POSTFIX, - VISIT_TOP_LEVEL_FIELD_DECL, - VISIT_TOP_LEVEL_CONSTANT_DECL, - VISIT_TOP_LEVEL_FINAL_FIELD_COMPOUND, - VISIT_TOP_LEVEL_FINAL_FIELD_POSTFIX, - VISIT_TOP_LEVEL_FINAL_FIELD_PREFIX, - - VISIT_TOP_LEVEL_GETTER_GET, - VISIT_TOP_LEVEL_GETTER_SET, - VISIT_TOP_LEVEL_GETTER_INVOKE, - VISIT_TOP_LEVEL_SETTER_GET, - VISIT_TOP_LEVEL_SETTER_SET, - VISIT_TOP_LEVEL_SETTER_INVOKE, - VISIT_TOP_LEVEL_GETTER_SETTER_COMPOUND, - VISIT_TOP_LEVEL_GETTER_SETTER_PREFIX, - VISIT_TOP_LEVEL_GETTER_SETTER_POSTFIX, - VISIT_TOP_LEVEL_GETTER_DECL, - VISIT_TOP_LEVEL_SETTER_DECL, - - VISIT_TOP_LEVEL_FUNCTION_GET, - VISIT_TOP_LEVEL_FUNCTION_SET, - VISIT_TOP_LEVEL_FUNCTION_INVOKE, - VISIT_TOP_LEVEL_FUNCTION_INCOMPATIBLE_INVOKE, - VISIT_TOP_LEVEL_FUNCTION_DECL, - VISIT_TOP_LEVEL_METHOD_SETTER_COMPOUND, - VISIT_TOP_LEVEL_METHOD_SETTER_PREFIX, - VISIT_TOP_LEVEL_METHOD_SETTER_POSTFIX, - - VISIT_UNRESOLVED_TOP_LEVEL_GETTER_COMPOUND, - VISIT_UNRESOLVED_TOP_LEVEL_SETTER_COMPOUND, - VISIT_TOP_LEVEL_METHOD_COMPOUND, - VISIT_UNRESOLVED_TOP_LEVEL_GETTER_PREFIX, - VISIT_UNRESOLVED_TOP_LEVEL_SETTER_PREFIX, - VISIT_TOP_LEVEL_METHOD_PREFIX, - VISIT_UNRESOLVED_TOP_LEVEL_GETTER_POSTFIX, - VISIT_UNRESOLVED_TOP_LEVEL_SETTER_POSTFIX, - VISIT_TOP_LEVEL_METHOD_POSTFIX, - - VISIT_DYNAMIC_PROPERTY_GET, - VISIT_DYNAMIC_PROPERTY_SET, - VISIT_DYNAMIC_PROPERTY_INVOKE, - VISIT_DYNAMIC_PROPERTY_COMPOUND, - VISIT_DYNAMIC_PROPERTY_PREFIX, - VISIT_DYNAMIC_PROPERTY_POSTFIX, - - VISIT_THIS_GET, - VISIT_THIS_INVOKE, - - VISIT_THIS_PROPERTY_GET, - VISIT_THIS_PROPERTY_SET, - VISIT_THIS_PROPERTY_INVOKE, - VISIT_THIS_PROPERTY_COMPOUND, - VISIT_THIS_PROPERTY_PREFIX, - VISIT_THIS_PROPERTY_POSTFIX, - - VISIT_SUPER_FIELD_GET, - VISIT_SUPER_FIELD_SET, - VISIT_FINAL_SUPER_FIELD_SET, - VISIT_SUPER_FIELD_INVOKE, - VISIT_SUPER_FIELD_COMPOUND, - VISIT_SUPER_FIELD_PREFIX, - VISIT_SUPER_FIELD_POSTFIX, - VISIT_SUPER_FINAL_FIELD_COMPOUND, - VISIT_SUPER_FINAL_FIELD_PREFIX, - VISIT_SUPER_FINAL_FIELD_POSTFIX, - VISIT_SUPER_FIELD_FIELD_COMPOUND, - VISIT_SUPER_FIELD_FIELD_PREFIX, - VISIT_SUPER_FIELD_FIELD_POSTFIX, - - VISIT_SUPER_GETTER_GET, - VISIT_SUPER_GETTER_SET, - VISIT_SUPER_GETTER_INVOKE, - VISIT_SUPER_SETTER_GET, - VISIT_SUPER_SETTER_SET, - VISIT_SUPER_SETTER_INVOKE, - VISIT_SUPER_GETTER_SETTER_COMPOUND, - VISIT_SUPER_GETTER_FIELD_COMPOUND, - VISIT_SUPER_FIELD_SETTER_COMPOUND, - VISIT_SUPER_GETTER_SETTER_PREFIX, - VISIT_SUPER_GETTER_FIELD_PREFIX, - VISIT_SUPER_FIELD_SETTER_PREFIX, - VISIT_SUPER_GETTER_SETTER_POSTFIX, - VISIT_SUPER_GETTER_FIELD_POSTFIX, - VISIT_SUPER_FIELD_SETTER_POSTFIX, - - VISIT_SUPER_METHOD_GET, - VISIT_SUPER_METHOD_SET, - VISIT_SUPER_METHOD_INVOKE, - VISIT_SUPER_METHOD_INCOMPATIBLE_INVOKE, - VISIT_SUPER_METHOD_SETTER_COMPOUND, - VISIT_SUPER_METHOD_SETTER_PREFIX, - VISIT_SUPER_METHOD_SETTER_POSTFIX, - VISIT_SUPER_METHOD_COMPOUND, - VISIT_SUPER_METHOD_PREFIX, - VISIT_SUPER_METHOD_POSTFIX, - - VISIT_UNRESOLVED_GET, - VISIT_UNRESOLVED_SET, - VISIT_UNRESOLVED_INVOKE, - VISIT_UNRESOLVED_SUPER_GET, - VISIT_UNRESOLVED_SUPER_INVOKE, - - VISIT_BINARY, - VISIT_INDEX, - VISIT_EQUALS, - VISIT_NOT_EQUALS, - VISIT_INDEX_PREFIX, - VISIT_INDEX_POSTFIX, - - VISIT_SUPER_BINARY, - VISIT_UNRESOLVED_SUPER_BINARY, - VISIT_SUPER_INDEX, - VISIT_UNRESOLVED_SUPER_INDEX, - VISIT_SUPER_EQUALS, - VISIT_SUPER_NOT_EQUALS, - VISIT_SUPER_INDEX_PREFIX, - VISIT_UNRESOLVED_SUPER_GETTER_COMPOUND, - VISIT_UNRESOLVED_SUPER_SETTER_COMPOUND, - VISIT_UNRESOLVED_SUPER_GETTER_PREFIX, - VISIT_UNRESOLVED_SUPER_SETTER_PREFIX, - VISIT_UNRESOLVED_SUPER_INDEX_PREFIX, - VISIT_UNRESOLVED_SUPER_GETTER_INDEX_PREFIX, - VISIT_UNRESOLVED_SUPER_SETTER_INDEX_PREFIX, - VISIT_SUPER_INDEX_POSTFIX, - VISIT_UNRESOLVED_SUPER_GETTER_POSTFIX, - VISIT_UNRESOLVED_SUPER_SETTER_POSTFIX, - VISIT_UNRESOLVED_SUPER_INDEX_POSTFIX, - VISIT_UNRESOLVED_SUPER_GETTER_INDEX_POSTFIX, - VISIT_UNRESOLVED_SUPER_SETTER_INDEX_POSTFIX, - - VISIT_UNRESOLVED_SUPER_COMPOUND, - VISIT_UNRESOLVED_SUPER_PREFIX, - VISIT_UNRESOLVED_SUPER_POSTFIX, - - VISIT_UNARY, - VISIT_SUPER_UNARY, - VISIT_UNRESOLVED_SUPER_UNARY, - VISIT_NOT, - - VISIT_EXPRESSION_INVOKE, - - VISIT_CLASS_TYPE_LITERAL_GET, - VISIT_CLASS_TYPE_LITERAL_SET, - VISIT_CLASS_TYPE_LITERAL_INVOKE, - VISIT_CLASS_TYPE_LITERAL_COMPOUND, - VISIT_CLASS_TYPE_LITERAL_PREFIX, - VISIT_CLASS_TYPE_LITERAL_POSTFIX, - - VISIT_TYPEDEF_TYPE_LITERAL_GET, - VISIT_TYPEDEF_TYPE_LITERAL_SET, - VISIT_TYPEDEF_TYPE_LITERAL_INVOKE, - VISIT_TYPEDEF_TYPE_LITERAL_COMPOUND, - VISIT_TYPEDEF_TYPE_LITERAL_PREFIX, - VISIT_TYPEDEF_TYPE_LITERAL_POSTFIX, - - VISIT_TYPE_VARIABLE_TYPE_LITERAL_GET, - VISIT_TYPE_VARIABLE_TYPE_LITERAL_SET, - VISIT_TYPE_VARIABLE_TYPE_LITERAL_INVOKE, - VISIT_TYPE_VARIABLE_TYPE_LITERAL_COMPOUND, - VISIT_TYPE_VARIABLE_TYPE_LITERAL_PREFIX, - VISIT_TYPE_VARIABLE_TYPE_LITERAL_POSTFIX, - - VISIT_DYNAMIC_TYPE_LITERAL_GET, - VISIT_DYNAMIC_TYPE_LITERAL_SET, - VISIT_DYNAMIC_TYPE_LITERAL_INVOKE, - VISIT_DYNAMIC_TYPE_LITERAL_COMPOUND, - VISIT_DYNAMIC_TYPE_LITERAL_PREFIX, - VISIT_DYNAMIC_TYPE_LITERAL_POSTFIX, - - VISIT_INDEX_SET, - VISIT_COMPOUND_INDEX_SET, - VISIT_SUPER_INDEX_SET, - VISIT_UNRESOLVED_SUPER_INDEX_SET, - VISIT_SUPER_COMPOUND_INDEX_SET, - VISIT_UNRESOLVED_SUPER_COMPOUND_INDEX_SET, - VISIT_UNRESOLVED_SUPER_GETTER_COMPOUND_INDEX_SET, - VISIT_UNRESOLVED_SUPER_SETTER_COMPOUND_INDEX_SET, - - VISIT_ASSERT, - VISIT_LOGICAL_AND, - VISIT_LOGICAL_OR, - VISIT_IS, - VISIT_IS_NOT, - VISIT_AS, - - VISIT_CONST_CONSTRUCTOR_INVOKE, - VISIT_BOOL_FROM_ENVIRONMENT_CONSTRUCTOR_INVOKE, - VISIT_INT_FROM_ENVIRONMENT_CONSTRUCTOR_INVOKE, - VISIT_STRING_FROM_ENVIRONMENT_CONSTRUCTOR_INVOKE, - VISIT_GENERATIVE_CONSTRUCTOR_INVOKE, - VISIT_REDIRECTING_GENERATIVE_CONSTRUCTOR_INVOKE, - VISIT_FACTORY_CONSTRUCTOR_INVOKE, - VISIT_REDIRECTING_FACTORY_CONSTRUCTOR_INVOKE, - VISIT_CONSTRUCTOR_INCOMPATIBLE_INVOKE, - ERROR_NON_CONSTANT_CONSTRUCTOR_INVOKE, - - VISIT_SUPER_CONSTRUCTOR_INVOKE, - VISIT_IMPLICIT_SUPER_CONSTRUCTOR_INVOKE, - VISIT_THIS_CONSTRUCTOR_INVOKE, - VISIT_FIELD_INITIALIZER, - - VISIT_UNRESOLVED_CLASS_CONSTRUCTOR_INVOKE, - VISIT_UNRESOLVED_CONSTRUCTOR_INVOKE, - VISIT_ABSTRACT_CLASS_CONSTRUCTOR_INVOKE, - VISIT_UNRESOLVED_REDIRECTING_FACTORY_CONSTRUCTOR_INVOKE, - - VISIT_INSTANCE_GETTER_DECL, - VISIT_INSTANCE_SETTER_DECL, - VISIT_INSTANCE_METHOD_DECL, - VISIT_ABSTRACT_GETTER_DECL, - VISIT_ABSTRACT_SETTER_DECL, - VISIT_ABSTRACT_METHOD_DECL, - VISIT_INSTANCE_FIELD_DECL, - - VISIT_GENERATIVE_CONSTRUCTOR_DECL, - VISIT_REDIRECTING_GENERATIVE_CONSTRUCTOR_DECL, - VISIT_FACTORY_CONSTRUCTOR_DECL, - VISIT_REDIRECTING_FACTORY_CONSTRUCTOR_DECL, - - VISIT_REQUIRED_PARAMETER_DECL, - VISIT_OPTIONAL_PARAMETER_DECL, - VISIT_NAMED_PARAMETER_DECL, - VISIT_REQUIRED_INITIALIZING_FORMAL_DECL, - VISIT_OPTIONAL_INITIALIZING_FORMAL_DECL, - VISIT_NAMED_INITIALIZING_FORMAL_DECL, - - VISIT_UNRESOLVED_COMPOUND, - VISIT_UNRESOLVED_PREFIX, - VISIT_UNRESOLVED_POSTFIX, - - VISIT_IF_NULL, - VISIT_IF_NOT_NULL_DYNAMIC_PROPERTY_GET, - VISIT_IF_NOT_NULL_DYNAMIC_PROPERTY_SET, - VISIT_IF_NOT_NULL_DYNAMIC_PROPERTY_INVOKE, - VISIT_IF_NOT_NULL_DYNAMIC_PROPERTY_COMPOUND, - VISIT_IF_NOT_NULL_DYNAMIC_PROPERTY_PREFIX, - VISIT_IF_NOT_NULL_DYNAMIC_PROPERTY_POSTFIX, - - ERROR_INVALID_ASSERT, - ERROR_UNDEFINED_UNARY_EXPRESSION, - ERROR_UNDEFINED_BINARY_EXPRESSION, - - VISIT_CONSTANT_GET, - VISIT_CONSTANT_INVOKE, -} +// Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +library dart2js.semantics_visitor_test; + +import 'dart:async'; +import 'dart:mirrors'; +import 'package:async_helper/async_helper.dart'; +import 'package:expect/expect.dart'; +import 'package:compiler/src/constants/expressions.dart'; +import 'package:compiler/src/dart_types.dart'; +import 'package:compiler/src/dart2jslib.dart'; +import 'package:compiler/src/elements/elements.dart'; +import 'package:compiler/src/resolution/resolution.dart'; +import 'package:compiler/src/resolution/semantic_visitor.dart'; +import 'package:compiler/src/resolution/operators.dart'; +import 'package:compiler/src/tree/tree.dart'; +import 'package:compiler/src/util/util.dart'; +import 'memory_compiler.dart'; + +part 'semantic_visitor_test_send_data.dart'; +part 'semantic_visitor_test_send_visitor.dart'; +part 'semantic_visitor_test_decl_data.dart'; +part 'semantic_visitor_test_decl_visitor.dart'; + +class Visit { + final VisitKind method; + final element; + final rhs; + final arguments; + final receiver; + final name; + final expression; + final left; + final right; + final type; + final operator; + final index; + final getter; + final setter; + final constant; + final selector; + final parameters; + final body; + final target; + final targetType; + final initializers; + + const Visit(this.method, + {this.element, + this.rhs, + this.arguments, + this.receiver, + this.name, + this.expression, + this.left, + this.right, + this.type, + this.operator, + this.index, + this.getter, + this.setter, + this.constant, + this.selector, + this.parameters, + this.body, + this.target, + this.targetType, + this.initializers}); + + int get hashCode => toString().hashCode; + + bool operator ==(other) => '$this' == '$other'; + + String toString() { + StringBuffer sb = new StringBuffer(); + sb.write('method=$method'); + if (element != null) { + sb.write(',element=$element'); + } + if (rhs != null) { + sb.write(',rhs=$rhs'); + } + if (arguments != null) { + sb.write(',arguments=$arguments'); + } + if (receiver != null) { + sb.write(',receiver=$receiver'); + } + if (name != null) { + sb.write(',name=$name'); + } + if (expression != null) { + sb.write(',expression=$expression'); + } + if (left != null) { + sb.write(',left=$left'); + } + if (right != null) { + sb.write(',right=$right'); + } + if (type != null) { + sb.write(',type=$type'); + } + if (operator != null) { + sb.write(',operator=$operator'); + } + if (index != null) { + sb.write(',index=$index'); + } + if (getter != null) { + sb.write(',getter=$getter'); + } + if (setter != null) { + sb.write(',setter=$setter'); + } + if (constant != null) { + sb.write(',constant=$constant'); + } + if (selector != null) { + sb.write(',selector=$selector'); + } + if (parameters != null) { + sb.write(',parameters=$parameters'); + } + if (body != null) { + sb.write(',body=$body'); + } + if (target != null) { + sb.write(',target=$target'); + } + if (targetType != null) { + sb.write(',targetType=$targetType'); + } + if (initializers != null) { + sb.write(',initializers=$initializers'); + } + return sb.toString(); + } +} + +class Test { + final String codeByPrefix; + final String code; + final /*Visit | List*/ expectedVisits; + final String cls; + final String method; + + const Test(this.code, this.expectedVisits) + : cls = null, method = 'm', codeByPrefix = null; + const Test.clazz(this.code, this.expectedVisits, + {this.cls: 'C', this.method: 'm'}) + : codeByPrefix = null; + const Test.prefix(this.codeByPrefix, this.code, this.expectedVisits) + : cls = null, method = 'm'; + + String toString() { + StringBuffer sb = new StringBuffer(); + sb.writeln(); + sb.writeln(code); + if (codeByPrefix != null) { + sb.writeln('imported by prefix:'); + sb.writeln(codeByPrefix); + } + return sb.toString(); + } +} + +const List UNTESTABLE_KINDS = const [ + // A final field shadowing a non-final field is currently not supported in + // resolution. + VisitKind.VISIT_SUPER_FIELD_FIELD_COMPOUND, + VisitKind.VISIT_SUPER_FIELD_FIELD_PREFIX, + VisitKind.VISIT_SUPER_FIELD_FIELD_POSTFIX, + // Combination of method and setter with the same name is currently not + // supported by the element model. + VisitKind.VISIT_STATIC_METHOD_SETTER_COMPOUND, + VisitKind.VISIT_STATIC_METHOD_SETTER_PREFIX, + VisitKind.VISIT_STATIC_METHOD_SETTER_POSTFIX, + VisitKind.VISIT_TOP_LEVEL_METHOD_SETTER_COMPOUND, + VisitKind.VISIT_TOP_LEVEL_METHOD_SETTER_PREFIX, + VisitKind.VISIT_TOP_LEVEL_METHOD_SETTER_POSTFIX, + VisitKind.VISIT_SUPER_METHOD_SETTER_COMPOUND, + VisitKind.VISIT_SUPER_METHOD_SETTER_PREFIX, + VisitKind.VISIT_SUPER_METHOD_SETTER_POSTFIX, + // The constant expressions of assignment to constant type literals cannot be + // handled the compile constant evaluator. + VisitKind.VISIT_CLASS_TYPE_LITERAL_SET, + VisitKind.VISIT_TYPEDEF_TYPE_LITERAL_SET, + VisitKind.VISIT_DYNAMIC_TYPE_LITERAL_SET, + // Invalid assignments is currently report through an erroneous element. + VisitKind.VISIT_TYPE_VARIABLE_TYPE_LITERAL_SET, + VisitKind.VISIT_FINAL_PARAMETER_SET, + VisitKind.VISIT_FINAL_LOCAL_VARIABLE_SET, + VisitKind.VISIT_LOCAL_FUNCTION_SET, + VisitKind.VISIT_STATIC_GETTER_SET, + VisitKind.VISIT_FINAL_STATIC_FIELD_SET, + VisitKind.VISIT_STATIC_FUNCTION_SET, + VisitKind.VISIT_FINAL_TOP_LEVEL_FIELD_SET, + VisitKind.VISIT_TOP_LEVEL_GETTER_SET, + VisitKind.VISIT_TOP_LEVEL_FUNCTION_SET, + VisitKind.VISIT_FINAL_SUPER_FIELD_SET, + VisitKind.VISIT_SUPER_GETTER_SET, + VisitKind.VISIT_SUPER_METHOD_SET, + // The only undefined unary, `+`, is currently handled and skipped in the + // parser. + VisitKind.ERROR_UNDEFINED_UNARY_EXPRESSION, + // Constant expression are currently not computed during resolution. + VisitKind.VISIT_CONSTANT_GET, + VisitKind.VISIT_CONSTANT_INVOKE, +]; + +main(List arguments) { + Set kinds = new Set.from(VisitKind.values); + asyncTest(() => Future.forEach([ + () { + return test( + kinds, + arguments, + SEND_TESTS, + (elements) => new SemanticSendTestVisitor(elements)); + }, + () { + return test( + kinds, + arguments, + DECL_TESTS, + (elements) => new SemanticDeclarationTestVisitor(elements)); + }, + () { + Set unvisitedKindSet = + kinds.toSet()..removeAll(UNTESTABLE_KINDS); + List unvisitedKindList = unvisitedKindSet.toList(); + unvisitedKindList..sort((a, b) => a.index.compareTo(b.index)); + + Expect.isTrue(unvisitedKindList.isEmpty, + "Untested visit kinds:\n ${unvisitedKindList.join(',\n ')},\n"); + + Set testedUntestableKinds = + UNTESTABLE_KINDS.toSet()..removeAll(kinds); + Expect.isTrue(testedUntestableKinds.isEmpty, + "Tested untestable visit kinds (remove from UNTESTABLE_KINDS):\n " + "${testedUntestableKinds.join(',\n ')},\n"); + }, + () { + ClassMirror mirror1 = reflectType(SemanticSendTestVisitor); + Set symbols1 = mirror1.declarations.keys.toSet(); + ClassMirror mirror2 = reflectType(SemanticSendVisitor); + Set symbols2 = + mirror2.declarations.values + .where((m) => m is MethodMirror && + !m.isConstructor && + m.simpleName != #apply) + .map((m) => m.simpleName).toSet(); + symbols2.removeAll(symbols1); + Expect.isTrue(symbols2.isEmpty, + "Untested visit methods:\n ${symbols2.join(',\n ')},\n"); + } + ], (f) => f())); +} + +Future test(Set unvisitedKinds, + List arguments, + Map> TESTS, + SemanticTestVisitor createVisitor(TreeElements elements)) { + Map sourceFiles = {}; + Map testMap = {}; + StringBuffer mainSource = new StringBuffer(); + int index = 0; + TESTS.forEach((String group, List tests) { + if (arguments.isNotEmpty && !arguments.contains(group)) return; + + tests.forEach((Test test) { + StringBuffer testSource = new StringBuffer(); + if (test.codeByPrefix != null) { + String prefixFilename = 'pre$index.dart'; + sourceFiles[prefixFilename] = test.codeByPrefix; + testSource.writeln("import '$prefixFilename' as p;"); + } + + String filename = 'lib$index.dart'; + testSource.writeln(test.code); + sourceFiles[filename] = testSource.toString(); + mainSource.writeln("import '$filename';"); + testMap[filename] = test; + index++; + }); + }); + mainSource.writeln("main() {}"); + sourceFiles['main.dart'] = mainSource.toString(); + + Compiler compiler = compilerFor(sourceFiles, + options: ['--analyze-all', + '--analyze-only', + '--enable-null-aware-operators']); + return compiler.run(Uri.parse('memory:main.dart')).then((_) { + testMap.forEach((String filename, Test test) { + LibraryElement library = compiler.libraryLoader.lookupLibrary( + Uri.parse('memory:$filename')); + Element element; + String cls = test.cls; + String method = test.method; + if (cls == null) { + element = library.find(method); + } else { + ClassElement classElement = library.find(cls); + Expect.isNotNull(classElement, + "Class '$cls' not found in:\n" + "${library.compilationUnit.script.text}"); + element = classElement.localLookup(method); + } + var expectedVisits = test.expectedVisits; + if (expectedVisits == null) { + Expect.isTrue(element.isErroneous, + "Element '$method' expected to be have parse errors in:\n" + "${library.compilationUnit.script.text}"); + return; + } else if (expectedVisits is! List) { + expectedVisits = [expectedVisits]; + } + Expect.isFalse(element.isErroneous, + "Element '$method' is not expected to be have parse errors in:\n" + "${library.compilationUnit.script.text}"); + + void testAstElement(AstElement astElement) { + Expect.isNotNull(astElement, "Element '$method' not found in:\n" + "${library.compilationUnit.script.text}"); + ResolvedAst resolvedAst = astElement.resolvedAst; + SemanticTestVisitor visitor = createVisitor(resolvedAst.elements); + try { + compiler.withCurrentElement(resolvedAst.element, () { + //print(resolvedAst.node.toDebugString()); + resolvedAst.node.accept(visitor); + }); + } catch (e, s) { + Expect.fail("$e:\n$s\nIn test:\n" + "${library.compilationUnit.script.text}"); + } + Expect.listEquals(expectedVisits, visitor.visits, + "In test:\n" + "${library.compilationUnit.script.text}\n\n" + "Expected: $expectedVisits\n" + "Found: ${visitor.visits}"); + unvisitedKinds.removeAll(visitor.visits.map((visit) => visit.method)); + } + if (element.isAbstractField) { + AbstractFieldElement abstractFieldElement = element; + if (abstractFieldElement.getter != null) { + testAstElement(abstractFieldElement.getter); + } else if (abstractFieldElement.setter != null) { + testAstElement(abstractFieldElement.setter); + } + } else { + testAstElement(element); + } + }); + }); +} + +abstract class SemanticTestVisitor extends TraversalVisitor { + List visits = []; + + SemanticTestVisitor(TreeElements elements) : super(elements); + + apply(Node node, arg) => node.accept(this); + + internalError(Spannable spannable, String message) { + throw new SpannableAssertionFailure(spannable, message); + } +} + +enum VisitKind { + VISIT_PARAMETER_GET, + VISIT_PARAMETER_SET, + VISIT_PARAMETER_INVOKE, + VISIT_PARAMETER_COMPOUND, + VISIT_PARAMETER_PREFIX, + VISIT_PARAMETER_POSTFIX, + VISIT_FINAL_PARAMETER_SET, + VISIT_FINAL_PARAMETER_COMPOUND, + VISIT_FINAL_PARAMETER_PREFIX, + VISIT_FINAL_PARAMETER_POSTFIX, + + VISIT_LOCAL_VARIABLE_GET, + VISIT_LOCAL_VARIABLE_SET, + VISIT_LOCAL_VARIABLE_INVOKE, + VISIT_LOCAL_VARIABLE_COMPOUND, + VISIT_LOCAL_VARIABLE_PREFIX, + VISIT_LOCAL_VARIABLE_POSTFIX, + VISIT_LOCAL_VARIABLE_DECL, + VISIT_LOCAL_CONSTANT_DECL, + VISIT_FINAL_LOCAL_VARIABLE_SET, + VISIT_FINAL_LOCAL_VARIABLE_COMPOUND, + VISIT_FINAL_LOCAL_VARIABLE_PREFIX, + VISIT_FINAL_LOCAL_VARIABLE_POSTFIX, + + VISIT_LOCAL_FUNCTION_GET, + VISIT_LOCAL_FUNCTION_INVOKE, + VISIT_LOCAL_FUNCTION_INCOMPATIBLE_INVOKE, + VISIT_LOCAL_FUNCTION_DECL, + VISIT_CLOSURE_DECL, + VISIT_LOCAL_FUNCTION_SET, + VISIT_LOCAL_FUNCTION_COMPOUND, + VISIT_LOCAL_FUNCTION_PREFIX, + VISIT_LOCAL_FUNCTION_POSTFIX, + + VISIT_STATIC_FIELD_GET, + VISIT_STATIC_FIELD_SET, + VISIT_STATIC_FIELD_INVOKE, + VISIT_STATIC_FIELD_COMPOUND, + VISIT_STATIC_FIELD_PREFIX, + VISIT_STATIC_FIELD_POSTFIX, + VISIT_STATIC_FIELD_DECL, + VISIT_STATIC_CONSTANT_DECL, + + VISIT_STATIC_GETTER_GET, + VISIT_STATIC_GETTER_SET, + VISIT_STATIC_GETTER_INVOKE, + + VISIT_STATIC_SETTER_GET, + VISIT_STATIC_SETTER_SET, + VISIT_STATIC_SETTER_INVOKE, + + VISIT_STATIC_GETTER_SETTER_COMPOUND, + VISIT_STATIC_METHOD_SETTER_COMPOUND, + VISIT_STATIC_GETTER_SETTER_PREFIX, + VISIT_STATIC_GETTER_SETTER_POSTFIX, + + VISIT_STATIC_GETTER_DECL, + VISIT_STATIC_SETTER_DECL, + + VISIT_FINAL_STATIC_FIELD_SET, + VISIT_STATIC_FINAL_FIELD_COMPOUND, + VISIT_STATIC_FINAL_FIELD_POSTFIX, + VISIT_STATIC_FINAL_FIELD_PREFIX, + + VISIT_STATIC_FUNCTION_GET, + VISIT_STATIC_FUNCTION_SET, + VISIT_STATIC_FUNCTION_INVOKE, + VISIT_STATIC_FUNCTION_INCOMPATIBLE_INVOKE, + VISIT_STATIC_FUNCTION_DECL, + VISIT_STATIC_METHOD_SETTER_PREFIX, + VISIT_STATIC_METHOD_SETTER_POSTFIX, + + VISIT_UNRESOLVED_STATIC_GETTER_COMPOUND, + VISIT_UNRESOLVED_STATIC_SETTER_COMPOUND, + VISIT_STATIC_METHOD_COMPOUND, + VISIT_UNRESOLVED_STATIC_GETTER_PREFIX, + VISIT_UNRESOLVED_STATIC_SETTER_PREFIX, + VISIT_STATIC_METHOD_PREFIX, + VISIT_UNRESOLVED_STATIC_GETTER_POSTFIX, + VISIT_UNRESOLVED_STATIC_SETTER_POSTFIX, + VISIT_STATIC_METHOD_POSTFIX, + + VISIT_TOP_LEVEL_FIELD_GET, + VISIT_TOP_LEVEL_FIELD_SET, + VISIT_TOP_LEVEL_FIELD_INVOKE, + VISIT_FINAL_TOP_LEVEL_FIELD_SET, + VISIT_TOP_LEVEL_FIELD_COMPOUND, + VISIT_TOP_LEVEL_FIELD_PREFIX, + VISIT_TOP_LEVEL_FIELD_POSTFIX, + VISIT_TOP_LEVEL_FIELD_DECL, + VISIT_TOP_LEVEL_CONSTANT_DECL, + VISIT_TOP_LEVEL_FINAL_FIELD_COMPOUND, + VISIT_TOP_LEVEL_FINAL_FIELD_POSTFIX, + VISIT_TOP_LEVEL_FINAL_FIELD_PREFIX, + + VISIT_TOP_LEVEL_GETTER_GET, + VISIT_TOP_LEVEL_GETTER_SET, + VISIT_TOP_LEVEL_GETTER_INVOKE, + VISIT_TOP_LEVEL_SETTER_GET, + VISIT_TOP_LEVEL_SETTER_SET, + VISIT_TOP_LEVEL_SETTER_INVOKE, + VISIT_TOP_LEVEL_GETTER_SETTER_COMPOUND, + VISIT_TOP_LEVEL_GETTER_SETTER_PREFIX, + VISIT_TOP_LEVEL_GETTER_SETTER_POSTFIX, + VISIT_TOP_LEVEL_GETTER_DECL, + VISIT_TOP_LEVEL_SETTER_DECL, + + VISIT_TOP_LEVEL_FUNCTION_GET, + VISIT_TOP_LEVEL_FUNCTION_SET, + VISIT_TOP_LEVEL_FUNCTION_INVOKE, + VISIT_TOP_LEVEL_FUNCTION_INCOMPATIBLE_INVOKE, + VISIT_TOP_LEVEL_FUNCTION_DECL, + VISIT_TOP_LEVEL_METHOD_SETTER_COMPOUND, + VISIT_TOP_LEVEL_METHOD_SETTER_PREFIX, + VISIT_TOP_LEVEL_METHOD_SETTER_POSTFIX, + + VISIT_UNRESOLVED_TOP_LEVEL_GETTER_COMPOUND, + VISIT_UNRESOLVED_TOP_LEVEL_SETTER_COMPOUND, + VISIT_TOP_LEVEL_METHOD_COMPOUND, + VISIT_UNRESOLVED_TOP_LEVEL_GETTER_PREFIX, + VISIT_UNRESOLVED_TOP_LEVEL_SETTER_PREFIX, + VISIT_TOP_LEVEL_METHOD_PREFIX, + VISIT_UNRESOLVED_TOP_LEVEL_GETTER_POSTFIX, + VISIT_UNRESOLVED_TOP_LEVEL_SETTER_POSTFIX, + VISIT_TOP_LEVEL_METHOD_POSTFIX, + + VISIT_DYNAMIC_PROPERTY_GET, + VISIT_DYNAMIC_PROPERTY_SET, + VISIT_DYNAMIC_PROPERTY_INVOKE, + VISIT_DYNAMIC_PROPERTY_COMPOUND, + VISIT_DYNAMIC_PROPERTY_PREFIX, + VISIT_DYNAMIC_PROPERTY_POSTFIX, + + VISIT_THIS_GET, + VISIT_THIS_INVOKE, + + VISIT_THIS_PROPERTY_GET, + VISIT_THIS_PROPERTY_SET, + VISIT_THIS_PROPERTY_INVOKE, + VISIT_THIS_PROPERTY_COMPOUND, + VISIT_THIS_PROPERTY_PREFIX, + VISIT_THIS_PROPERTY_POSTFIX, + + VISIT_SUPER_FIELD_GET, + VISIT_SUPER_FIELD_SET, + VISIT_FINAL_SUPER_FIELD_SET, + VISIT_SUPER_FIELD_INVOKE, + VISIT_SUPER_FIELD_COMPOUND, + VISIT_SUPER_FIELD_PREFIX, + VISIT_SUPER_FIELD_POSTFIX, + VISIT_SUPER_FINAL_FIELD_COMPOUND, + VISIT_SUPER_FINAL_FIELD_PREFIX, + VISIT_SUPER_FINAL_FIELD_POSTFIX, + VISIT_SUPER_FIELD_FIELD_COMPOUND, + VISIT_SUPER_FIELD_FIELD_PREFIX, + VISIT_SUPER_FIELD_FIELD_POSTFIX, + + VISIT_SUPER_GETTER_GET, + VISIT_SUPER_GETTER_SET, + VISIT_SUPER_GETTER_INVOKE, + VISIT_SUPER_SETTER_GET, + VISIT_SUPER_SETTER_SET, + VISIT_SUPER_SETTER_INVOKE, + VISIT_SUPER_GETTER_SETTER_COMPOUND, + VISIT_SUPER_GETTER_FIELD_COMPOUND, + VISIT_SUPER_FIELD_SETTER_COMPOUND, + VISIT_SUPER_GETTER_SETTER_PREFIX, + VISIT_SUPER_GETTER_FIELD_PREFIX, + VISIT_SUPER_FIELD_SETTER_PREFIX, + VISIT_SUPER_GETTER_SETTER_POSTFIX, + VISIT_SUPER_GETTER_FIELD_POSTFIX, + VISIT_SUPER_FIELD_SETTER_POSTFIX, + + VISIT_SUPER_METHOD_GET, + VISIT_SUPER_METHOD_SET, + VISIT_SUPER_METHOD_INVOKE, + VISIT_SUPER_METHOD_INCOMPATIBLE_INVOKE, + VISIT_SUPER_METHOD_SETTER_COMPOUND, + VISIT_SUPER_METHOD_SETTER_PREFIX, + VISIT_SUPER_METHOD_SETTER_POSTFIX, + VISIT_SUPER_METHOD_COMPOUND, + VISIT_SUPER_METHOD_PREFIX, + VISIT_SUPER_METHOD_POSTFIX, + + VISIT_UNRESOLVED_GET, + VISIT_UNRESOLVED_SET, + VISIT_UNRESOLVED_INVOKE, + VISIT_UNRESOLVED_SUPER_GET, + VISIT_UNRESOLVED_SUPER_INVOKE, + + VISIT_BINARY, + VISIT_INDEX, + VISIT_EQUALS, + VISIT_NOT_EQUALS, + VISIT_INDEX_PREFIX, + VISIT_INDEX_POSTFIX, + + VISIT_SUPER_BINARY, + VISIT_UNRESOLVED_SUPER_BINARY, + VISIT_SUPER_INDEX, + VISIT_UNRESOLVED_SUPER_INDEX, + VISIT_SUPER_EQUALS, + VISIT_SUPER_NOT_EQUALS, + VISIT_SUPER_INDEX_PREFIX, + VISIT_UNRESOLVED_SUPER_GETTER_COMPOUND, + VISIT_UNRESOLVED_SUPER_SETTER_COMPOUND, + VISIT_UNRESOLVED_SUPER_GETTER_PREFIX, + VISIT_UNRESOLVED_SUPER_SETTER_PREFIX, + VISIT_UNRESOLVED_SUPER_INDEX_PREFIX, + VISIT_UNRESOLVED_SUPER_GETTER_INDEX_PREFIX, + VISIT_UNRESOLVED_SUPER_SETTER_INDEX_PREFIX, + VISIT_SUPER_INDEX_POSTFIX, + VISIT_UNRESOLVED_SUPER_GETTER_POSTFIX, + VISIT_UNRESOLVED_SUPER_SETTER_POSTFIX, + VISIT_UNRESOLVED_SUPER_INDEX_POSTFIX, + VISIT_UNRESOLVED_SUPER_GETTER_INDEX_POSTFIX, + VISIT_UNRESOLVED_SUPER_SETTER_INDEX_POSTFIX, + + VISIT_UNRESOLVED_SUPER_COMPOUND, + VISIT_UNRESOLVED_SUPER_PREFIX, + VISIT_UNRESOLVED_SUPER_POSTFIX, + + VISIT_UNARY, + VISIT_SUPER_UNARY, + VISIT_UNRESOLVED_SUPER_UNARY, + VISIT_NOT, + + VISIT_EXPRESSION_INVOKE, + + VISIT_CLASS_TYPE_LITERAL_GET, + VISIT_CLASS_TYPE_LITERAL_SET, + VISIT_CLASS_TYPE_LITERAL_INVOKE, + VISIT_CLASS_TYPE_LITERAL_COMPOUND, + VISIT_CLASS_TYPE_LITERAL_PREFIX, + VISIT_CLASS_TYPE_LITERAL_POSTFIX, + + VISIT_TYPEDEF_TYPE_LITERAL_GET, + VISIT_TYPEDEF_TYPE_LITERAL_SET, + VISIT_TYPEDEF_TYPE_LITERAL_INVOKE, + VISIT_TYPEDEF_TYPE_LITERAL_COMPOUND, + VISIT_TYPEDEF_TYPE_LITERAL_PREFIX, + VISIT_TYPEDEF_TYPE_LITERAL_POSTFIX, + + VISIT_TYPE_VARIABLE_TYPE_LITERAL_GET, + VISIT_TYPE_VARIABLE_TYPE_LITERAL_SET, + VISIT_TYPE_VARIABLE_TYPE_LITERAL_INVOKE, + VISIT_TYPE_VARIABLE_TYPE_LITERAL_COMPOUND, + VISIT_TYPE_VARIABLE_TYPE_LITERAL_PREFIX, + VISIT_TYPE_VARIABLE_TYPE_LITERAL_POSTFIX, + + VISIT_DYNAMIC_TYPE_LITERAL_GET, + VISIT_DYNAMIC_TYPE_LITERAL_SET, + VISIT_DYNAMIC_TYPE_LITERAL_INVOKE, + VISIT_DYNAMIC_TYPE_LITERAL_COMPOUND, + VISIT_DYNAMIC_TYPE_LITERAL_PREFIX, + VISIT_DYNAMIC_TYPE_LITERAL_POSTFIX, + + VISIT_INDEX_SET, + VISIT_COMPOUND_INDEX_SET, + VISIT_SUPER_INDEX_SET, + VISIT_UNRESOLVED_SUPER_INDEX_SET, + VISIT_SUPER_COMPOUND_INDEX_SET, + VISIT_UNRESOLVED_SUPER_COMPOUND_INDEX_SET, + VISIT_UNRESOLVED_SUPER_GETTER_COMPOUND_INDEX_SET, + VISIT_UNRESOLVED_SUPER_SETTER_COMPOUND_INDEX_SET, + + VISIT_ASSERT, + VISIT_LOGICAL_AND, + VISIT_LOGICAL_OR, + VISIT_IS, + VISIT_IS_NOT, + VISIT_AS, + + VISIT_CONST_CONSTRUCTOR_INVOKE, + VISIT_BOOL_FROM_ENVIRONMENT_CONSTRUCTOR_INVOKE, + VISIT_INT_FROM_ENVIRONMENT_CONSTRUCTOR_INVOKE, + VISIT_STRING_FROM_ENVIRONMENT_CONSTRUCTOR_INVOKE, + VISIT_GENERATIVE_CONSTRUCTOR_INVOKE, + VISIT_REDIRECTING_GENERATIVE_CONSTRUCTOR_INVOKE, + VISIT_FACTORY_CONSTRUCTOR_INVOKE, + VISIT_REDIRECTING_FACTORY_CONSTRUCTOR_INVOKE, + VISIT_CONSTRUCTOR_INCOMPATIBLE_INVOKE, + ERROR_NON_CONSTANT_CONSTRUCTOR_INVOKE, + + VISIT_SUPER_CONSTRUCTOR_INVOKE, + VISIT_IMPLICIT_SUPER_CONSTRUCTOR_INVOKE, + VISIT_THIS_CONSTRUCTOR_INVOKE, + VISIT_FIELD_INITIALIZER, + + VISIT_UNRESOLVED_CLASS_CONSTRUCTOR_INVOKE, + VISIT_UNRESOLVED_CONSTRUCTOR_INVOKE, + VISIT_ABSTRACT_CLASS_CONSTRUCTOR_INVOKE, + VISIT_UNRESOLVED_REDIRECTING_FACTORY_CONSTRUCTOR_INVOKE, + + VISIT_INSTANCE_GETTER_DECL, + VISIT_INSTANCE_SETTER_DECL, + VISIT_INSTANCE_METHOD_DECL, + VISIT_ABSTRACT_GETTER_DECL, + VISIT_ABSTRACT_SETTER_DECL, + VISIT_ABSTRACT_METHOD_DECL, + VISIT_INSTANCE_FIELD_DECL, + + VISIT_GENERATIVE_CONSTRUCTOR_DECL, + VISIT_REDIRECTING_GENERATIVE_CONSTRUCTOR_DECL, + VISIT_FACTORY_CONSTRUCTOR_DECL, + VISIT_REDIRECTING_FACTORY_CONSTRUCTOR_DECL, + + VISIT_REQUIRED_PARAMETER_DECL, + VISIT_OPTIONAL_PARAMETER_DECL, + VISIT_NAMED_PARAMETER_DECL, + VISIT_REQUIRED_INITIALIZING_FORMAL_DECL, + VISIT_OPTIONAL_INITIALIZING_FORMAL_DECL, + VISIT_NAMED_INITIALIZING_FORMAL_DECL, + + VISIT_UNRESOLVED_COMPOUND, + VISIT_UNRESOLVED_PREFIX, + VISIT_UNRESOLVED_POSTFIX, + + VISIT_IF_NULL, + VISIT_IF_NOT_NULL_DYNAMIC_PROPERTY_GET, + VISIT_IF_NOT_NULL_DYNAMIC_PROPERTY_SET, + VISIT_IF_NOT_NULL_DYNAMIC_PROPERTY_INVOKE, + VISIT_IF_NOT_NULL_DYNAMIC_PROPERTY_COMPOUND, + VISIT_IF_NOT_NULL_DYNAMIC_PROPERTY_PREFIX, + VISIT_IF_NOT_NULL_DYNAMIC_PROPERTY_POSTFIX, + + ERROR_INVALID_ASSERT, + ERROR_UNDEFINED_UNARY_EXPRESSION, + ERROR_UNDEFINED_BINARY_EXPRESSION, + + VISIT_CONSTANT_GET, + VISIT_CONSTANT_INVOKE, +} diff --git a/tests/compiler/dart2js/semantic_visitor_test_decl_data.dart b/tests/compiler/dart2js/semantic_visitor_test_decl_data.dart index ab22664a223..f31b688edd4 100644 --- a/tests/compiler/dart2js/semantic_visitor_test_decl_data.dart +++ b/tests/compiler/dart2js/semantic_visitor_test_decl_data.dart @@ -1,870 +1,870 @@ -// 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> DECL_TESTS = const { - 'Function declarations': const [ - const Test( - ''' - m(a, b) {} - ''', - const [ - const Visit(VisitKind.VISIT_TOP_LEVEL_FUNCTION_DECL, - element: 'function(m)', - parameters: '(a,b)', - body: '{}'), - const Visit(VisitKind.VISIT_REQUIRED_PARAMETER_DECL, - element: 'parameter(m#a)', - index: 0), - const Visit(VisitKind.VISIT_REQUIRED_PARAMETER_DECL, - element: 'parameter(m#b)', - index: 1), - ]), - const Test( - ''' - m(a, [b]) {} - ''', - const [ - const Visit(VisitKind.VISIT_TOP_LEVEL_FUNCTION_DECL, - element: 'function(m)', - parameters: '(a,[b])', - body: '{}'), - const Visit(VisitKind.VISIT_REQUIRED_PARAMETER_DECL, - element: 'parameter(m#a)', - index: 0), - const Visit(VisitKind.VISIT_OPTIONAL_PARAMETER_DECL, - element: 'parameter(m#b)', - index: 1, - constant: 'null'), - ]), - const Test( - ''' - m(a, [b = null]) {} - ''', - const [ - const Visit(VisitKind.VISIT_TOP_LEVEL_FUNCTION_DECL, - element: 'function(m)', - parameters: '(a,[b=null])', - body: '{}'), - const Visit(VisitKind.VISIT_REQUIRED_PARAMETER_DECL, - element: 'parameter(m#a)', - index: 0), - const Visit(VisitKind.VISIT_OPTIONAL_PARAMETER_DECL, - element: 'parameter(m#b)', - constant: 'null', - index: 1), - ]), - const Test( - ''' - m(a, [b = 42]) {} - ''', - const [ - const Visit(VisitKind.VISIT_TOP_LEVEL_FUNCTION_DECL, - element: 'function(m)', - parameters: '(a,[b=42])', - body: '{}'), - const Visit(VisitKind.VISIT_REQUIRED_PARAMETER_DECL, - element: 'parameter(m#a)', - index: 0), - const Visit(VisitKind.VISIT_OPTIONAL_PARAMETER_DECL, - element: 'parameter(m#b)', - constant: 42, - index: 1), - ]), - const Test( - ''' - m(a, {b}) {} - ''', - const [ - const Visit(VisitKind.VISIT_TOP_LEVEL_FUNCTION_DECL, - element: 'function(m)', - parameters: '(a,{b})', - body: '{}'), - const Visit(VisitKind.VISIT_REQUIRED_PARAMETER_DECL, - element: 'parameter(m#a)', - index: 0), - const Visit(VisitKind.VISIT_NAMED_PARAMETER_DECL, - element: 'parameter(m#b)', - constant: 'null'), - ]), - const Test( - ''' - m(a, {b: null}) {} - ''', - const [ - const Visit(VisitKind.VISIT_TOP_LEVEL_FUNCTION_DECL, - element: 'function(m)', - parameters: '(a,{b: null})', - body: '{}'), - const Visit(VisitKind.VISIT_REQUIRED_PARAMETER_DECL, - element: 'parameter(m#a)', - index: 0), - const Visit(VisitKind.VISIT_NAMED_PARAMETER_DECL, - element: 'parameter(m#b)', - constant: 'null'), - ]), - const Test( - ''' - m(a, {b:42}) {} - ''', - const [ - const Visit(VisitKind.VISIT_TOP_LEVEL_FUNCTION_DECL, - element: 'function(m)', - parameters: '(a,{b: 42})', - body: '{}'), - const Visit(VisitKind.VISIT_REQUIRED_PARAMETER_DECL, - element: 'parameter(m#a)', - index: 0), - const Visit(VisitKind.VISIT_NAMED_PARAMETER_DECL, - element: 'parameter(m#b)', - constant: 42), - ]), - const Test( - ''' - get m => null; - ''', - const [ - const Visit(VisitKind.VISIT_TOP_LEVEL_GETTER_DECL, - element: 'getter(m)', - body: '=>null;'), - ]), - const Test( - ''' - set m(a) {} - ''', - const [ - const Visit(VisitKind.VISIT_TOP_LEVEL_SETTER_DECL, - element: 'setter(m)', - parameters: '(a)', - body: '{}'), - const Visit(VisitKind.VISIT_REQUIRED_PARAMETER_DECL, - element: 'parameter(m#a)', - index: 0), - ]), - const Test.clazz( - ''' - class C { - static m(a, b) {} - } - ''', - const [ - const Visit(VisitKind.VISIT_STATIC_FUNCTION_DECL, - element: 'function(C#m)', - parameters: '(a,b)', - body: '{}'), - const Visit(VisitKind.VISIT_REQUIRED_PARAMETER_DECL, - element: 'parameter(m#a)', - index: 0), - const Visit(VisitKind.VISIT_REQUIRED_PARAMETER_DECL, - element: 'parameter(m#b)', - index: 1), - ]), - const Test.clazz( - ''' - class C { - static get m => null; - } - ''', - const [ - const Visit(VisitKind.VISIT_STATIC_GETTER_DECL, - element: 'getter(C#m)', - body: '=>null;'), - ]), - const Test.clazz( - ''' - class C { - static set m(a) {} - } - ''', - const [ - const Visit(VisitKind.VISIT_STATIC_SETTER_DECL, - element: 'setter(C#m)', - parameters: '(a)', - body: '{}'), - const Visit(VisitKind.VISIT_REQUIRED_PARAMETER_DECL, - element: 'parameter(m#a)', - index: 0), - ]), - const Test.clazz( - ''' - class C { - m(a, b) {} - } - ''', - const [ - const Visit(VisitKind.VISIT_INSTANCE_METHOD_DECL, - element: 'function(C#m)', - parameters: '(a,b)', - body: '{}'), - const Visit(VisitKind.VISIT_REQUIRED_PARAMETER_DECL, - element: 'parameter(m#a)', - index: 0), - const Visit(VisitKind.VISIT_REQUIRED_PARAMETER_DECL, - element: 'parameter(m#b)', - index: 1), - ]), - const Test.clazz( - ''' - class C { - get m => null; - } - ''', - const [ - const Visit(VisitKind.VISIT_INSTANCE_GETTER_DECL, - element: 'getter(C#m)', - body: '=>null;'), - ]), - const Test.clazz( - ''' - class C { - set m(a) {} - } - ''', - const [ - const Visit(VisitKind.VISIT_INSTANCE_SETTER_DECL, - element: 'setter(C#m)', - parameters: '(a)', - body: '{}'), - const Visit(VisitKind.VISIT_REQUIRED_PARAMETER_DECL, - element: 'parameter(m#a)', - index: 0), - ]), - const Test.clazz( - ''' - abstract class C { - m(a, b); - } - ''', - const [ - const Visit(VisitKind.VISIT_ABSTRACT_METHOD_DECL, - element: 'function(C#m)', - parameters: '(a,b)'), - const Visit(VisitKind.VISIT_REQUIRED_PARAMETER_DECL, - element: 'parameter(m#a)', - index: 0), - const Visit(VisitKind.VISIT_REQUIRED_PARAMETER_DECL, - element: 'parameter(m#b)', - index: 1), - ]), - const Test.clazz( - ''' - abstract class C { - get m; - } - ''', - const [ - const Visit(VisitKind.VISIT_ABSTRACT_GETTER_DECL, - element: 'getter(C#m)'), - ]), - const Test.clazz( - ''' - abstract class C { - set m(a); - } - ''', - const [ - const Visit(VisitKind.VISIT_ABSTRACT_SETTER_DECL, - element: 'setter(C#m)', - parameters: '(a)'), - const Visit(VisitKind.VISIT_REQUIRED_PARAMETER_DECL, - element: 'parameter(m#a)', - index: 0), - ]), - const Test( - ''' - m(a, b) {} - ''', - const [ - const Visit(VisitKind.VISIT_TOP_LEVEL_FUNCTION_DECL, - element: 'function(m)', - parameters: '(a,b)', - body: '{}'), - const Visit(VisitKind.VISIT_REQUIRED_PARAMETER_DECL, - element: 'parameter(m#a)', - index: 0), - const Visit(VisitKind.VISIT_REQUIRED_PARAMETER_DECL, - element: 'parameter(m#b)', - index: 1), - ]), - const Test( - ''' - m() { - local(a, b) {} - } - ''', - const [ - const Visit(VisitKind.VISIT_TOP_LEVEL_FUNCTION_DECL, - element: 'function(m)', - parameters: '()', - body: '{local(a,b){}}'), - const Visit(VisitKind.VISIT_LOCAL_FUNCTION_DECL, - element: 'function(m#local)', - parameters: '(a,b)', - body: '{}'), - const Visit(VisitKind.VISIT_REQUIRED_PARAMETER_DECL, - element: 'parameter(local#a)', - index: 0), - const Visit(VisitKind.VISIT_REQUIRED_PARAMETER_DECL, - element: 'parameter(local#b)', - index: 1), - ]), - const Test( - ''' - m() => (a, b) {}; - ''', - const [ - const Visit(VisitKind.VISIT_TOP_LEVEL_FUNCTION_DECL, - element: 'function(m)', - parameters: '()', - body: '=>(a,b){};'), - const Visit(VisitKind.VISIT_CLOSURE_DECL, - element: 'function(m#)', - parameters: '(a,b)', - body: '{}'), - const Visit(VisitKind.VISIT_REQUIRED_PARAMETER_DECL, - element: 'parameter(#a)', - index: 0), - const Visit(VisitKind.VISIT_REQUIRED_PARAMETER_DECL, - element: 'parameter(#b)', - index: 1), - ]), - ], - 'Constructor declarations': const [ - const Test.clazz( - ''' - class C { - C(a, b); - } - ''', - const [ - const Visit(VisitKind.VISIT_GENERATIVE_CONSTRUCTOR_DECL, - element: 'generative_constructor(C#)', - parameters: '(a,b)', - body: ';'), - const Visit(VisitKind.VISIT_REQUIRED_PARAMETER_DECL, - element: 'parameter(#a)', - index: 0), - const Visit(VisitKind.VISIT_REQUIRED_PARAMETER_DECL, - element: 'parameter(#b)', - index: 1), - const Visit(VisitKind.VISIT_IMPLICIT_SUPER_CONSTRUCTOR_INVOKE, - element: 'generative_constructor(Object#)', - type: 'Object'), - ], - method: ''), - const Test.clazz( - ''' - class C { - var b; - C(a, this.b); - } - ''', - const [ - const Visit(VisitKind.VISIT_GENERATIVE_CONSTRUCTOR_DECL, - element: 'generative_constructor(C#)', - parameters: '(a,this.b)', - body: ';'), - const Visit(VisitKind.VISIT_REQUIRED_PARAMETER_DECL, - element: 'parameter(#a)', - index: 0), - const Visit(VisitKind.VISIT_REQUIRED_INITIALIZING_FORMAL_DECL, - element: 'initializing_formal(#b)', - index: 1), - const Visit(VisitKind.VISIT_IMPLICIT_SUPER_CONSTRUCTOR_INVOKE, - element: 'generative_constructor(Object#)', - type: 'Object'), - ], - method: ''), - const Test.clazz( - ''' - class C { - var b; - C(a, [this.b = 42]); - } - ''', - const [ - const Visit(VisitKind.VISIT_GENERATIVE_CONSTRUCTOR_DECL, - element: 'generative_constructor(C#)', - parameters: '(a,[this.b=42])', - body: ';'), - const Visit(VisitKind.VISIT_REQUIRED_PARAMETER_DECL, - element: 'parameter(#a)', - index: 0), - const Visit(VisitKind.VISIT_OPTIONAL_INITIALIZING_FORMAL_DECL, - element: 'initializing_formal(#b)', - constant: 42, - index: 1), - const Visit(VisitKind.VISIT_IMPLICIT_SUPER_CONSTRUCTOR_INVOKE, - element: 'generative_constructor(Object#)', - type: 'Object'), - ], - method: ''), - const Test.clazz( - ''' - class C { - var b; - C(a, {this.b: 42}); - } - ''', - const [ - const Visit(VisitKind.VISIT_GENERATIVE_CONSTRUCTOR_DECL, - element: 'generative_constructor(C#)', - parameters: '(a,{this.b: 42})', - body: ';'), - const Visit(VisitKind.VISIT_REQUIRED_PARAMETER_DECL, - element: 'parameter(#a)', - index: 0), - const Visit(VisitKind.VISIT_NAMED_INITIALIZING_FORMAL_DECL, - element: 'initializing_formal(#b)', - constant: 42), - const Visit(VisitKind.VISIT_IMPLICIT_SUPER_CONSTRUCTOR_INVOKE, - element: 'generative_constructor(Object#)', - type: 'Object'), - ], - method: ''), - const Test.clazz( - ''' - class C { - C(a, b) : super(); - } - ''', - const [ - const Visit(VisitKind.VISIT_GENERATIVE_CONSTRUCTOR_DECL, - element: 'generative_constructor(C#)', - parameters: '(a,b)', - body: ';'), - const Visit(VisitKind.VISIT_REQUIRED_PARAMETER_DECL, - element: 'parameter(#a)', - index: 0), - const Visit(VisitKind.VISIT_REQUIRED_PARAMETER_DECL, - element: 'parameter(#b)', - index: 1), - const Visit(VisitKind.VISIT_SUPER_CONSTRUCTOR_INVOKE, - element: 'generative_constructor(Object#)', - type: 'Object', - arguments: '()', - selector: 'CallStructure(arity=0)'), - ], - method: ''), - const Test.clazz( - ''' - class C { - var field; - C(a, b) : this.field = a; - } - ''', - const [ - const Visit(VisitKind.VISIT_GENERATIVE_CONSTRUCTOR_DECL, - element: 'generative_constructor(C#)', - parameters: '(a,b)', - body: ';'), - const Visit(VisitKind.VISIT_REQUIRED_PARAMETER_DECL, - element: 'parameter(#a)', - index: 0), - const Visit(VisitKind.VISIT_REQUIRED_PARAMETER_DECL, - element: 'parameter(#b)', - index: 1), - const Visit(VisitKind.VISIT_FIELD_INITIALIZER, - element: 'field(C#field)', - rhs: 'a'), - const Visit(VisitKind.VISIT_IMPLICIT_SUPER_CONSTRUCTOR_INVOKE, - element: 'generative_constructor(Object#)', - type: 'Object'), - ], - method: ''), - const Test.clazz( - ''' - class C { - var field1; - var field2; - C(a, b) : this.field1 = a, this.field2 = b; - } - ''', - const [ - const Visit(VisitKind.VISIT_GENERATIVE_CONSTRUCTOR_DECL, - element: 'generative_constructor(C#)', - parameters: '(a,b)', - body: ';'), - const Visit(VisitKind.VISIT_REQUIRED_PARAMETER_DECL, - element: 'parameter(#a)', - index: 0), - const Visit(VisitKind.VISIT_REQUIRED_PARAMETER_DECL, - element: 'parameter(#b)', - index: 1), - const Visit(VisitKind.VISIT_FIELD_INITIALIZER, - element: 'field(C#field1)', - rhs: 'a'), - const Visit(VisitKind.VISIT_FIELD_INITIALIZER, - element: 'field(C#field2)', - rhs: 'b'), - const Visit(VisitKind.VISIT_IMPLICIT_SUPER_CONSTRUCTOR_INVOKE, - element: 'generative_constructor(Object#)', - type: 'Object'), - ], - method: ''), - const Test.clazz( - ''' - class C { - C(a, b) : this._(a, b); - C._(a, b); - } - ''', - const [ - const Visit(VisitKind.VISIT_REDIRECTING_GENERATIVE_CONSTRUCTOR_DECL, - element: 'generative_constructor(C#)', - parameters: '(a,b)', - initializers: ':this._(a,b)'), - const Visit(VisitKind.VISIT_REQUIRED_PARAMETER_DECL, - element: 'parameter(#a)', - index: 0), - const Visit(VisitKind.VISIT_REQUIRED_PARAMETER_DECL, - element: 'parameter(#b)', - index: 1), - const Visit(VisitKind.VISIT_THIS_CONSTRUCTOR_INVOKE, - element: 'generative_constructor(C#_)', - arguments: '(a,b)', - selector: 'CallStructure(arity=2)'), - ], - method: ''), - const Test.clazz( - ''' - class C { - factory C(a, b) => null; - } - ''', - const [ - const Visit(VisitKind.VISIT_FACTORY_CONSTRUCTOR_DECL, - element: 'function(C#)', - parameters: '(a,b)', - body: '=>null;'), - const Visit(VisitKind.VISIT_REQUIRED_PARAMETER_DECL, - element: 'parameter(#a)', - index: 0), - const Visit(VisitKind.VISIT_REQUIRED_PARAMETER_DECL, - element: 'parameter(#b)', - index: 1), - ], - method: ''), - const Test.clazz( - ''' - class C { - factory C(a, b) = C._; - C._(a, b); - } - ''', - const [ - const Visit(VisitKind.VISIT_REDIRECTING_FACTORY_CONSTRUCTOR_DECL, - element: 'function(C#)', - parameters: '(a,b)', - target: 'generative_constructor(C#_)', - type: 'C'), - const Visit(VisitKind.VISIT_REQUIRED_PARAMETER_DECL, - element: 'parameter(#a)', - index: 0), - const Visit(VisitKind.VISIT_REQUIRED_PARAMETER_DECL, - element: 'parameter(#b)', - index: 1), - ], - method: ''), - const Test.clazz( - ''' - class C { - factory C(a, b) = D; - } - class D { - D(a, b); - } - ''', - const [ - const Visit(VisitKind.VISIT_REDIRECTING_FACTORY_CONSTRUCTOR_DECL, - element: 'function(C#)', - parameters: '(a,b)', - target: 'generative_constructor(D#)', - type: 'D'), - const Visit(VisitKind.VISIT_REQUIRED_PARAMETER_DECL, - element: 'parameter(#a)', - index: 0), - const Visit(VisitKind.VISIT_REQUIRED_PARAMETER_DECL, - element: 'parameter(#b)', - index: 1), - ], - method: ''), - const Test.clazz( - ''' - class C { - factory C(a, b) = D; - } - class D { - D(a, b); - } - ''', - const [ - const Visit(VisitKind.VISIT_REDIRECTING_FACTORY_CONSTRUCTOR_DECL, - element: 'function(C#)', - parameters: '(a,b)', - target: 'generative_constructor(D#)', - type: 'D'), - const Visit(VisitKind.VISIT_REQUIRED_PARAMETER_DECL, - element: 'parameter(#a)', - index: 0), - const Visit(VisitKind.VISIT_REQUIRED_PARAMETER_DECL, - element: 'parameter(#b)', - index: 1), - ], - method: ''), - const Test.clazz( - ''' - class C { - factory C(a, b) = D; - } - class D { - factory D(a, b) = E>; - } - class E { - E(a, b); - } - ''', - const [ - const Visit(VisitKind.VISIT_REDIRECTING_FACTORY_CONSTRUCTOR_DECL, - element: 'function(C#)', - parameters: '(a,b)', - target: 'function(D#)', - type: 'D'), - const Visit(VisitKind.VISIT_REQUIRED_PARAMETER_DECL, - element: 'parameter(#a)', - index: 0), - const Visit(VisitKind.VISIT_REQUIRED_PARAMETER_DECL, - element: 'parameter(#b)', - index: 1), - ], - method: ''), - ], - "Field declarations": const [ - const Test.clazz( - ''' - class C { - var m; - } - ''', - const [ - const Visit(VisitKind.VISIT_INSTANCE_FIELD_DECL, - element: 'field(C#m)'), - ]), - const Test.clazz( - ''' - class C { - var m, n; - } - ''', - const [ - const Visit(VisitKind.VISIT_INSTANCE_FIELD_DECL, - element: 'field(C#m)'), - ]), - const Test.clazz( - ''' - class C { - var m = 42; - } - ''', - const [ - const Visit(VisitKind.VISIT_INSTANCE_FIELD_DECL, - element: 'field(C#m)', - rhs: 42), - ]), - const Test( - ''' - m() { - var local; - } - ''', - const [ - const Visit(VisitKind.VISIT_TOP_LEVEL_FUNCTION_DECL, - element: 'function(m)', - parameters: '()', - body: '{var local;}'), - const Visit(VisitKind.VISIT_LOCAL_VARIABLE_DECL, - element: 'variable(m#local)'), - ]), - const Test( - ''' - m() { - var local = 42; - } - ''', - const [ - const Visit(VisitKind.VISIT_TOP_LEVEL_FUNCTION_DECL, - element: 'function(m)', - parameters: '()', - body: '{var local=42;}'), - const Visit(VisitKind.VISIT_LOCAL_VARIABLE_DECL, - element: 'variable(m#local)', - rhs: 42), - ]), - const Test( - ''' - m() { - const local = 42; - } - ''', - const [ - const Visit(VisitKind.VISIT_TOP_LEVEL_FUNCTION_DECL, - element: 'function(m)', - parameters: '()', - body: '{const local=42;}'), - const Visit(VisitKind.VISIT_LOCAL_CONSTANT_DECL, - element: 'variable(m#local)', - constant: 42), - ]), - const Test( - ''' - m() { - var local1, local2; - } - ''', - const [ - const Visit(VisitKind.VISIT_TOP_LEVEL_FUNCTION_DECL, - element: 'function(m)', - parameters: '()', - body: '{var local1,local2;}'), - const Visit(VisitKind.VISIT_LOCAL_VARIABLE_DECL, - element: 'variable(m#local1)'), - const Visit(VisitKind.VISIT_LOCAL_VARIABLE_DECL, - element: 'variable(m#local2)'), - ]), - const Test( - ''' - m() { - var local1 = 42, local2 = true; - } - ''', - const [ - const Visit(VisitKind.VISIT_TOP_LEVEL_FUNCTION_DECL, - element: 'function(m)', - parameters: '()', - body: '{var local1=42,local2=true;}'), - const Visit(VisitKind.VISIT_LOCAL_VARIABLE_DECL, - element: 'variable(m#local1)', - rhs: 42), - const Visit(VisitKind.VISIT_LOCAL_VARIABLE_DECL, - element: 'variable(m#local2)', - rhs: true), - ]), - const Test( - ''' - m() { - const local1 = 42, local2 = true; - } - ''', - const [ - const Visit(VisitKind.VISIT_TOP_LEVEL_FUNCTION_DECL, - element: 'function(m)', - parameters: '()', - body: '{const local1=42,local2=true;}'), - const Visit(VisitKind.VISIT_LOCAL_CONSTANT_DECL, - element: 'variable(m#local1)', - constant: 42), - const Visit(VisitKind.VISIT_LOCAL_CONSTANT_DECL, - element: 'variable(m#local2)', - constant: true), - ]), - const Test.clazz( - ''' - class C { - static var m; - } - ''', - const [ - const Visit(VisitKind.VISIT_STATIC_FIELD_DECL, - element: 'field(C#m)'), - ]), - const Test.clazz( - ''' - class C { - static var m, n; - } - ''', - const [ - const Visit(VisitKind.VISIT_STATIC_FIELD_DECL, - element: 'field(C#m)'), - ]), - const Test.clazz( - ''' - class C { - static var k, l, m, n; - } - ''', - const [ - const Visit(VisitKind.VISIT_STATIC_FIELD_DECL, - element: 'field(C#m)'), - ]), - const Test.clazz( - ''' - class C { - static var m = 42; - } - ''', - const [ - const Visit(VisitKind.VISIT_STATIC_FIELD_DECL, - element: 'field(C#m)', - rhs: 42), - ]), - const Test.clazz( - ''' - class C { - static var m = 42, n = true; - } - ''', - const [ - const Visit(VisitKind.VISIT_STATIC_FIELD_DECL, - element: 'field(C#m)', - rhs: 42), - ]), - const Test.clazz( - ''' - class C { - static const m = 42; - } - ''', - const [ - const Visit(VisitKind.VISIT_STATIC_CONSTANT_DECL, - element: 'field(C#m)', - constant: 42), - ]), - const Test( - ''' - var m; - ''', - const [ - const Visit(VisitKind.VISIT_TOP_LEVEL_FIELD_DECL, - element: 'field(m)'), - ]), - const Test( - ''' - var m, n; - ''', - const [ - const Visit(VisitKind.VISIT_TOP_LEVEL_FIELD_DECL, - element: 'field(m)'), - ]), - const Test( - ''' - var m = 42; - ''', - const [ - const Visit(VisitKind.VISIT_TOP_LEVEL_FIELD_DECL, - element: 'field(m)', - rhs: 42), - ]), - const Test( - ''' - const m = 42; - ''', - const [ - const Visit(VisitKind.VISIT_TOP_LEVEL_CONSTANT_DECL, - element: 'field(m)', - constant: 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> DECL_TESTS = const { + 'Function declarations': const [ + const Test( + ''' + m(a, b) {} + ''', + const [ + const Visit(VisitKind.VISIT_TOP_LEVEL_FUNCTION_DECL, + element: 'function(m)', + parameters: '(a,b)', + body: '{}'), + const Visit(VisitKind.VISIT_REQUIRED_PARAMETER_DECL, + element: 'parameter(m#a)', + index: 0), + const Visit(VisitKind.VISIT_REQUIRED_PARAMETER_DECL, + element: 'parameter(m#b)', + index: 1), + ]), + const Test( + ''' + m(a, [b]) {} + ''', + const [ + const Visit(VisitKind.VISIT_TOP_LEVEL_FUNCTION_DECL, + element: 'function(m)', + parameters: '(a,[b])', + body: '{}'), + const Visit(VisitKind.VISIT_REQUIRED_PARAMETER_DECL, + element: 'parameter(m#a)', + index: 0), + const Visit(VisitKind.VISIT_OPTIONAL_PARAMETER_DECL, + element: 'parameter(m#b)', + index: 1, + constant: 'null'), + ]), + const Test( + ''' + m(a, [b = null]) {} + ''', + const [ + const Visit(VisitKind.VISIT_TOP_LEVEL_FUNCTION_DECL, + element: 'function(m)', + parameters: '(a,[b=null])', + body: '{}'), + const Visit(VisitKind.VISIT_REQUIRED_PARAMETER_DECL, + element: 'parameter(m#a)', + index: 0), + const Visit(VisitKind.VISIT_OPTIONAL_PARAMETER_DECL, + element: 'parameter(m#b)', + constant: 'null', + index: 1), + ]), + const Test( + ''' + m(a, [b = 42]) {} + ''', + const [ + const Visit(VisitKind.VISIT_TOP_LEVEL_FUNCTION_DECL, + element: 'function(m)', + parameters: '(a,[b=42])', + body: '{}'), + const Visit(VisitKind.VISIT_REQUIRED_PARAMETER_DECL, + element: 'parameter(m#a)', + index: 0), + const Visit(VisitKind.VISIT_OPTIONAL_PARAMETER_DECL, + element: 'parameter(m#b)', + constant: 42, + index: 1), + ]), + const Test( + ''' + m(a, {b}) {} + ''', + const [ + const Visit(VisitKind.VISIT_TOP_LEVEL_FUNCTION_DECL, + element: 'function(m)', + parameters: '(a,{b})', + body: '{}'), + const Visit(VisitKind.VISIT_REQUIRED_PARAMETER_DECL, + element: 'parameter(m#a)', + index: 0), + const Visit(VisitKind.VISIT_NAMED_PARAMETER_DECL, + element: 'parameter(m#b)', + constant: 'null'), + ]), + const Test( + ''' + m(a, {b: null}) {} + ''', + const [ + const Visit(VisitKind.VISIT_TOP_LEVEL_FUNCTION_DECL, + element: 'function(m)', + parameters: '(a,{b: null})', + body: '{}'), + const Visit(VisitKind.VISIT_REQUIRED_PARAMETER_DECL, + element: 'parameter(m#a)', + index: 0), + const Visit(VisitKind.VISIT_NAMED_PARAMETER_DECL, + element: 'parameter(m#b)', + constant: 'null'), + ]), + const Test( + ''' + m(a, {b:42}) {} + ''', + const [ + const Visit(VisitKind.VISIT_TOP_LEVEL_FUNCTION_DECL, + element: 'function(m)', + parameters: '(a,{b: 42})', + body: '{}'), + const Visit(VisitKind.VISIT_REQUIRED_PARAMETER_DECL, + element: 'parameter(m#a)', + index: 0), + const Visit(VisitKind.VISIT_NAMED_PARAMETER_DECL, + element: 'parameter(m#b)', + constant: 42), + ]), + const Test( + ''' + get m => null; + ''', + const [ + const Visit(VisitKind.VISIT_TOP_LEVEL_GETTER_DECL, + element: 'getter(m)', + body: '=>null;'), + ]), + const Test( + ''' + set m(a) {} + ''', + const [ + const Visit(VisitKind.VISIT_TOP_LEVEL_SETTER_DECL, + element: 'setter(m)', + parameters: '(a)', + body: '{}'), + const Visit(VisitKind.VISIT_REQUIRED_PARAMETER_DECL, + element: 'parameter(m#a)', + index: 0), + ]), + const Test.clazz( + ''' + class C { + static m(a, b) {} + } + ''', + const [ + const Visit(VisitKind.VISIT_STATIC_FUNCTION_DECL, + element: 'function(C#m)', + parameters: '(a,b)', + body: '{}'), + const Visit(VisitKind.VISIT_REQUIRED_PARAMETER_DECL, + element: 'parameter(m#a)', + index: 0), + const Visit(VisitKind.VISIT_REQUIRED_PARAMETER_DECL, + element: 'parameter(m#b)', + index: 1), + ]), + const Test.clazz( + ''' + class C { + static get m => null; + } + ''', + const [ + const Visit(VisitKind.VISIT_STATIC_GETTER_DECL, + element: 'getter(C#m)', + body: '=>null;'), + ]), + const Test.clazz( + ''' + class C { + static set m(a) {} + } + ''', + const [ + const Visit(VisitKind.VISIT_STATIC_SETTER_DECL, + element: 'setter(C#m)', + parameters: '(a)', + body: '{}'), + const Visit(VisitKind.VISIT_REQUIRED_PARAMETER_DECL, + element: 'parameter(m#a)', + index: 0), + ]), + const Test.clazz( + ''' + class C { + m(a, b) {} + } + ''', + const [ + const Visit(VisitKind.VISIT_INSTANCE_METHOD_DECL, + element: 'function(C#m)', + parameters: '(a,b)', + body: '{}'), + const Visit(VisitKind.VISIT_REQUIRED_PARAMETER_DECL, + element: 'parameter(m#a)', + index: 0), + const Visit(VisitKind.VISIT_REQUIRED_PARAMETER_DECL, + element: 'parameter(m#b)', + index: 1), + ]), + const Test.clazz( + ''' + class C { + get m => null; + } + ''', + const [ + const Visit(VisitKind.VISIT_INSTANCE_GETTER_DECL, + element: 'getter(C#m)', + body: '=>null;'), + ]), + const Test.clazz( + ''' + class C { + set m(a) {} + } + ''', + const [ + const Visit(VisitKind.VISIT_INSTANCE_SETTER_DECL, + element: 'setter(C#m)', + parameters: '(a)', + body: '{}'), + const Visit(VisitKind.VISIT_REQUIRED_PARAMETER_DECL, + element: 'parameter(m#a)', + index: 0), + ]), + const Test.clazz( + ''' + abstract class C { + m(a, b); + } + ''', + const [ + const Visit(VisitKind.VISIT_ABSTRACT_METHOD_DECL, + element: 'function(C#m)', + parameters: '(a,b)'), + const Visit(VisitKind.VISIT_REQUIRED_PARAMETER_DECL, + element: 'parameter(m#a)', + index: 0), + const Visit(VisitKind.VISIT_REQUIRED_PARAMETER_DECL, + element: 'parameter(m#b)', + index: 1), + ]), + const Test.clazz( + ''' + abstract class C { + get m; + } + ''', + const [ + const Visit(VisitKind.VISIT_ABSTRACT_GETTER_DECL, + element: 'getter(C#m)'), + ]), + const Test.clazz( + ''' + abstract class C { + set m(a); + } + ''', + const [ + const Visit(VisitKind.VISIT_ABSTRACT_SETTER_DECL, + element: 'setter(C#m)', + parameters: '(a)'), + const Visit(VisitKind.VISIT_REQUIRED_PARAMETER_DECL, + element: 'parameter(m#a)', + index: 0), + ]), + const Test( + ''' + m(a, b) {} + ''', + const [ + const Visit(VisitKind.VISIT_TOP_LEVEL_FUNCTION_DECL, + element: 'function(m)', + parameters: '(a,b)', + body: '{}'), + const Visit(VisitKind.VISIT_REQUIRED_PARAMETER_DECL, + element: 'parameter(m#a)', + index: 0), + const Visit(VisitKind.VISIT_REQUIRED_PARAMETER_DECL, + element: 'parameter(m#b)', + index: 1), + ]), + const Test( + ''' + m() { + local(a, b) {} + } + ''', + const [ + const Visit(VisitKind.VISIT_TOP_LEVEL_FUNCTION_DECL, + element: 'function(m)', + parameters: '()', + body: '{local(a,b){}}'), + const Visit(VisitKind.VISIT_LOCAL_FUNCTION_DECL, + element: 'function(m#local)', + parameters: '(a,b)', + body: '{}'), + const Visit(VisitKind.VISIT_REQUIRED_PARAMETER_DECL, + element: 'parameter(local#a)', + index: 0), + const Visit(VisitKind.VISIT_REQUIRED_PARAMETER_DECL, + element: 'parameter(local#b)', + index: 1), + ]), + const Test( + ''' + m() => (a, b) {}; + ''', + const [ + const Visit(VisitKind.VISIT_TOP_LEVEL_FUNCTION_DECL, + element: 'function(m)', + parameters: '()', + body: '=>(a,b){};'), + const Visit(VisitKind.VISIT_CLOSURE_DECL, + element: 'function(m#)', + parameters: '(a,b)', + body: '{}'), + const Visit(VisitKind.VISIT_REQUIRED_PARAMETER_DECL, + element: 'parameter(#a)', + index: 0), + const Visit(VisitKind.VISIT_REQUIRED_PARAMETER_DECL, + element: 'parameter(#b)', + index: 1), + ]), + ], + 'Constructor declarations': const [ + const Test.clazz( + ''' + class C { + C(a, b); + } + ''', + const [ + const Visit(VisitKind.VISIT_GENERATIVE_CONSTRUCTOR_DECL, + element: 'generative_constructor(C#)', + parameters: '(a,b)', + body: ';'), + const Visit(VisitKind.VISIT_REQUIRED_PARAMETER_DECL, + element: 'parameter(#a)', + index: 0), + const Visit(VisitKind.VISIT_REQUIRED_PARAMETER_DECL, + element: 'parameter(#b)', + index: 1), + const Visit(VisitKind.VISIT_IMPLICIT_SUPER_CONSTRUCTOR_INVOKE, + element: 'generative_constructor(Object#)', + type: 'Object'), + ], + method: ''), + const Test.clazz( + ''' + class C { + var b; + C(a, this.b); + } + ''', + const [ + const Visit(VisitKind.VISIT_GENERATIVE_CONSTRUCTOR_DECL, + element: 'generative_constructor(C#)', + parameters: '(a,this.b)', + body: ';'), + const Visit(VisitKind.VISIT_REQUIRED_PARAMETER_DECL, + element: 'parameter(#a)', + index: 0), + const Visit(VisitKind.VISIT_REQUIRED_INITIALIZING_FORMAL_DECL, + element: 'initializing_formal(#b)', + index: 1), + const Visit(VisitKind.VISIT_IMPLICIT_SUPER_CONSTRUCTOR_INVOKE, + element: 'generative_constructor(Object#)', + type: 'Object'), + ], + method: ''), + const Test.clazz( + ''' + class C { + var b; + C(a, [this.b = 42]); + } + ''', + const [ + const Visit(VisitKind.VISIT_GENERATIVE_CONSTRUCTOR_DECL, + element: 'generative_constructor(C#)', + parameters: '(a,[this.b=42])', + body: ';'), + const Visit(VisitKind.VISIT_REQUIRED_PARAMETER_DECL, + element: 'parameter(#a)', + index: 0), + const Visit(VisitKind.VISIT_OPTIONAL_INITIALIZING_FORMAL_DECL, + element: 'initializing_formal(#b)', + constant: 42, + index: 1), + const Visit(VisitKind.VISIT_IMPLICIT_SUPER_CONSTRUCTOR_INVOKE, + element: 'generative_constructor(Object#)', + type: 'Object'), + ], + method: ''), + const Test.clazz( + ''' + class C { + var b; + C(a, {this.b: 42}); + } + ''', + const [ + const Visit(VisitKind.VISIT_GENERATIVE_CONSTRUCTOR_DECL, + element: 'generative_constructor(C#)', + parameters: '(a,{this.b: 42})', + body: ';'), + const Visit(VisitKind.VISIT_REQUIRED_PARAMETER_DECL, + element: 'parameter(#a)', + index: 0), + const Visit(VisitKind.VISIT_NAMED_INITIALIZING_FORMAL_DECL, + element: 'initializing_formal(#b)', + constant: 42), + const Visit(VisitKind.VISIT_IMPLICIT_SUPER_CONSTRUCTOR_INVOKE, + element: 'generative_constructor(Object#)', + type: 'Object'), + ], + method: ''), + const Test.clazz( + ''' + class C { + C(a, b) : super(); + } + ''', + const [ + const Visit(VisitKind.VISIT_GENERATIVE_CONSTRUCTOR_DECL, + element: 'generative_constructor(C#)', + parameters: '(a,b)', + body: ';'), + const Visit(VisitKind.VISIT_REQUIRED_PARAMETER_DECL, + element: 'parameter(#a)', + index: 0), + const Visit(VisitKind.VISIT_REQUIRED_PARAMETER_DECL, + element: 'parameter(#b)', + index: 1), + const Visit(VisitKind.VISIT_SUPER_CONSTRUCTOR_INVOKE, + element: 'generative_constructor(Object#)', + type: 'Object', + arguments: '()', + selector: 'CallStructure(arity=0)'), + ], + method: ''), + const Test.clazz( + ''' + class C { + var field; + C(a, b) : this.field = a; + } + ''', + const [ + const Visit(VisitKind.VISIT_GENERATIVE_CONSTRUCTOR_DECL, + element: 'generative_constructor(C#)', + parameters: '(a,b)', + body: ';'), + const Visit(VisitKind.VISIT_REQUIRED_PARAMETER_DECL, + element: 'parameter(#a)', + index: 0), + const Visit(VisitKind.VISIT_REQUIRED_PARAMETER_DECL, + element: 'parameter(#b)', + index: 1), + const Visit(VisitKind.VISIT_FIELD_INITIALIZER, + element: 'field(C#field)', + rhs: 'a'), + const Visit(VisitKind.VISIT_IMPLICIT_SUPER_CONSTRUCTOR_INVOKE, + element: 'generative_constructor(Object#)', + type: 'Object'), + ], + method: ''), + const Test.clazz( + ''' + class C { + var field1; + var field2; + C(a, b) : this.field1 = a, this.field2 = b; + } + ''', + const [ + const Visit(VisitKind.VISIT_GENERATIVE_CONSTRUCTOR_DECL, + element: 'generative_constructor(C#)', + parameters: '(a,b)', + body: ';'), + const Visit(VisitKind.VISIT_REQUIRED_PARAMETER_DECL, + element: 'parameter(#a)', + index: 0), + const Visit(VisitKind.VISIT_REQUIRED_PARAMETER_DECL, + element: 'parameter(#b)', + index: 1), + const Visit(VisitKind.VISIT_FIELD_INITIALIZER, + element: 'field(C#field1)', + rhs: 'a'), + const Visit(VisitKind.VISIT_FIELD_INITIALIZER, + element: 'field(C#field2)', + rhs: 'b'), + const Visit(VisitKind.VISIT_IMPLICIT_SUPER_CONSTRUCTOR_INVOKE, + element: 'generative_constructor(Object#)', + type: 'Object'), + ], + method: ''), + const Test.clazz( + ''' + class C { + C(a, b) : this._(a, b); + C._(a, b); + } + ''', + const [ + const Visit(VisitKind.VISIT_REDIRECTING_GENERATIVE_CONSTRUCTOR_DECL, + element: 'generative_constructor(C#)', + parameters: '(a,b)', + initializers: ':this._(a,b)'), + const Visit(VisitKind.VISIT_REQUIRED_PARAMETER_DECL, + element: 'parameter(#a)', + index: 0), + const Visit(VisitKind.VISIT_REQUIRED_PARAMETER_DECL, + element: 'parameter(#b)', + index: 1), + const Visit(VisitKind.VISIT_THIS_CONSTRUCTOR_INVOKE, + element: 'generative_constructor(C#_)', + arguments: '(a,b)', + selector: 'CallStructure(arity=2)'), + ], + method: ''), + const Test.clazz( + ''' + class C { + factory C(a, b) => null; + } + ''', + const [ + const Visit(VisitKind.VISIT_FACTORY_CONSTRUCTOR_DECL, + element: 'function(C#)', + parameters: '(a,b)', + body: '=>null;'), + const Visit(VisitKind.VISIT_REQUIRED_PARAMETER_DECL, + element: 'parameter(#a)', + index: 0), + const Visit(VisitKind.VISIT_REQUIRED_PARAMETER_DECL, + element: 'parameter(#b)', + index: 1), + ], + method: ''), + const Test.clazz( + ''' + class C { + factory C(a, b) = C._; + C._(a, b); + } + ''', + const [ + const Visit(VisitKind.VISIT_REDIRECTING_FACTORY_CONSTRUCTOR_DECL, + element: 'function(C#)', + parameters: '(a,b)', + target: 'generative_constructor(C#_)', + type: 'C'), + const Visit(VisitKind.VISIT_REQUIRED_PARAMETER_DECL, + element: 'parameter(#a)', + index: 0), + const Visit(VisitKind.VISIT_REQUIRED_PARAMETER_DECL, + element: 'parameter(#b)', + index: 1), + ], + method: ''), + const Test.clazz( + ''' + class C { + factory C(a, b) = D; + } + class D { + D(a, b); + } + ''', + const [ + const Visit(VisitKind.VISIT_REDIRECTING_FACTORY_CONSTRUCTOR_DECL, + element: 'function(C#)', + parameters: '(a,b)', + target: 'generative_constructor(D#)', + type: 'D'), + const Visit(VisitKind.VISIT_REQUIRED_PARAMETER_DECL, + element: 'parameter(#a)', + index: 0), + const Visit(VisitKind.VISIT_REQUIRED_PARAMETER_DECL, + element: 'parameter(#b)', + index: 1), + ], + method: ''), + const Test.clazz( + ''' + class C { + factory C(a, b) = D; + } + class D { + D(a, b); + } + ''', + const [ + const Visit(VisitKind.VISIT_REDIRECTING_FACTORY_CONSTRUCTOR_DECL, + element: 'function(C#)', + parameters: '(a,b)', + target: 'generative_constructor(D#)', + type: 'D'), + const Visit(VisitKind.VISIT_REQUIRED_PARAMETER_DECL, + element: 'parameter(#a)', + index: 0), + const Visit(VisitKind.VISIT_REQUIRED_PARAMETER_DECL, + element: 'parameter(#b)', + index: 1), + ], + method: ''), + const Test.clazz( + ''' + class C { + factory C(a, b) = D; + } + class D { + factory D(a, b) = E>; + } + class E { + E(a, b); + } + ''', + const [ + const Visit(VisitKind.VISIT_REDIRECTING_FACTORY_CONSTRUCTOR_DECL, + element: 'function(C#)', + parameters: '(a,b)', + target: 'function(D#)', + type: 'D'), + const Visit(VisitKind.VISIT_REQUIRED_PARAMETER_DECL, + element: 'parameter(#a)', + index: 0), + const Visit(VisitKind.VISIT_REQUIRED_PARAMETER_DECL, + element: 'parameter(#b)', + index: 1), + ], + method: ''), + ], + "Field declarations": const [ + const Test.clazz( + ''' + class C { + var m; + } + ''', + const [ + const Visit(VisitKind.VISIT_INSTANCE_FIELD_DECL, + element: 'field(C#m)'), + ]), + const Test.clazz( + ''' + class C { + var m, n; + } + ''', + const [ + const Visit(VisitKind.VISIT_INSTANCE_FIELD_DECL, + element: 'field(C#m)'), + ]), + const Test.clazz( + ''' + class C { + var m = 42; + } + ''', + const [ + const Visit(VisitKind.VISIT_INSTANCE_FIELD_DECL, + element: 'field(C#m)', + rhs: 42), + ]), + const Test( + ''' + m() { + var local; + } + ''', + const [ + const Visit(VisitKind.VISIT_TOP_LEVEL_FUNCTION_DECL, + element: 'function(m)', + parameters: '()', + body: '{var local;}'), + const Visit(VisitKind.VISIT_LOCAL_VARIABLE_DECL, + element: 'variable(m#local)'), + ]), + const Test( + ''' + m() { + var local = 42; + } + ''', + const [ + const Visit(VisitKind.VISIT_TOP_LEVEL_FUNCTION_DECL, + element: 'function(m)', + parameters: '()', + body: '{var local=42;}'), + const Visit(VisitKind.VISIT_LOCAL_VARIABLE_DECL, + element: 'variable(m#local)', + rhs: 42), + ]), + const Test( + ''' + m() { + const local = 42; + } + ''', + const [ + const Visit(VisitKind.VISIT_TOP_LEVEL_FUNCTION_DECL, + element: 'function(m)', + parameters: '()', + body: '{const local=42;}'), + const Visit(VisitKind.VISIT_LOCAL_CONSTANT_DECL, + element: 'variable(m#local)', + constant: 42), + ]), + const Test( + ''' + m() { + var local1, local2; + } + ''', + const [ + const Visit(VisitKind.VISIT_TOP_LEVEL_FUNCTION_DECL, + element: 'function(m)', + parameters: '()', + body: '{var local1,local2;}'), + const Visit(VisitKind.VISIT_LOCAL_VARIABLE_DECL, + element: 'variable(m#local1)'), + const Visit(VisitKind.VISIT_LOCAL_VARIABLE_DECL, + element: 'variable(m#local2)'), + ]), + const Test( + ''' + m() { + var local1 = 42, local2 = true; + } + ''', + const [ + const Visit(VisitKind.VISIT_TOP_LEVEL_FUNCTION_DECL, + element: 'function(m)', + parameters: '()', + body: '{var local1=42,local2=true;}'), + const Visit(VisitKind.VISIT_LOCAL_VARIABLE_DECL, + element: 'variable(m#local1)', + rhs: 42), + const Visit(VisitKind.VISIT_LOCAL_VARIABLE_DECL, + element: 'variable(m#local2)', + rhs: true), + ]), + const Test( + ''' + m() { + const local1 = 42, local2 = true; + } + ''', + const [ + const Visit(VisitKind.VISIT_TOP_LEVEL_FUNCTION_DECL, + element: 'function(m)', + parameters: '()', + body: '{const local1=42,local2=true;}'), + const Visit(VisitKind.VISIT_LOCAL_CONSTANT_DECL, + element: 'variable(m#local1)', + constant: 42), + const Visit(VisitKind.VISIT_LOCAL_CONSTANT_DECL, + element: 'variable(m#local2)', + constant: true), + ]), + const Test.clazz( + ''' + class C { + static var m; + } + ''', + const [ + const Visit(VisitKind.VISIT_STATIC_FIELD_DECL, + element: 'field(C#m)'), + ]), + const Test.clazz( + ''' + class C { + static var m, n; + } + ''', + const [ + const Visit(VisitKind.VISIT_STATIC_FIELD_DECL, + element: 'field(C#m)'), + ]), + const Test.clazz( + ''' + class C { + static var k, l, m, n; + } + ''', + const [ + const Visit(VisitKind.VISIT_STATIC_FIELD_DECL, + element: 'field(C#m)'), + ]), + const Test.clazz( + ''' + class C { + static var m = 42; + } + ''', + const [ + const Visit(VisitKind.VISIT_STATIC_FIELD_DECL, + element: 'field(C#m)', + rhs: 42), + ]), + const Test.clazz( + ''' + class C { + static var m = 42, n = true; + } + ''', + const [ + const Visit(VisitKind.VISIT_STATIC_FIELD_DECL, + element: 'field(C#m)', + rhs: 42), + ]), + const Test.clazz( + ''' + class C { + static const m = 42; + } + ''', + const [ + const Visit(VisitKind.VISIT_STATIC_CONSTANT_DECL, + element: 'field(C#m)', + constant: 42), + ]), + const Test( + ''' + var m; + ''', + const [ + const Visit(VisitKind.VISIT_TOP_LEVEL_FIELD_DECL, + element: 'field(m)'), + ]), + const Test( + ''' + var m, n; + ''', + const [ + const Visit(VisitKind.VISIT_TOP_LEVEL_FIELD_DECL, + element: 'field(m)'), + ]), + const Test( + ''' + var m = 42; + ''', + const [ + const Visit(VisitKind.VISIT_TOP_LEVEL_FIELD_DECL, + element: 'field(m)', + rhs: 42), + ]), + const Test( + ''' + const m = 42; + ''', + const [ + const Visit(VisitKind.VISIT_TOP_LEVEL_CONSTANT_DECL, + element: 'field(m)', + constant: 42), + ]), + ], +}; diff --git a/tests/compiler/dart2js/semantic_visitor_test_decl_visitor.dart b/tests/compiler/dart2js/semantic_visitor_test_decl_visitor.dart index 253f1f38901..5382a29c309 100644 --- a/tests/compiler/dart2js/semantic_visitor_test_decl_visitor.dart +++ b/tests/compiler/dart2js/semantic_visitor_test_decl_visitor.dart @@ -1,483 +1,483 @@ -// 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; - -class SemanticDeclarationTestVisitor extends SemanticTestVisitor { - - SemanticDeclarationTestVisitor(TreeElements elements) : super(elements); - - @override - errorUnresolvedSuperConstructorInvoke( - Send node, - Element element, - NodeList arguments, - Selector selector, - arg) { - // TODO: implement errorUnresolvedSuperConstructorInvoke - } - - @override - errorUnresolvedThisConstructorInvoke( - Send node, - Element element, - NodeList arguments, - Selector selector, - arg) { - // TODO: implement errorUnresolvedThisConstructorInvoke - } - - @override - visitAbstractMethodDeclaration( - FunctionExpression node, - MethodElement method, - NodeList parameters, - arg) { - visits.add(new Visit(VisitKind.VISIT_ABSTRACT_METHOD_DECL, - element: method, parameters: parameters)); - applyParameters(parameters, arg); - } - - @override - visitClosureDeclaration( - FunctionExpression node, - LocalFunctionElement function, - NodeList parameters, - Node body, - arg) { - visits.add(new Visit(VisitKind.VISIT_CLOSURE_DECL, - element: function, parameters: parameters, body: body)); - applyParameters(parameters, arg); - apply(body, arg); - } - - @override - visitFactoryConstructorDeclaration( - FunctionExpression node, - ConstructorElement constructor, - NodeList parameters, - Node body, - arg) { - visits.add(new Visit(VisitKind.VISIT_FACTORY_CONSTRUCTOR_DECL, - element: constructor, parameters: parameters, body: body)); - applyParameters(parameters, arg); - apply(body, arg); - } - - @override - visitFieldInitializer( - SendSet node, - FieldElement field, - Node initializer, - arg) { - visits.add(new Visit(VisitKind.VISIT_FIELD_INITIALIZER, - element: field, rhs: initializer)); - apply(initializer, arg); - } - - @override - visitGenerativeConstructorDeclaration( - FunctionExpression node, - ConstructorElement constructor, - NodeList parameters, - NodeList initializers, - Node body, - arg) { - visits.add(new Visit(VisitKind.VISIT_GENERATIVE_CONSTRUCTOR_DECL, - element: constructor, parameters: parameters, body: body)); - applyParameters(parameters, arg); - applyInitializers(node, arg); - apply(body, arg); - } - - @override - visitInstanceMethodDeclaration( - FunctionExpression node, - MethodElement method, - NodeList parameters, - Node body, - arg) { - visits.add(new Visit(VisitKind.VISIT_INSTANCE_METHOD_DECL, - element: method, parameters: parameters, body: body)); - applyParameters(parameters, arg); - apply(body, arg); - } - - @override - visitLocalFunctionDeclaration( - FunctionExpression node, - LocalFunctionElement function, - NodeList parameters, - Node body, - arg) { - visits.add(new Visit(VisitKind.VISIT_LOCAL_FUNCTION_DECL, - element: function, parameters: parameters, body: body)); - applyParameters(parameters, arg); - apply(body, arg); - } - - @override - visitRedirectingFactoryConstructorDeclaration( - FunctionExpression node, - ConstructorElement constructor, - NodeList parameters, - InterfaceType redirectionType, - ConstructorElement redirectionTarget, - arg) { - visits.add(new Visit( - VisitKind.VISIT_REDIRECTING_FACTORY_CONSTRUCTOR_DECL, - element: constructor, - parameters: parameters, - target: redirectionTarget, - type: redirectionType)); - applyParameters(parameters, arg); - } - - @override - visitRedirectingGenerativeConstructorDeclaration( - FunctionExpression node, - ConstructorElement constructor, - NodeList parameters, - NodeList initializers, - arg) { - visits.add(new Visit( - VisitKind.VISIT_REDIRECTING_GENERATIVE_CONSTRUCTOR_DECL, - element: constructor, - parameters: parameters, - initializers: initializers)); - applyParameters(parameters, arg); - applyInitializers(node, arg); - } - - @override - visitStaticFunctionDeclaration( - FunctionExpression node, - MethodElement function, - NodeList parameters, - Node body, - arg) { - visits.add(new Visit(VisitKind.VISIT_STATIC_FUNCTION_DECL, - element: function, parameters: parameters, body: body)); - applyParameters(parameters, arg); - apply(body, arg); - } - - @override - visitSuperConstructorInvoke( - Send node, - ConstructorElement superConstructor, - InterfaceType type, - NodeList arguments, - CallStructure callStructure, - arg) { - visits.add(new Visit(VisitKind.VISIT_SUPER_CONSTRUCTOR_INVOKE, - element: superConstructor, type: type, - arguments: arguments, selector: callStructure)); - super.visitSuperConstructorInvoke( - node, superConstructor, type, arguments, callStructure, arg); - } - - @override - visitImplicitSuperConstructorInvoke( - FunctionExpression node, - ConstructorElement superConstructor, - InterfaceType type, - arg) { - visits.add(new Visit(VisitKind.VISIT_IMPLICIT_SUPER_CONSTRUCTOR_INVOKE, - element: superConstructor, type: type)); - super.visitImplicitSuperConstructorInvoke( - node, superConstructor, type, arg); - } - - @override - visitThisConstructorInvoke( - Send node, - ConstructorElement thisConstructor, - NodeList arguments, - CallStructure callStructure, - arg) { - visits.add(new Visit(VisitKind.VISIT_THIS_CONSTRUCTOR_INVOKE, - element: thisConstructor, - arguments: arguments, selector: callStructure)); - super.visitThisConstructorInvoke( - node, thisConstructor, arguments, callStructure, arg); - } - - @override - visitTopLevelFunctionDeclaration( - FunctionExpression node, - MethodElement function, - NodeList parameters, - Node body, - arg) { - visits.add(new Visit(VisitKind.VISIT_TOP_LEVEL_FUNCTION_DECL, - element: function, parameters: parameters, body: body)); - applyParameters(parameters, arg); - apply(body, arg); - } - - @override - errorUnresolvedFieldInitializer( - SendSet node, - Element element, - Node initializer, - arg) { - // TODO: implement errorUnresolvedFieldInitializer - } - - @override - visitOptionalParameterDeclaration( - VariableDefinitions node, - Node definition, - ParameterElement parameter, - ConstantExpression defaultValue, - int index, - arg) { - visits.add(new Visit(VisitKind.VISIT_OPTIONAL_PARAMETER_DECL, - element: parameter, - constant: defaultValue != null ? defaultValue.getText() : null, - index: index)); - } - - @override - visitParameterDeclaration( - VariableDefinitions node, - Node definition, - ParameterElement parameter, - int index, - arg) { - visits.add(new Visit(VisitKind.VISIT_REQUIRED_PARAMETER_DECL, - element: parameter, index: index)); - } - - @override - visitInitializingFormalDeclaration( - VariableDefinitions node, - Node definition, - InitializingFormalElement initializingFormal, - int index, - arg) { - visits.add(new Visit(VisitKind.VISIT_REQUIRED_INITIALIZING_FORMAL_DECL, - element: initializingFormal, index: index)); - } - - @override - visitLocalVariableDeclaration( - VariableDefinitions node, - Node definition, - LocalVariableElement variable, - Node initializer, - arg) { - visits.add(new Visit(VisitKind.VISIT_LOCAL_VARIABLE_DECL, - element: variable, rhs: initializer)); - if (initializer != null) { - apply(initializer, arg); - } - } - - @override - visitLocalConstantDeclaration( - VariableDefinitions node, - Node definition, - LocalVariableElement variable, - ConstantExpression constant, - arg) { - visits.add(new Visit(VisitKind.VISIT_LOCAL_CONSTANT_DECL, - element: variable, constant: constant.getText())); - } - - @override - visitNamedInitializingFormalDeclaration( - VariableDefinitions node, - Node definition, - InitializingFormalElement initializingFormal, - ConstantExpression defaultValue, - arg) { - visits.add(new Visit(VisitKind.VISIT_NAMED_INITIALIZING_FORMAL_DECL, - element: initializingFormal, - constant: defaultValue != null ? defaultValue.getText() : null)); - } - - @override - visitNamedParameterDeclaration( - VariableDefinitions node, - Node definition, - ParameterElement parameter, - ConstantExpression defaultValue, - arg) { - visits.add(new Visit(VisitKind.VISIT_NAMED_PARAMETER_DECL, - element: parameter, - constant: defaultValue != null ? defaultValue.getText() : null)); - } - - @override - visitOptionalInitializingFormalDeclaration( - VariableDefinitions node, - Node definition, - InitializingFormalElement initializingFormal, - ConstantExpression defaultValue, - int index, - arg) { - visits.add(new Visit(VisitKind.VISIT_OPTIONAL_INITIALIZING_FORMAL_DECL, - element: initializingFormal, - constant: defaultValue != null ? defaultValue.getText() : null, - index: index)); - } - - @override - visitInstanceFieldDeclaration( - VariableDefinitions node, - Node definition, - FieldElement field, - Node initializer, - arg) { - visits.add(new Visit(VisitKind.VISIT_INSTANCE_FIELD_DECL, - element: field, rhs: initializer)); - if (initializer != null) { - apply(initializer, arg); - } - } - - @override - visitStaticConstantDeclaration( - VariableDefinitions node, - Node definition, - FieldElement field, - ConstantExpression constant, - arg) { - visits.add(new Visit(VisitKind.VISIT_STATIC_CONSTANT_DECL, - element: field, constant: constant.getText())); - } - - @override - visitStaticFieldDeclaration( - VariableDefinitions node, - Node definition, - FieldElement field, - Node initializer, - arg) { - visits.add(new Visit(VisitKind.VISIT_STATIC_FIELD_DECL, - element: field, rhs: initializer)); - if (initializer != null) { - apply(initializer, arg); - } - } - - @override - visitTopLevelConstantDeclaration( - VariableDefinitions node, - Node definition, - FieldElement field, - ConstantExpression constant, - arg) { - visits.add(new Visit(VisitKind.VISIT_TOP_LEVEL_CONSTANT_DECL, - element: field, constant: constant.getText())); - } - - @override - visitTopLevelFieldDeclaration( - VariableDefinitions node, - Node definition, - FieldElement field, - Node initializer, - arg) { - visits.add(new Visit(VisitKind.VISIT_TOP_LEVEL_FIELD_DECL, - element: field, rhs: initializer)); - if (initializer != null) { - apply(initializer, arg); - } - } - - @override - visitAbstractGetterDeclaration( - FunctionExpression node, - MethodElement getter, - arg) { - visits.add(new Visit(VisitKind.VISIT_ABSTRACT_GETTER_DECL, - element: getter)); - } - - @override - visitAbstractSetterDeclaration( - FunctionExpression node, - MethodElement setter, - NodeList parameters, - arg) { - visits.add(new Visit(VisitKind.VISIT_ABSTRACT_SETTER_DECL, - element: setter, parameters: parameters)); - applyParameters(parameters, arg); - } - - @override - visitInstanceGetterDeclaration( - FunctionExpression node, - MethodElement getter, - Node body, - arg) { - visits.add(new Visit(VisitKind.VISIT_INSTANCE_GETTER_DECL, - element: getter, body: body)); - apply(body, arg); - } - - @override - visitInstanceSetterDeclaration( - FunctionExpression node, - MethodElement setter, - NodeList parameters, - Node body, - arg) { - visits.add(new Visit(VisitKind.VISIT_INSTANCE_SETTER_DECL, - element: setter, parameters: parameters, body: body)); - applyParameters(parameters, arg); - apply(body, arg); - } - - @override - visitTopLevelGetterDeclaration( - FunctionExpression node, - MethodElement getter, - Node body, - arg) { - visits.add(new Visit(VisitKind.VISIT_TOP_LEVEL_GETTER_DECL, - element: getter, body: body)); - apply(body, arg); - } - - @override - visitTopLevelSetterDeclaration( - FunctionExpression node, - MethodElement setter, - NodeList parameters, - Node body, - arg) { - visits.add(new Visit(VisitKind.VISIT_TOP_LEVEL_SETTER_DECL, - element: setter, parameters: parameters, body: body)); - applyParameters(parameters, arg); - apply(body, arg); - } - - @override - visitStaticGetterDeclaration( - FunctionExpression node, - MethodElement getter, - Node body, - arg) { - visits.add(new Visit(VisitKind.VISIT_STATIC_GETTER_DECL, - element: getter, body: body)); - apply(body, arg); - } - - @override - visitStaticSetterDeclaration( - FunctionExpression node, - MethodElement setter, - NodeList parameters, - Node body, - arg) { - visits.add(new Visit(VisitKind.VISIT_STATIC_SETTER_DECL, - element: setter, parameters: parameters, body: body)); - applyParameters(parameters, arg); - apply(body, arg); - } -} +// 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; + +class SemanticDeclarationTestVisitor extends SemanticTestVisitor { + + SemanticDeclarationTestVisitor(TreeElements elements) : super(elements); + + @override + errorUnresolvedSuperConstructorInvoke( + Send node, + Element element, + NodeList arguments, + Selector selector, + arg) { + // TODO: implement errorUnresolvedSuperConstructorInvoke + } + + @override + errorUnresolvedThisConstructorInvoke( + Send node, + Element element, + NodeList arguments, + Selector selector, + arg) { + // TODO: implement errorUnresolvedThisConstructorInvoke + } + + @override + visitAbstractMethodDeclaration( + FunctionExpression node, + MethodElement method, + NodeList parameters, + arg) { + visits.add(new Visit(VisitKind.VISIT_ABSTRACT_METHOD_DECL, + element: method, parameters: parameters)); + applyParameters(parameters, arg); + } + + @override + visitClosureDeclaration( + FunctionExpression node, + LocalFunctionElement function, + NodeList parameters, + Node body, + arg) { + visits.add(new Visit(VisitKind.VISIT_CLOSURE_DECL, + element: function, parameters: parameters, body: body)); + applyParameters(parameters, arg); + apply(body, arg); + } + + @override + visitFactoryConstructorDeclaration( + FunctionExpression node, + ConstructorElement constructor, + NodeList parameters, + Node body, + arg) { + visits.add(new Visit(VisitKind.VISIT_FACTORY_CONSTRUCTOR_DECL, + element: constructor, parameters: parameters, body: body)); + applyParameters(parameters, arg); + apply(body, arg); + } + + @override + visitFieldInitializer( + SendSet node, + FieldElement field, + Node initializer, + arg) { + visits.add(new Visit(VisitKind.VISIT_FIELD_INITIALIZER, + element: field, rhs: initializer)); + apply(initializer, arg); + } + + @override + visitGenerativeConstructorDeclaration( + FunctionExpression node, + ConstructorElement constructor, + NodeList parameters, + NodeList initializers, + Node body, + arg) { + visits.add(new Visit(VisitKind.VISIT_GENERATIVE_CONSTRUCTOR_DECL, + element: constructor, parameters: parameters, body: body)); + applyParameters(parameters, arg); + applyInitializers(node, arg); + apply(body, arg); + } + + @override + visitInstanceMethodDeclaration( + FunctionExpression node, + MethodElement method, + NodeList parameters, + Node body, + arg) { + visits.add(new Visit(VisitKind.VISIT_INSTANCE_METHOD_DECL, + element: method, parameters: parameters, body: body)); + applyParameters(parameters, arg); + apply(body, arg); + } + + @override + visitLocalFunctionDeclaration( + FunctionExpression node, + LocalFunctionElement function, + NodeList parameters, + Node body, + arg) { + visits.add(new Visit(VisitKind.VISIT_LOCAL_FUNCTION_DECL, + element: function, parameters: parameters, body: body)); + applyParameters(parameters, arg); + apply(body, arg); + } + + @override + visitRedirectingFactoryConstructorDeclaration( + FunctionExpression node, + ConstructorElement constructor, + NodeList parameters, + InterfaceType redirectionType, + ConstructorElement redirectionTarget, + arg) { + visits.add(new Visit( + VisitKind.VISIT_REDIRECTING_FACTORY_CONSTRUCTOR_DECL, + element: constructor, + parameters: parameters, + target: redirectionTarget, + type: redirectionType)); + applyParameters(parameters, arg); + } + + @override + visitRedirectingGenerativeConstructorDeclaration( + FunctionExpression node, + ConstructorElement constructor, + NodeList parameters, + NodeList initializers, + arg) { + visits.add(new Visit( + VisitKind.VISIT_REDIRECTING_GENERATIVE_CONSTRUCTOR_DECL, + element: constructor, + parameters: parameters, + initializers: initializers)); + applyParameters(parameters, arg); + applyInitializers(node, arg); + } + + @override + visitStaticFunctionDeclaration( + FunctionExpression node, + MethodElement function, + NodeList parameters, + Node body, + arg) { + visits.add(new Visit(VisitKind.VISIT_STATIC_FUNCTION_DECL, + element: function, parameters: parameters, body: body)); + applyParameters(parameters, arg); + apply(body, arg); + } + + @override + visitSuperConstructorInvoke( + Send node, + ConstructorElement superConstructor, + InterfaceType type, + NodeList arguments, + CallStructure callStructure, + arg) { + visits.add(new Visit(VisitKind.VISIT_SUPER_CONSTRUCTOR_INVOKE, + element: superConstructor, type: type, + arguments: arguments, selector: callStructure)); + super.visitSuperConstructorInvoke( + node, superConstructor, type, arguments, callStructure, arg); + } + + @override + visitImplicitSuperConstructorInvoke( + FunctionExpression node, + ConstructorElement superConstructor, + InterfaceType type, + arg) { + visits.add(new Visit(VisitKind.VISIT_IMPLICIT_SUPER_CONSTRUCTOR_INVOKE, + element: superConstructor, type: type)); + super.visitImplicitSuperConstructorInvoke( + node, superConstructor, type, arg); + } + + @override + visitThisConstructorInvoke( + Send node, + ConstructorElement thisConstructor, + NodeList arguments, + CallStructure callStructure, + arg) { + visits.add(new Visit(VisitKind.VISIT_THIS_CONSTRUCTOR_INVOKE, + element: thisConstructor, + arguments: arguments, selector: callStructure)); + super.visitThisConstructorInvoke( + node, thisConstructor, arguments, callStructure, arg); + } + + @override + visitTopLevelFunctionDeclaration( + FunctionExpression node, + MethodElement function, + NodeList parameters, + Node body, + arg) { + visits.add(new Visit(VisitKind.VISIT_TOP_LEVEL_FUNCTION_DECL, + element: function, parameters: parameters, body: body)); + applyParameters(parameters, arg); + apply(body, arg); + } + + @override + errorUnresolvedFieldInitializer( + SendSet node, + Element element, + Node initializer, + arg) { + // TODO: implement errorUnresolvedFieldInitializer + } + + @override + visitOptionalParameterDeclaration( + VariableDefinitions node, + Node definition, + ParameterElement parameter, + ConstantExpression defaultValue, + int index, + arg) { + visits.add(new Visit(VisitKind.VISIT_OPTIONAL_PARAMETER_DECL, + element: parameter, + constant: defaultValue != null ? defaultValue.getText() : null, + index: index)); + } + + @override + visitParameterDeclaration( + VariableDefinitions node, + Node definition, + ParameterElement parameter, + int index, + arg) { + visits.add(new Visit(VisitKind.VISIT_REQUIRED_PARAMETER_DECL, + element: parameter, index: index)); + } + + @override + visitInitializingFormalDeclaration( + VariableDefinitions node, + Node definition, + InitializingFormalElement initializingFormal, + int index, + arg) { + visits.add(new Visit(VisitKind.VISIT_REQUIRED_INITIALIZING_FORMAL_DECL, + element: initializingFormal, index: index)); + } + + @override + visitLocalVariableDeclaration( + VariableDefinitions node, + Node definition, + LocalVariableElement variable, + Node initializer, + arg) { + visits.add(new Visit(VisitKind.VISIT_LOCAL_VARIABLE_DECL, + element: variable, rhs: initializer)); + if (initializer != null) { + apply(initializer, arg); + } + } + + @override + visitLocalConstantDeclaration( + VariableDefinitions node, + Node definition, + LocalVariableElement variable, + ConstantExpression constant, + arg) { + visits.add(new Visit(VisitKind.VISIT_LOCAL_CONSTANT_DECL, + element: variable, constant: constant.getText())); + } + + @override + visitNamedInitializingFormalDeclaration( + VariableDefinitions node, + Node definition, + InitializingFormalElement initializingFormal, + ConstantExpression defaultValue, + arg) { + visits.add(new Visit(VisitKind.VISIT_NAMED_INITIALIZING_FORMAL_DECL, + element: initializingFormal, + constant: defaultValue != null ? defaultValue.getText() : null)); + } + + @override + visitNamedParameterDeclaration( + VariableDefinitions node, + Node definition, + ParameterElement parameter, + ConstantExpression defaultValue, + arg) { + visits.add(new Visit(VisitKind.VISIT_NAMED_PARAMETER_DECL, + element: parameter, + constant: defaultValue != null ? defaultValue.getText() : null)); + } + + @override + visitOptionalInitializingFormalDeclaration( + VariableDefinitions node, + Node definition, + InitializingFormalElement initializingFormal, + ConstantExpression defaultValue, + int index, + arg) { + visits.add(new Visit(VisitKind.VISIT_OPTIONAL_INITIALIZING_FORMAL_DECL, + element: initializingFormal, + constant: defaultValue != null ? defaultValue.getText() : null, + index: index)); + } + + @override + visitInstanceFieldDeclaration( + VariableDefinitions node, + Node definition, + FieldElement field, + Node initializer, + arg) { + visits.add(new Visit(VisitKind.VISIT_INSTANCE_FIELD_DECL, + element: field, rhs: initializer)); + if (initializer != null) { + apply(initializer, arg); + } + } + + @override + visitStaticConstantDeclaration( + VariableDefinitions node, + Node definition, + FieldElement field, + ConstantExpression constant, + arg) { + visits.add(new Visit(VisitKind.VISIT_STATIC_CONSTANT_DECL, + element: field, constant: constant.getText())); + } + + @override + visitStaticFieldDeclaration( + VariableDefinitions node, + Node definition, + FieldElement field, + Node initializer, + arg) { + visits.add(new Visit(VisitKind.VISIT_STATIC_FIELD_DECL, + element: field, rhs: initializer)); + if (initializer != null) { + apply(initializer, arg); + } + } + + @override + visitTopLevelConstantDeclaration( + VariableDefinitions node, + Node definition, + FieldElement field, + ConstantExpression constant, + arg) { + visits.add(new Visit(VisitKind.VISIT_TOP_LEVEL_CONSTANT_DECL, + element: field, constant: constant.getText())); + } + + @override + visitTopLevelFieldDeclaration( + VariableDefinitions node, + Node definition, + FieldElement field, + Node initializer, + arg) { + visits.add(new Visit(VisitKind.VISIT_TOP_LEVEL_FIELD_DECL, + element: field, rhs: initializer)); + if (initializer != null) { + apply(initializer, arg); + } + } + + @override + visitAbstractGetterDeclaration( + FunctionExpression node, + MethodElement getter, + arg) { + visits.add(new Visit(VisitKind.VISIT_ABSTRACT_GETTER_DECL, + element: getter)); + } + + @override + visitAbstractSetterDeclaration( + FunctionExpression node, + MethodElement setter, + NodeList parameters, + arg) { + visits.add(new Visit(VisitKind.VISIT_ABSTRACT_SETTER_DECL, + element: setter, parameters: parameters)); + applyParameters(parameters, arg); + } + + @override + visitInstanceGetterDeclaration( + FunctionExpression node, + MethodElement getter, + Node body, + arg) { + visits.add(new Visit(VisitKind.VISIT_INSTANCE_GETTER_DECL, + element: getter, body: body)); + apply(body, arg); + } + + @override + visitInstanceSetterDeclaration( + FunctionExpression node, + MethodElement setter, + NodeList parameters, + Node body, + arg) { + visits.add(new Visit(VisitKind.VISIT_INSTANCE_SETTER_DECL, + element: setter, parameters: parameters, body: body)); + applyParameters(parameters, arg); + apply(body, arg); + } + + @override + visitTopLevelGetterDeclaration( + FunctionExpression node, + MethodElement getter, + Node body, + arg) { + visits.add(new Visit(VisitKind.VISIT_TOP_LEVEL_GETTER_DECL, + element: getter, body: body)); + apply(body, arg); + } + + @override + visitTopLevelSetterDeclaration( + FunctionExpression node, + MethodElement setter, + NodeList parameters, + Node body, + arg) { + visits.add(new Visit(VisitKind.VISIT_TOP_LEVEL_SETTER_DECL, + element: setter, parameters: parameters, body: body)); + applyParameters(parameters, arg); + apply(body, arg); + } + + @override + visitStaticGetterDeclaration( + FunctionExpression node, + MethodElement getter, + Node body, + arg) { + visits.add(new Visit(VisitKind.VISIT_STATIC_GETTER_DECL, + element: getter, body: body)); + apply(body, arg); + } + + @override + visitStaticSetterDeclaration( + FunctionExpression node, + MethodElement setter, + NodeList parameters, + Node body, + arg) { + visits.add(new Visit(VisitKind.VISIT_STATIC_SETTER_DECL, + element: setter, parameters: parameters, body: body)); + applyParameters(parameters, arg); + apply(body, arg); + } +} diff --git a/tests/compiler/dart2js/semantic_visitor_test_send_data.dart b/tests/compiler/dart2js/semantic_visitor_test_send_data.dart index ebad7892b46..514aa2a37aa 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> 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 { - m() => T; - } - ''', - const Visit(VisitKind.VISIT_TYPE_VARIABLE_TYPE_LITERAL_GET, - element: 'type_variable(C#T)')), - const Test.clazz( - ''' - class C { - 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 { - 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 { - m() => ++T; - } - ''', - const Visit(VisitKind.VISIT_TYPE_VARIABLE_TYPE_LITERAL_PREFIX, - element: 'type_variable(C#T)', - operator: '++')), - const Test.clazz( - ''' - class C { - 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 { - factory Class(a, b) = Class.a; - factory Class.a(a, b) = Class>.b; - Class.b(a, b); - } - m() => new Class(true, 42); - ''', - const Visit(VisitKind.VISIT_REDIRECTING_FACTORY_CONSTRUCTOR_INVOKE, - element: 'function(Class#)', - arguments: '(true,42)', - type: 'Class', - target: 'generative_constructor(Class#b)', - targetType: 'Class>', - selector: 'CallStructure(arity=2)')), - const Test( - ''' - class Class { - factory Class(a) = Class.a; - factory Class.a(a, [b]) = Class>.b; - Class.b(a, [b]); - } - m() => new Class(true, 42); - ''', - const Visit(VisitKind.VISIT_REDIRECTING_FACTORY_CONSTRUCTOR_INVOKE, - element: 'function(Class#)', - arguments: '(true,42)', - type: 'Class', - target: 'generative_constructor(Class#b)', - targetType: 'Class>', - 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 { - factory Class(a, b) = Class.a; - factory Class.a(a, b) = Class>.b; - Class.b(a); - } - 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 { - 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> 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 { + m() => T; + } + ''', + const Visit(VisitKind.VISIT_TYPE_VARIABLE_TYPE_LITERAL_GET, + element: 'type_variable(C#T)')), + const Test.clazz( + ''' + class C { + 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 { + 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 { + m() => ++T; + } + ''', + const Visit(VisitKind.VISIT_TYPE_VARIABLE_TYPE_LITERAL_PREFIX, + element: 'type_variable(C#T)', + operator: '++')), + const Test.clazz( + ''' + class C { + 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 { + factory Class(a, b) = Class.a; + factory Class.a(a, b) = Class>.b; + Class.b(a, b); + } + m() => new Class(true, 42); + ''', + const Visit(VisitKind.VISIT_REDIRECTING_FACTORY_CONSTRUCTOR_INVOKE, + element: 'function(Class#)', + arguments: '(true,42)', + type: 'Class', + target: 'generative_constructor(Class#b)', + targetType: 'Class>', + selector: 'CallStructure(arity=2)')), + const Test( + ''' + class Class { + factory Class(a) = Class.a; + factory Class.a(a, [b]) = Class>.b; + Class.b(a, [b]); + } + m() => new Class(true, 42); + ''', + const Visit(VisitKind.VISIT_REDIRECTING_FACTORY_CONSTRUCTOR_INVOKE, + element: 'function(Class#)', + arguments: '(true,42)', + type: 'Class', + target: 'generative_constructor(Class#b)', + targetType: 'Class>', + 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 { + factory Class(a, b) = Class.a; + factory Class.a(a, b) = Class>.b; + Class.b(a); + } + 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 { + 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')), + ], +}; diff --git a/tests/compiler/dart2js/semantic_visitor_test_send_visitor.dart b/tests/compiler/dart2js/semantic_visitor_test_send_visitor.dart index 511b1f758c2..a602e2e7955 100644 --- a/tests/compiler/dart2js/semantic_visitor_test_send_visitor.dart +++ b/tests/compiler/dart2js/semantic_visitor_test_send_visitor.dart @@ -1,2943 +1,2943 @@ -// 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; - -class SemanticSendTestVisitor extends SemanticTestVisitor { - - SemanticSendTestVisitor(TreeElements elements) : super(elements); - - @override - visitAs( - Send node, - Node expression, - DartType type, - arg) { - visits.add(new Visit(VisitKind.VISIT_AS, - expression: expression, type: type)); - apply(expression, arg); - } - - @override - visitAssert( - Send node, - Node expression, - arg) { - visits.add(new Visit(VisitKind.VISIT_ASSERT, expression: expression)); - super.visitAssert(node, expression, arg); - } - - @override - errorInvalidAssert( - Send node, - NodeList arguments, - arg) { - visits.add(new Visit(VisitKind.ERROR_INVALID_ASSERT, arguments: arguments)); - super.errorInvalidAssert(node, arguments, arg); - } - - @override - visitBinary( - Send node, - Node left, - BinaryOperator operator, - Node right, - arg) { - visits.add(new Visit(VisitKind.VISIT_BINARY, - left: left, operator: operator, right: right)); - super.visitBinary(node, left, operator, right, arg); - } - - @override - errorUndefinedBinaryExpression( - Send node, - Node left, - Operator operator, - Node right, - arg) { - visits.add(new Visit(VisitKind.ERROR_UNDEFINED_BINARY_EXPRESSION, - left: left, operator: operator, right: right)); - super.errorUndefinedBinaryExpression(node, left, operator, right, arg); - } - - @override - visitIndex( - Send node, - Node receiver, - Node index, - arg) { - visits.add(new Visit(VisitKind.VISIT_INDEX, - receiver: receiver, index: index)); - apply(receiver, arg); - apply(index, arg); - } - - @override - visitClassTypeLiteralGet( - Send node, - ConstantExpression constant, - arg) { - visits.add(new Visit(VisitKind.VISIT_CLASS_TYPE_LITERAL_GET, - constant: constant.getText())); - } - - @override - visitClassTypeLiteralInvoke( - Send node, - ConstantExpression constant, - NodeList arguments, - CallStructure callStructure, - arg) { - visits.add(new Visit(VisitKind.VISIT_CLASS_TYPE_LITERAL_INVOKE, - constant: constant.getText(), arguments: arguments)); - apply(arguments, arg); - } - - @override - visitClassTypeLiteralSet( - SendSet node, - ConstantExpression constant, - Node rhs, - arg) { - visits.add(new Visit(VisitKind.VISIT_CLASS_TYPE_LITERAL_INVOKE, - constant: constant.getText(), rhs: rhs)); - super.visitClassTypeLiteralSet(node, constant, rhs, arg); - } - - @override - visitNotEquals( - Send node, - Node left, - Node right, - arg) { - visits.add(new Visit(VisitKind.VISIT_NOT_EQUALS, - left: left, right: right)); - apply(left, arg); - apply(right, arg); - } - - @override - visitDynamicPropertyPrefix( - Send node, - Node receiver, - IncDecOperator operator, - Selector getterSelector, - Selector setterSelector, - arg) { - visits.add(new Visit(VisitKind.VISIT_DYNAMIC_PROPERTY_PREFIX, - receiver: receiver, operator: operator, - getter: getterSelector, setter: setterSelector)); - apply(receiver, arg); - } - - @override - visitDynamicPropertyPostfix( - Send node, - Node receiver, - IncDecOperator operator, - Selector getterSelector, - Selector setterSelector, - arg) { - visits.add(new Visit(VisitKind.VISIT_DYNAMIC_PROPERTY_POSTFIX, - receiver: receiver, operator: operator, - getter: getterSelector, setter: setterSelector)); - apply(receiver, arg); - } - - @override - visitDynamicPropertyGet( - Send node, - Node receiver, - Selector selector, - arg) { - visits.add(new Visit(VisitKind.VISIT_DYNAMIC_PROPERTY_GET, - receiver: receiver, name: selector.name)); - apply(receiver, arg); - } - - @override - visitDynamicPropertyInvoke( - Send node, - Node receiver, - NodeList arguments, - Selector selector, - arg) { - visits.add(new Visit(VisitKind.VISIT_DYNAMIC_PROPERTY_INVOKE, - receiver: receiver, name: selector.name, arguments: arguments)); - apply(receiver, arg); - apply(arguments, arg); - } - - @override - visitDynamicPropertySet( - SendSet node, - Node receiver, - Selector selector, - Node rhs, - arg) { - visits.add(new Visit(VisitKind.VISIT_DYNAMIC_PROPERTY_SET, - receiver: receiver, name: selector.name, rhs: rhs)); - super.visitDynamicPropertySet(node, receiver, selector, rhs, arg); - } - - @override - visitDynamicTypeLiteralGet( - Send node, - ConstantExpression constant, - arg) { - visits.add(new Visit(VisitKind.VISIT_DYNAMIC_TYPE_LITERAL_GET, - constant: constant.getText())); - } - - @override - visitDynamicTypeLiteralInvoke( - Send node, - ConstantExpression constant, - NodeList arguments, - CallStructure callStructure, - arg) { - visits.add(new Visit(VisitKind.VISIT_DYNAMIC_TYPE_LITERAL_INVOKE, - constant: constant.getText(), arguments: arguments)); - } - - @override - visitDynamicTypeLiteralSet( - Send node, - ConstantExpression constant, - Node rhs, - arg) { - visits.add(new Visit(VisitKind.VISIT_DYNAMIC_TYPE_LITERAL_SET, - rhs: rhs)); - super.visitDynamicTypeLiteralSet(node, constant, rhs, arg); - } - - @override - visitExpressionInvoke( - Send node, - Node expression, - NodeList arguments, - Selector selector, - arg) { - visits.add(new Visit(VisitKind.VISIT_EXPRESSION_INVOKE, - receiver: expression, arguments: arguments)); - } - - @override - visitIs( - Send node, - Node expression, - DartType type, - arg) { - visits.add(new Visit(VisitKind.VISIT_IS, - expression: expression, type: type)); - apply(expression, arg); - } - - @override - visitIsNot( - Send node, - Node expression, - DartType type, - arg) { - visits.add(new Visit(VisitKind.VISIT_IS_NOT, - expression: expression, type: type)); - apply(expression, arg); - } - - @override - visitLogicalAnd( - Send node, - Node left, - Node right, - arg) { - visits.add(new Visit(VisitKind.VISIT_LOGICAL_AND, - left: left, right: right)); - apply(left, arg); - apply(right, arg); - } - - @override - visitLogicalOr( - Send node, - Node left, - Node right, - arg) { - visits.add(new Visit(VisitKind.VISIT_LOGICAL_OR, - left: left, right: right)); - apply(left, arg); - apply(right, arg); - } - - @override - visitLocalFunctionGet( - Send node, - LocalFunctionElement function, - arg) { - visits.add(new Visit(VisitKind.VISIT_LOCAL_FUNCTION_GET, - element: function)); - } - - @override - visitLocalFunctionSet( - SendSet node, - LocalFunctionElement function, - Node rhs, - arg) { - visits.add(new Visit(VisitKind.VISIT_LOCAL_FUNCTION_SET, - element: function, rhs: rhs)); - super.visitLocalFunctionSet(node, function, rhs, arg); - } - - @override - visitLocalFunctionInvoke( - Send node, - LocalFunctionElement function, - NodeList arguments, - CallStructure callStructure, - arg) { - visits.add(new Visit(VisitKind.VISIT_LOCAL_FUNCTION_INVOKE, - element: function, arguments: arguments, selector: callStructure)); - super.visitLocalFunctionInvoke( - node, function, arguments, callStructure, arg); - } - - @override - visitLocalFunctionIncompatibleInvoke( - Send node, - LocalFunctionElement function, - NodeList arguments, - CallStructure callStructure, - arg) { - visits.add(new Visit(VisitKind.VISIT_LOCAL_FUNCTION_INCOMPATIBLE_INVOKE, - element: function, arguments: arguments, selector: callStructure)); - super.visitLocalFunctionInvoke( - node, function, arguments, callStructure, arg); - } - - @override - visitLocalVariableGet( - Send node, - LocalVariableElement variable, - arg) { - visits.add(new Visit(VisitKind.VISIT_LOCAL_VARIABLE_GET, - element: variable)); - } - - @override - visitLocalVariableInvoke( - Send node, - LocalVariableElement variable, - NodeList arguments, - CallStructure callStructure, - arg) { - visits.add(new Visit(VisitKind.VISIT_LOCAL_VARIABLE_INVOKE, - element: variable, arguments: arguments, selector: callStructure)); - apply(arguments, arg); - } - - @override - visitLocalVariableSet( - SendSet node, - LocalVariableElement variable, - Node rhs, - arg) { - visits.add(new Visit(VisitKind.VISIT_LOCAL_VARIABLE_SET, - element: variable, rhs: rhs)); - super.visitLocalVariableSet(node, variable, rhs, arg); - } - - @override - visitFinalLocalVariableSet( - SendSet node, - LocalVariableElement variable, - Node rhs, - arg) { - visits.add(new Visit(VisitKind.VISIT_FINAL_LOCAL_VARIABLE_SET, - element: variable, rhs: rhs)); - super.visitFinalLocalVariableSet(node, variable, rhs, arg); - } - - @override - visitParameterGet( - Send node, - ParameterElement parameter, - arg) { - visits.add(new Visit(VisitKind.VISIT_PARAMETER_GET, element: parameter)); - } - - @override - visitParameterInvoke( - Send node, - ParameterElement parameter, - NodeList arguments, - CallStructure callStructure, - arg) { - visits.add(new Visit(VisitKind.VISIT_PARAMETER_INVOKE, - element: parameter, arguments: arguments, selector: callStructure)); - apply(arguments, arg); - } - - @override - visitParameterSet( - SendSet node, - ParameterElement parameter, - Node rhs, - arg) { - visits.add(new Visit(VisitKind.VISIT_PARAMETER_SET, - element: parameter, rhs: rhs)); - super.visitParameterSet(node, parameter, rhs, arg); - } - - @override - visitFinalParameterSet( - SendSet node, - ParameterElement parameter, - Node rhs, - arg) { - visits.add(new Visit(VisitKind.VISIT_FINAL_PARAMETER_SET, - element: parameter, rhs: rhs)); - super.visitFinalParameterSet(node, parameter, rhs, arg); - } - - @override - visitStaticFieldGet( - Send node, - FieldElement field, - arg) { - visits.add(new Visit(VisitKind.VISIT_STATIC_FIELD_GET, element: field)); - } - - @override - visitStaticFieldInvoke( - Send node, - FieldElement field, - NodeList arguments, - CallStructure callStructure, - arg) { - visits.add(new Visit(VisitKind.VISIT_STATIC_FIELD_INVOKE, - element: field, arguments: arguments)); - apply(arguments, arg); - } - - @override - visitStaticFieldSet( - SendSet node, - FieldElement field, - Node rhs, - arg) { - visits.add(new Visit(VisitKind.VISIT_STATIC_FIELD_SET, - element: field, rhs: rhs)); - super.visitStaticFieldSet(node, field, rhs, arg); - } - - @override - visitFinalStaticFieldSet( - SendSet node, - FieldElement field, - Node rhs, - arg) { - visits.add(new Visit(VisitKind.VISIT_FINAL_STATIC_FIELD_SET, - element: field, rhs: rhs)); - super.visitFinalStaticFieldSet(node, field, rhs, arg); - } - - @override - visitStaticFunctionGet( - Send node, - MethodElement function, - arg) { - visits.add(new Visit(VisitKind.VISIT_STATIC_FUNCTION_GET, - element: function)); - } - - @override - visitStaticFunctionSet( - SendSet node, - MethodElement function, - Node rhs, - arg) { - visits.add(new Visit(VisitKind.VISIT_STATIC_FUNCTION_SET, - element: function, rhs: rhs)); - super.visitStaticFunctionSet(node, function, rhs, arg); - } - - @override - visitStaticFunctionInvoke( - Send node, - MethodElement function, - NodeList arguments, - CallStructure callStructure, - arg) { - visits.add(new Visit(VisitKind.VISIT_STATIC_FUNCTION_INVOKE, - element: function, arguments: arguments)); - super.visitStaticFunctionInvoke( - node, function, arguments, callStructure, arg); - } - - @override - visitStaticFunctionIncompatibleInvoke( - Send node, - MethodElement function, - NodeList arguments, - CallStructure callStructure, - arg) { - visits.add(new Visit(VisitKind.VISIT_STATIC_FUNCTION_INCOMPATIBLE_INVOKE, - element: function, arguments: arguments)); - apply(arguments, arg); - } - - @override - visitStaticGetterGet( - Send node, - FunctionElement getter, - arg) { - visits.add(new Visit(VisitKind.VISIT_STATIC_GETTER_GET, - element: getter)); - super.visitStaticGetterGet(node, getter, arg); - } - - @override - visitStaticGetterSet( - SendSet node, - MethodElement getter, - Node rhs, - arg) { - visits.add(new Visit(VisitKind.VISIT_STATIC_GETTER_SET, - element: getter, rhs: rhs)); - super.visitStaticGetterSet(node, getter, rhs, arg); - } - - @override - visitStaticGetterInvoke( - Send node, - FunctionElement getter, - NodeList arguments, - CallStructure callStructure, - arg) { - visits.add(new Visit(VisitKind.VISIT_STATIC_GETTER_INVOKE, - element: getter, arguments: arguments)); - super.visitStaticGetterInvoke(node, getter, arguments, callStructure, arg); - } - - @override - visitStaticSetterInvoke( - Send node, - FunctionElement setter, - NodeList arguments, - CallStructure callStructure, - arg) { - visits.add(new Visit(VisitKind.VISIT_STATIC_SETTER_INVOKE, - element: setter, arguments: arguments)); - super.visitStaticSetterInvoke(node, setter, arguments, callStructure, arg); - } - - @override - visitStaticSetterGet( - Send node, - FunctionElement getter, - arg) { - visits.add(new Visit(VisitKind.VISIT_STATIC_SETTER_GET, - element: getter)); - super.visitStaticSetterGet(node, getter, arg); - } - - @override - visitStaticSetterSet( - SendSet node, - FunctionElement setter, - Node rhs, - arg) { - visits.add(new Visit(VisitKind.VISIT_STATIC_SETTER_SET, - element: setter, rhs: rhs)); - super.visitStaticSetterSet(node, setter, rhs, arg); - } - - @override - visitSuperBinary( - Send node, - FunctionElement function, - BinaryOperator operator, - Node argument, - arg) { - visits.add(new Visit(VisitKind.VISIT_SUPER_BINARY, - element: function, operator: operator, right: argument)); - apply(argument, arg); - } - - @override - visitUnresolvedSuperBinary( - Send node, - Element element, - BinaryOperator operator, - Node argument, - arg) { - visits.add(new Visit(VisitKind.VISIT_UNRESOLVED_SUPER_BINARY, - operator: operator, right: argument)); - apply(argument, arg); - } - - @override - visitSuperIndex( - Send node, - FunctionElement function, - Node index, - arg) { - visits.add(new Visit(VisitKind.VISIT_SUPER_INDEX, - element: function, index: index)); - apply(index, arg); - } - - @override - visitUnresolvedSuperIndex( - Send node, - Element element, - Node index, - arg) { - visits.add(new Visit(VisitKind.VISIT_UNRESOLVED_SUPER_INDEX, - index: index)); - apply(index, arg); - } - - @override - visitSuperNotEquals( - Send node, - FunctionElement function, - Node argument, - arg) { - visits.add(new Visit(VisitKind.VISIT_SUPER_NOT_EQUALS, - element: function, right: argument)); - apply(argument, arg); - } - - @override - visitThisGet(Identifier node, arg) { - visits.add(new Visit(VisitKind.VISIT_THIS_GET)); - } - - @override - visitThisInvoke( - Send node, - NodeList arguments, - CallStructure callStructure, - arg) { - visits.add(new Visit(VisitKind.VISIT_THIS_INVOKE, arguments: arguments)); - apply(arguments, arg); - } - - @override - visitThisPropertyGet( - Send node, - Selector selector, - arg) { - visits.add(new Visit(VisitKind.VISIT_THIS_PROPERTY_GET, - name: selector.name)); - } - - @override - visitThisPropertyInvoke( - Send node, - NodeList arguments, - Selector selector, - arg) { - visits.add(new Visit(VisitKind.VISIT_THIS_PROPERTY_INVOKE, - name: selector.name, arguments: arguments)); - apply(arguments, arg); - } - - @override - visitThisPropertySet( - SendSet node, - Selector selector, - Node rhs, - arg) { - visits.add(new Visit(VisitKind.VISIT_THIS_PROPERTY_SET, - name: selector.name, rhs: rhs)); - apply(rhs, arg); - } - - @override - visitTopLevelFieldGet( - Send node, - FieldElement field, - arg) { - visits.add(new Visit(VisitKind.VISIT_TOP_LEVEL_FIELD_GET, element: field)); - } - - @override - visitTopLevelFieldInvoke( - Send node, - FieldElement field, - NodeList arguments, - CallStructure callStructure, - arg) { - visits.add(new Visit(VisitKind.VISIT_TOP_LEVEL_FIELD_INVOKE, - element: field, arguments: arguments)); - apply(arguments, arg); - } - - @override - visitTopLevelFieldSet( - SendSet node, - FieldElement field, - Node rhs, - arg) { - visits.add(new Visit(VisitKind.VISIT_TOP_LEVEL_FIELD_SET, - element: field, rhs: rhs)); - super.visitTopLevelFieldSet(node, field, rhs, arg); - } - - @override - visitFinalTopLevelFieldSet( - SendSet node, - FieldElement field, - Node rhs, - arg) { - visits.add(new Visit(VisitKind.VISIT_FINAL_TOP_LEVEL_FIELD_SET, - element: field, rhs: rhs)); - super.visitFinalTopLevelFieldSet(node, field, rhs, arg); - } - - @override - visitTopLevelFunctionGet( - Send node, - MethodElement function, - arg) { - visits.add(new Visit(VisitKind.VISIT_TOP_LEVEL_FUNCTION_GET, - element: function)); - } - - @override - visitTopLevelFunctionSet( - SendSet node, - MethodElement function, - Node rhs, - arg) { - visits.add(new Visit(VisitKind.VISIT_TOP_LEVEL_FUNCTION_SET, - element: function, rhs: rhs)); - super.visitTopLevelFunctionSet(node, function, rhs, arg); - } - - @override - visitTopLevelFunctionInvoke( - Send node, - MethodElement function, - NodeList arguments, - CallStructure callStructure, - arg) { - visits.add(new Visit(VisitKind.VISIT_TOP_LEVEL_FUNCTION_INVOKE, - element: function, arguments: arguments)); - apply(arguments, arg); - } - - @override - visitTopLevelFunctionIncompatibleInvoke( - Send node, - MethodElement function, - NodeList arguments, - CallStructure callStructure, - arg) { - visits.add(new Visit(VisitKind.VISIT_TOP_LEVEL_FUNCTION_INCOMPATIBLE_INVOKE, - element: function, arguments: arguments)); - apply(arguments, arg); - } - - @override - visitTopLevelGetterGet( - Send node, - FunctionElement getter, - arg) { - visits.add(new Visit(VisitKind.VISIT_TOP_LEVEL_GETTER_GET, - element: getter)); - super.visitTopLevelGetterGet(node, getter, arg); - } - - @override - visitTopLevelSetterGet( - Send node, - FunctionElement setter, - arg) { - visits.add(new Visit(VisitKind.VISIT_TOP_LEVEL_SETTER_GET, - element: setter)); - super.visitTopLevelSetterGet(node, setter, arg); - } - - @override - visitTopLevelGetterInvoke( - Send node, - FunctionElement getter, - NodeList arguments, - CallStructure callStructure, - arg) { - visits.add(new Visit(VisitKind.VISIT_TOP_LEVEL_GETTER_INVOKE, - element: getter, arguments: arguments)); - super.visitTopLevelGetterInvoke( - node, getter, arguments, callStructure, arg); - } - - @override - visitTopLevelSetterInvoke( - Send node, - FunctionElement setter, - NodeList arguments, - CallStructure callStructure, - arg) { - visits.add(new Visit(VisitKind.VISIT_TOP_LEVEL_SETTER_INVOKE, - element: setter, arguments: arguments)); - super.visitTopLevelSetterInvoke( - node, setter, arguments, callStructure, arg); - } - - @override - visitTopLevelGetterSet( - SendSet node, - FunctionElement getter, - Node rhs, - arg) { - visits.add(new Visit(VisitKind.VISIT_TOP_LEVEL_GETTER_SET, - element: getter, rhs: rhs)); - super.visitTopLevelGetterSet(node, getter, rhs, arg); - } - - @override - visitTopLevelSetterSet( - SendSet node, - FunctionElement setter, - Node rhs, - arg) { - visits.add(new Visit(VisitKind.VISIT_TOP_LEVEL_SETTER_SET, - element: setter, rhs: rhs)); - super.visitTopLevelSetterSet(node, setter, rhs, arg); - } - - @override - visitTypeVariableTypeLiteralGet( - Send node, - TypeVariableElement element, - arg) { - visits.add(new Visit(VisitKind.VISIT_TYPE_VARIABLE_TYPE_LITERAL_GET, - element: element)); - } - - @override - visitTypeVariableTypeLiteralInvoke( - Send node, - TypeVariableElement element, - NodeList arguments, - CallStructure callStructure, - arg) { - visits.add(new Visit(VisitKind.VISIT_TYPE_VARIABLE_TYPE_LITERAL_INVOKE, - element: element, arguments: arguments)); - apply(arguments, arg); - } - - @override - visitTypeVariableTypeLiteralSet( - SendSet node, - TypeVariableElement element, - Node rhs, - arg) { - visits.add(new Visit(VisitKind.VISIT_TYPE_VARIABLE_TYPE_LITERAL_SET, - element: element, rhs: rhs)); - super.visitTypeVariableTypeLiteralSet(node, element, rhs, arg); - } - - @override - visitTypedefTypeLiteralGet( - Send node, - ConstantExpression constant, - arg) { - visits.add(new Visit(VisitKind.VISIT_TYPEDEF_TYPE_LITERAL_GET, - constant: constant.getText())); - } - - @override - visitTypedefTypeLiteralInvoke( - Send node, - ConstantExpression constant, - NodeList arguments, - CallStructure callStructure, - arg) { - visits.add(new Visit(VisitKind.VISIT_TYPEDEF_TYPE_LITERAL_INVOKE, - constant: constant.getText(), arguments: arguments)); - apply(arguments, arg); - } - - @override - visitTypedefTypeLiteralSet( - SendSet node, - ConstantExpression constant, - Node rhs, - arg) { - visits.add(new Visit(VisitKind.VISIT_TYPEDEF_TYPE_LITERAL_SET, - constant: constant.getText(), rhs: rhs)); - super.visitTypedefTypeLiteralSet(node, constant, rhs, arg); - } - - @override - visitUnary( - Send node, - UnaryOperator operator, - Node expression, - arg) { - visits.add(new Visit(VisitKind.VISIT_UNARY, - expression: expression, operator: operator)); - super.visitUnary(node, operator, expression, arg); - } - - @override - errorUndefinedUnaryExpression( - Send node, - Operator operator, - Node expression, - arg) { - visits.add(new Visit(VisitKind.ERROR_UNDEFINED_UNARY_EXPRESSION, - expression: expression, operator: operator)); - super.errorUndefinedUnaryExpression(node, operator, expression, arg); - } - - @override - visitNot( - Send node, - Node expression, - arg) { - visits.add(new Visit(VisitKind.VISIT_NOT, expression: expression)); - apply(expression, arg); - } - - @override - visitSuperFieldGet( - Send node, - FieldElement field, - arg) { - visits.add(new Visit(VisitKind.VISIT_SUPER_FIELD_GET, element: field)); - } - - @override - visitUnresolvedSuperGet( - Send node, - Element element, - arg) { - visits.add(new Visit(VisitKind.VISIT_UNRESOLVED_SUPER_GET)); - } - - @override - visitSuperFieldInvoke( - Send node, - FieldElement field, - NodeList arguments, - CallStructure callStructure, - arg) { - visits.add(new Visit(VisitKind.VISIT_SUPER_FIELD_INVOKE, - element: field, arguments: arguments)); - apply(arguments, arg); - } - - @override - visitUnresolvedSuperInvoke( - Send node, - Element element, - NodeList arguments, - Selector selector, - arg) { - visits.add(new Visit(VisitKind.VISIT_UNRESOLVED_SUPER_INVOKE, - arguments: arguments)); - apply(arguments, arg); - } - - @override - visitSuperFieldSet( - SendSet node, - FieldElement field, - Node rhs, - arg) { - visits.add(new Visit(VisitKind.VISIT_SUPER_FIELD_SET, - element: field, rhs: rhs)); - super.visitSuperFieldSet(node, field, rhs, arg); - } - - @override - visitFinalSuperFieldSet( - SendSet node, - FieldElement field, - Node rhs, - arg) { - visits.add(new Visit(VisitKind.VISIT_FINAL_SUPER_FIELD_SET, - element: field, rhs: rhs)); - super.visitFinalSuperFieldSet(node, field, rhs, arg); - } - - @override - visitSuperMethodGet( - Send node, - MethodElement method, - arg) { - visits.add(new Visit(VisitKind.VISIT_SUPER_METHOD_GET, element: method)); - } - - @override - visitSuperMethodSet( - SendSet node, - MethodElement method, - Node rhs, - arg) { - visits.add(new Visit(VisitKind.VISIT_SUPER_METHOD_SET, - element: method, rhs: rhs)); - super.visitSuperMethodSet(node, method, rhs, arg); - } - - @override - visitSuperMethodInvoke( - Send node, - MethodElement method, - NodeList arguments, - CallStructure callStructure, - arg) { - visits.add(new Visit(VisitKind.VISIT_SUPER_METHOD_INVOKE, - element: method, arguments: arguments)); - apply(arguments, arg); - } - - @override - visitSuperMethodIncompatibleInvoke( - Send node, - MethodElement method, - NodeList arguments, - CallStructure callStructure, - arg) { - visits.add(new Visit(VisitKind.VISIT_SUPER_METHOD_INCOMPATIBLE_INVOKE, - element: method, arguments: arguments)); - apply(arguments, arg); - } - - @override - visitSuperGetterGet( - Send node, - FunctionElement getter, - arg) { - visits.add(new Visit(VisitKind.VISIT_SUPER_GETTER_GET, element: getter)); - super.visitSuperGetterGet(node, getter, arg); - } - - @override - visitSuperSetterGet( - Send node, - FunctionElement setter, - arg) { - visits.add(new Visit(VisitKind.VISIT_SUPER_SETTER_GET, element: setter)); - super.visitSuperSetterGet(node, setter, arg); - } - - @override - visitSuperGetterInvoke( - Send node, - FunctionElement getter, - NodeList arguments, - CallStructure callStructure, - arg) { - visits.add(new Visit(VisitKind.VISIT_SUPER_GETTER_INVOKE, - element: getter, arguments: arguments)); - super.visitSuperGetterInvoke(node, getter, arguments, callStructure, arg); - } - - @override - visitSuperSetterInvoke( - Send node, - FunctionElement setter, - NodeList arguments, - CallStructure callStructure, - arg) { - visits.add(new Visit(VisitKind.VISIT_SUPER_SETTER_INVOKE, - element: setter, arguments: arguments)); - super.visitSuperSetterInvoke(node, setter, arguments, callStructure, arg); - } - - @override - visitSuperGetterSet( - SendSet node, - FunctionElement getter, - Node rhs, - arg) { - visits.add(new Visit(VisitKind.VISIT_SUPER_GETTER_SET, - element: getter, rhs: rhs)); - super.visitSuperGetterSet(node, getter, rhs, arg); - } - - @override - visitSuperSetterSet( - SendSet node, - FunctionElement setter, - Node rhs, - arg) { - visits.add(new Visit(VisitKind.VISIT_SUPER_SETTER_SET, - element: setter, rhs: rhs)); - super.visitSuperSetterSet(node, setter, rhs, arg); - } - - @override - visitSuperUnary( - Send node, - UnaryOperator operator, - FunctionElement function, - arg) { - visits.add(new Visit(VisitKind.VISIT_SUPER_UNARY, - element: function, operator: operator)); - } - - @override - visitUnresolvedSuperUnary( - Send node, - UnaryOperator operator, - Element element, - arg) { - visits.add(new Visit(VisitKind.VISIT_UNRESOLVED_SUPER_UNARY, - operator: operator)); - } - - @override - visitEquals( - Send node, - Node left, - Node right, - arg) { - visits.add(new Visit(VisitKind.VISIT_EQUALS, left: left, right: right)); - apply(left, arg); - apply(right, arg); - } - - @override - visitSuperEquals( - Send node, - FunctionElement function, - Node argument, - arg) { - visits.add(new Visit(VisitKind.VISIT_SUPER_EQUALS, - element: function, right: argument)); - apply(argument, arg); - } - - @override - visitIndexSet( - Send node, - Node receiver, - Node index, - Node rhs, - arg) { - visits.add(new Visit(VisitKind.VISIT_INDEX_SET, - receiver: receiver, index: index, rhs: rhs)); - apply(receiver, arg); - apply(index, arg); - apply(rhs, arg); - } - - @override - visitSuperIndexSet( - Send node, - FunctionElement function, - Node index, - Node rhs, - arg) { - visits.add(new Visit(VisitKind.VISIT_SUPER_INDEX_SET, - element: function, index: index, rhs: rhs)); - apply(index, arg); - apply(rhs, arg); - } - - @override - visitDynamicPropertyCompound( - Send node, - Node receiver, - AssignmentOperator operator, - Node rhs, - Selector getterSelector, - Selector setterSelector, - arg) { - visits.add(new Visit(VisitKind.VISIT_DYNAMIC_PROPERTY_COMPOUND, - receiver: receiver, operator: operator, rhs: rhs, - getter: getterSelector, setter: setterSelector)); - apply(receiver, arg); - apply(rhs, arg); - } - - @override - visitFinalLocalVariableCompound( - Send node, - LocalVariableElement variable, - AssignmentOperator operator, - Node rhs, - arg) { - visits.add(new Visit(VisitKind.VISIT_FINAL_LOCAL_VARIABLE_COMPOUND, - element: variable, operator: operator, rhs: rhs)); - apply(rhs, arg); - } - - @override - visitFinalLocalVariablePrefix( - Send node, - LocalVariableElement variable, - IncDecOperator operator, - arg) { - visits.add(new Visit(VisitKind.VISIT_FINAL_LOCAL_VARIABLE_PREFIX, - element: variable, operator: operator)); - } - - @override - visitFinalLocalVariablePostfix( - Send node, - LocalVariableElement variable, - IncDecOperator operator, - arg) { - visits.add(new Visit(VisitKind.VISIT_FINAL_LOCAL_VARIABLE_POSTFIX, - element: variable, operator: operator)); - } - - @override - visitFinalParameterCompound( - Send node, - ParameterElement parameter, - AssignmentOperator operator, - Node rhs, - arg) { - visits.add(new Visit(VisitKind.VISIT_FINAL_PARAMETER_COMPOUND, - element: parameter, operator: operator, rhs: rhs)); - apply(rhs, arg); - } - - @override - visitFinalParameterPrefix( - Send node, - ParameterElement parameter, - IncDecOperator operator, - arg) { - visits.add(new Visit(VisitKind.VISIT_FINAL_PARAMETER_PREFIX, - element: parameter, operator: operator)); - } - - @override - visitFinalParameterPostfix( - Send node, - ParameterElement parameter, - IncDecOperator operator, - arg) { - visits.add(new Visit(VisitKind.VISIT_FINAL_PARAMETER_POSTFIX, - element: parameter, operator: operator)); - } - - @override - visitFinalStaticFieldCompound( - Send node, - FieldElement field, - AssignmentOperator operator, - Node rhs, - arg) { - visits.add(new Visit(VisitKind.VISIT_STATIC_FINAL_FIELD_COMPOUND, - element: field, operator: operator, rhs: rhs)); - apply(rhs, arg); - } - - @override - visitFinalStaticFieldPostfix( - Send node, - FieldElement field, - IncDecOperator operator, - arg) { - visits.add(new Visit(VisitKind.VISIT_STATIC_FINAL_FIELD_POSTFIX, - element: field, operator: operator)); - } - - @override - visitFinalStaticFieldPrefix( - Send node, - FieldElement field, - IncDecOperator operator, - arg) { - visits.add(new Visit(VisitKind.VISIT_STATIC_FINAL_FIELD_PREFIX, - element: field, operator: operator)); - } - - @override - visitFinalSuperFieldCompound( - Send node, - FieldElement field, - AssignmentOperator operator, - Node rhs, - arg) { - visits.add(new Visit(VisitKind.VISIT_SUPER_FINAL_FIELD_COMPOUND, - element: field, operator: operator, rhs: rhs)); - apply(rhs, arg); - } - - @override - visitFinalTopLevelFieldCompound( - Send node, - FieldElement field, - AssignmentOperator operator, - Node rhs, - arg) { - visits.add(new Visit(VisitKind.VISIT_TOP_LEVEL_FINAL_FIELD_COMPOUND, - element: field, operator: operator, rhs: rhs)); - apply(rhs, arg); - } - - @override - visitFinalTopLevelFieldPostfix( - Send node, - FieldElement field, - IncDecOperator operator, - arg) { - visits.add(new Visit(VisitKind.VISIT_TOP_LEVEL_FINAL_FIELD_POSTFIX, - element: field, operator: operator)); - } - - @override - visitFinalTopLevelFieldPrefix( - Send node, - FieldElement field, - IncDecOperator operator, - arg) { - visits.add(new Visit(VisitKind.VISIT_TOP_LEVEL_FINAL_FIELD_PREFIX, - element: field, operator: operator)); - } - - @override - visitLocalFunctionCompound( - Send node, - LocalFunctionElement function, - AssignmentOperator operator, - Node rhs, - arg) { - visits.add(new Visit(VisitKind.VISIT_LOCAL_FUNCTION_COMPOUND, - element: function, operator: operator, rhs: rhs)); - apply(rhs, arg); - } - - @override - visitLocalVariableCompound( - Send node, - LocalVariableElement variable, - AssignmentOperator operator, - Node rhs, - arg) { - visits.add(new Visit(VisitKind.VISIT_LOCAL_VARIABLE_COMPOUND, - element: variable, operator: operator, rhs: rhs)); - apply(rhs, arg); - } - - @override - visitParameterCompound( - Send node, - ParameterElement parameter, - AssignmentOperator operator, - Node rhs, - arg) { - visits.add(new Visit(VisitKind.VISIT_PARAMETER_COMPOUND, - element: parameter, operator: operator, rhs: rhs)); - apply(rhs, arg); - } - - @override - visitStaticFieldCompound( - Send node, - FieldElement field, - AssignmentOperator operator, - Node rhs, - arg) { - visits.add(new Visit(VisitKind.VISIT_STATIC_FIELD_COMPOUND, - element: field, operator: operator, rhs: rhs)); - apply(rhs, arg); - } - - @override - visitStaticGetterSetterCompound( - Send node, - FunctionElement getter, - FunctionElement setter, - AssignmentOperator operator, - Node rhs, - arg) { - visits.add(new Visit(VisitKind.VISIT_STATIC_GETTER_SETTER_COMPOUND, - operator: operator, rhs: rhs, - getter: getter, setter: setter)); - apply(rhs, arg); - } - - @override - visitSuperFieldCompound( - Send node, - FieldElement field, - AssignmentOperator operator, - Node rhs, - arg) { - visits.add(new Visit(VisitKind.VISIT_SUPER_FIELD_COMPOUND, - element: field, operator: operator, rhs: rhs)); - apply(rhs, arg); - } - - @override - visitSuperGetterSetterCompound( - Send node, - FunctionElement getter, - FunctionElement setter, - AssignmentOperator operator, - Node rhs, - arg) { - visits.add(new Visit(VisitKind.VISIT_SUPER_GETTER_SETTER_COMPOUND, - operator: operator, rhs: rhs, - getter: getter, setter: setter)); - apply(rhs, arg); - } - - @override - visitThisPropertyCompound( - Send node, - AssignmentOperator operator, - Node rhs, - Selector getterSelector, - Selector setterSelector, - arg) { - visits.add(new Visit(VisitKind.VISIT_THIS_PROPERTY_COMPOUND, - operator: operator, rhs: rhs, - getter: getterSelector, setter: setterSelector)); - apply(rhs, arg); - } - - @override - visitTopLevelFieldCompound( - Send node, - FieldElement field, - AssignmentOperator operator, - Node rhs, - arg) { - visits.add(new Visit(VisitKind.VISIT_TOP_LEVEL_FIELD_COMPOUND, - element: field, operator: operator, rhs: rhs)); - apply(rhs, arg); - } - - @override - visitTopLevelGetterSetterCompound( - Send node, - FunctionElement getter, - FunctionElement setter, - AssignmentOperator operator, - Node rhs, - arg) { - visits.add(new Visit(VisitKind.VISIT_TOP_LEVEL_GETTER_SETTER_COMPOUND, - operator: operator, rhs: rhs, - getter: getter, setter: setter)); - apply(rhs, arg); - } - - @override - visitStaticMethodSetterCompound( - Send node, - FunctionElement method, - FunctionElement setter, - AssignmentOperator operator, - Node rhs, - arg) { - visits.add(new Visit(VisitKind.VISIT_STATIC_METHOD_SETTER_COMPOUND, - operator: operator, rhs: rhs, - getter: method, setter: setter)); - apply(rhs, arg); - } - - @override - visitSuperFieldSetterCompound( - Send node, - FieldElement field, - FunctionElement setter, - AssignmentOperator operator, - Node rhs, - arg) { - visits.add(new Visit(VisitKind.VISIT_SUPER_FIELD_SETTER_COMPOUND, - operator: operator, rhs: rhs, - getter: field, setter: setter)); - apply(rhs, arg); - } - - @override - visitSuperGetterFieldCompound( - Send node, - FunctionElement getter, - FieldElement field, - AssignmentOperator operator, - Node rhs, - arg) { - visits.add(new Visit(VisitKind.VISIT_SUPER_GETTER_FIELD_COMPOUND, - operator: operator, rhs: rhs, - getter: getter, setter: field)); - apply(rhs, arg); - } - - @override - visitSuperMethodSetterCompound( - Send node, - FunctionElement method, - FunctionElement setter, - AssignmentOperator operator, - Node rhs, - arg) { - visits.add(new Visit(VisitKind.VISIT_SUPER_METHOD_SETTER_COMPOUND, - getter: method, setter: setter, operator: operator, rhs: rhs)); - apply(rhs, arg); - } - - @override - visitSuperMethodCompound( - Send node, - FunctionElement method, - AssignmentOperator operator, - Node rhs, - arg) { - visits.add(new Visit(VisitKind.VISIT_SUPER_METHOD_COMPOUND, - element: method, operator: operator, rhs: rhs)); - apply(rhs, arg); - } - - @override - visitSuperMethodPrefix( - Send node, - FunctionElement method, - IncDecOperator operator, - arg) { - visits.add(new Visit(VisitKind.VISIT_SUPER_METHOD_PREFIX, - element: method, operator: operator)); - } - - @override - visitSuperMethodPostfix( - Send node, - FunctionElement method, - IncDecOperator operator, - arg) { - visits.add(new Visit(VisitKind.VISIT_SUPER_METHOD_POSTFIX, - element: method, operator: operator)); - } - - @override - visitUnresolvedSuperCompound( - Send node, - Element element, - AssignmentOperator operator, - Node rhs, - arg) { - visits.add(new Visit(VisitKind.VISIT_UNRESOLVED_SUPER_COMPOUND, - operator: operator, rhs: rhs)); - apply(rhs, arg); - } - - @override - visitUnresolvedSuperPrefix( - Send node, - Element element, - IncDecOperator operator, - arg) { - visits.add(new Visit(VisitKind.VISIT_UNRESOLVED_SUPER_PREFIX, - operator: operator)); - } - - @override - visitUnresolvedSuperPostfix( - Send node, - Element element, - IncDecOperator operator, - arg) { - visits.add(new Visit(VisitKind.VISIT_UNRESOLVED_SUPER_POSTFIX, - operator: operator)); - } - - @override - visitTopLevelMethodSetterCompound( - Send node, - FunctionElement method, - FunctionElement setter, - AssignmentOperator operator, - Node rhs, - arg) { - visits.add(new Visit(VisitKind.VISIT_TOP_LEVEL_METHOD_SETTER_COMPOUND, - getter: method, setter: setter, operator: operator, rhs: rhs)); - apply(rhs, arg); - } - - @override - visitCompoundIndexSet( - Send node, - Node receiver, - Node index, - AssignmentOperator operator, - Node rhs, - arg) { - visits.add(new Visit(VisitKind.VISIT_COMPOUND_INDEX_SET, - receiver: receiver, index: index, rhs: rhs, operator: operator)); - apply(receiver, arg); - apply(index, arg); - apply(rhs, arg); - } - - @override - visitSuperCompoundIndexSet( - Send node, - FunctionElement getter, - FunctionElement setter, - Node index, - AssignmentOperator operator, - Node rhs, - arg) { - visits.add(new Visit(VisitKind.VISIT_SUPER_COMPOUND_INDEX_SET, - getter: getter, setter: setter, - index: index, rhs: rhs, operator: operator)); - apply(index, arg); - apply(rhs, arg); - } - - @override - visitClassTypeLiteralCompound( - Send node, - ConstantExpression constant, - AssignmentOperator operator, - Node rhs, - arg) { - visits.add(new Visit(VisitKind.VISIT_CLASS_TYPE_LITERAL_COMPOUND, - constant: constant.getText(), operator: operator, rhs: rhs)); - apply(rhs, arg); - } - - @override - visitDynamicTypeLiteralCompound( - Send node, - ConstantExpression constant, - AssignmentOperator operator, - Node rhs, - arg) { - visits.add(new Visit(VisitKind.VISIT_DYNAMIC_TYPE_LITERAL_COMPOUND, - constant: constant.getText(), operator: operator, rhs: rhs)); - apply(rhs, arg); - } - - @override - visitTypeVariableTypeLiteralCompound( - Send node, - TypeVariableElement element, - AssignmentOperator operator, - Node rhs, - arg) { - visits.add(new Visit(VisitKind.VISIT_TYPE_VARIABLE_TYPE_LITERAL_COMPOUND, - element: element, operator: operator, rhs: rhs)); - apply(rhs, arg); - } - - @override - visitTypedefTypeLiteralCompound( - Send node, - ConstantExpression constant, - AssignmentOperator operator, - Node rhs, - arg) { - visits.add(new Visit(VisitKind.VISIT_TYPEDEF_TYPE_LITERAL_COMPOUND, - constant: constant.getText(), operator: operator, rhs: rhs)); - apply(rhs, arg); - } - - @override - visitLocalFunctionPrefix( - Send node, - LocalFunctionElement function, - IncDecOperator operator, - arg) { - visits.add(new Visit(VisitKind.VISIT_LOCAL_FUNCTION_PREFIX, - element: function, operator: operator)); - } - - @override - visitClassTypeLiteralPrefix( - Send node, - ConstantExpression constant, - IncDecOperator operator, - arg) { - visits.add(new Visit(VisitKind.VISIT_CLASS_TYPE_LITERAL_PREFIX, - constant: constant.getText(), operator: operator)); - } - - @override - visitDynamicTypeLiteralPrefix( - Send node, - ConstantExpression constant, - IncDecOperator operator, - arg) { - visits.add(new Visit(VisitKind.VISIT_DYNAMIC_TYPE_LITERAL_PREFIX, - constant: constant.getText(), operator: operator)); - } - - @override - visitLocalVariablePrefix( - Send node, - LocalVariableElement variable, - IncDecOperator operator, - arg) { - visits.add(new Visit(VisitKind.VISIT_LOCAL_VARIABLE_PREFIX, - element: variable, operator: operator)); - } - - @override - visitParameterPrefix( - Send node, - ParameterElement parameter, - IncDecOperator operator, - arg) { - visits.add(new Visit(VisitKind.VISIT_PARAMETER_PREFIX, - element: parameter, operator: operator)); - } - - @override - visitStaticFieldPrefix( - Send node, - FieldElement field, - IncDecOperator operator, - arg) { - visits.add(new Visit(VisitKind.VISIT_STATIC_FIELD_PREFIX, - element: field, operator: operator)); - } - - @override - visitStaticGetterSetterPrefix( - Send node, - FunctionElement getter, - FunctionElement setter, - IncDecOperator operator, - arg) { - visits.add(new Visit(VisitKind.VISIT_STATIC_GETTER_SETTER_PREFIX, - getter: getter, setter: setter, operator: operator)); - } - - @override - visitStaticMethodSetterPrefix( - Send node, - FunctionElement getter, - FunctionElement setter, - IncDecOperator operator, - arg) { - visits.add(new Visit(VisitKind.VISIT_STATIC_METHOD_SETTER_PREFIX, - getter: getter, setter: setter, operator: operator)); - } - - @override - visitSuperFieldFieldCompound( - Send node, - FieldElement readField, - FieldElement writtenField, - AssignmentOperator operator, - Node rhs, - arg) { - visits.add(new Visit(VisitKind.VISIT_SUPER_FIELD_FIELD_COMPOUND, - getter: readField, setter: writtenField, operator: operator, rhs: rhs)); - apply(rhs, arg); - } - - @override - visitSuperFieldFieldPrefix( - Send node, - FieldElement readField, - FieldElement writtenField, - IncDecOperator operator, - arg) { - visits.add(new Visit(VisitKind.VISIT_SUPER_FIELD_FIELD_PREFIX, - getter: readField, setter: writtenField, operator: operator)); - } - - @override - visitSuperFieldPrefix( - Send node, - FieldElement field, - IncDecOperator operator, - arg) { - visits.add(new Visit(VisitKind.VISIT_SUPER_FIELD_PREFIX, - element: field, operator: operator)); - } - - @override - visitFinalSuperFieldPrefix( - Send node, - FieldElement field, - IncDecOperator operator, - arg) { - visits.add(new Visit(VisitKind.VISIT_SUPER_FINAL_FIELD_PREFIX, - element: field, operator: operator)); - } - - @override - visitSuperFieldSetterPrefix( - Send node, - FieldElement field, - FunctionElement setter, - IncDecOperator operator, - arg) { - visits.add(new Visit(VisitKind.VISIT_SUPER_FIELD_SETTER_PREFIX, - getter: field, setter: setter, operator: operator)); - } - - @override - visitSuperGetterFieldPrefix( - Send node, - FunctionElement getter, - FieldElement field, - IncDecOperator operator, - arg) { - visits.add(new Visit(VisitKind.VISIT_SUPER_GETTER_FIELD_PREFIX, - getter: getter, setter: field, operator: operator)); - } - - @override - visitSuperGetterSetterPrefix( - Send node, - FunctionElement getter, - FunctionElement setter, - IncDecOperator operator, - arg) { - visits.add(new Visit(VisitKind.VISIT_SUPER_GETTER_SETTER_PREFIX, - getter: getter, setter: setter, operator: operator)); - } - - @override - visitSuperMethodSetterPrefix( - Send node, - FunctionElement method, - FunctionElement setter, - IncDecOperator operator, - arg) { - visits.add(new Visit(VisitKind.VISIT_SUPER_METHOD_SETTER_PREFIX, - getter: method, setter: setter, operator: operator)); - } - - @override - visitThisPropertyPrefix( - Send node, - IncDecOperator operator, - Selector getterSelector, - Selector setterSelector, - arg) { - visits.add(new Visit(VisitKind.VISIT_THIS_PROPERTY_PREFIX, - operator: operator, - getter: getterSelector, setter: setterSelector)); - } - - @override - visitTopLevelFieldPrefix( - Send node, - FieldElement field, - IncDecOperator operator, - arg) { - visits.add(new Visit(VisitKind.VISIT_TOP_LEVEL_FIELD_PREFIX, - element: field, operator: operator)); - } - - @override - visitTopLevelGetterSetterPrefix( - Send node, - FunctionElement getter, - FunctionElement setter, - IncDecOperator operator, - arg) { - visits.add(new Visit(VisitKind.VISIT_TOP_LEVEL_GETTER_SETTER_PREFIX, - getter: getter, setter: setter, operator: operator)); - } - - @override - visitTopLevelMethodSetterPrefix( - Send node, - FunctionElement method, - FunctionElement setter, - IncDecOperator operator, - arg) { - visits.add(new Visit(VisitKind.VISIT_TOP_LEVEL_METHOD_SETTER_PREFIX, - getter: method, setter: setter, operator: operator)); - } - - @override - visitTypeVariableTypeLiteralPrefix( - Send node, - TypeVariableElement element, - IncDecOperator operator, - arg) { - visits.add(new Visit(VisitKind.VISIT_TYPE_VARIABLE_TYPE_LITERAL_PREFIX, - element: element, operator: operator)); - } - - @override - visitTypedefTypeLiteralPrefix( - Send node, - ConstantExpression constant, - IncDecOperator operator, - arg) { - visits.add(new Visit(VisitKind.VISIT_TYPEDEF_TYPE_LITERAL_PREFIX, - constant: constant.getText(), operator: operator)); - } - - @override - visitLocalFunctionPostfix( - Send node, - LocalFunctionElement function, - IncDecOperator operator, - arg) { - visits.add(new Visit(VisitKind.VISIT_LOCAL_FUNCTION_POSTFIX, - element: function, operator: operator)); - } - - @override - visitClassTypeLiteralPostfix( - Send node, - ConstantExpression constant, - IncDecOperator operator, - arg) { - visits.add(new Visit(VisitKind.VISIT_CLASS_TYPE_LITERAL_POSTFIX, - constant: constant.getText(), operator: operator)); - } - - @override - visitDynamicTypeLiteralPostfix( - Send node, - ConstantExpression constant, - IncDecOperator operator, - arg) { - visits.add(new Visit(VisitKind.VISIT_DYNAMIC_TYPE_LITERAL_POSTFIX, - constant: constant.getText(), operator: operator)); - } - - @override - visitLocalVariablePostfix( - Send node, - LocalVariableElement variable, - IncDecOperator operator, - arg) { - visits.add(new Visit(VisitKind.VISIT_LOCAL_VARIABLE_POSTFIX, - element: variable, operator: operator)); - } - - @override - visitParameterPostfix( - Send node, - ParameterElement parameter, - IncDecOperator operator, - arg) { - visits.add(new Visit(VisitKind.VISIT_PARAMETER_POSTFIX, - element: parameter, operator: operator)); - } - - @override - visitStaticFieldPostfix( - Send node, - FieldElement field, - IncDecOperator operator, - arg) { - visits.add(new Visit(VisitKind.VISIT_STATIC_FIELD_POSTFIX, - element: field, operator: operator)); - } - - @override - visitStaticGetterSetterPostfix( - Send node, - FunctionElement getter, - FunctionElement setter, - IncDecOperator operator, - arg) { - visits.add(new Visit(VisitKind.VISIT_STATIC_GETTER_SETTER_POSTFIX, - getter: getter, setter: setter, operator: operator)); - } - - @override - visitStaticMethodSetterPostfix( - Send node, - FunctionElement getter, - FunctionElement setter, - IncDecOperator operator, - arg) { - visits.add(new Visit(VisitKind.VISIT_STATIC_METHOD_SETTER_POSTFIX, - getter: getter, setter: setter, operator: operator)); - } - - @override - visitSuperFieldFieldPostfix( - Send node, - FieldElement readField, - FieldElement writtenField, - IncDecOperator operator, - arg) { - visits.add(new Visit(VisitKind.VISIT_SUPER_FIELD_FIELD_POSTFIX, - getter: readField, setter: writtenField, operator: operator)); - } - - @override - visitSuperFieldPostfix( - Send node, - FieldElement field, - IncDecOperator operator, - arg) { - visits.add(new Visit(VisitKind.VISIT_SUPER_FIELD_POSTFIX, - element: field, operator: operator)); - } - - @override - visitFinalSuperFieldPostfix( - Send node, - FieldElement field, - IncDecOperator operator, - arg) { - visits.add(new Visit(VisitKind.VISIT_SUPER_FINAL_FIELD_POSTFIX, - element: field, operator: operator)); - } - - @override - visitSuperFieldSetterPostfix( - Send node, - FieldElement field, - FunctionElement setter, - IncDecOperator operator, - arg) { - visits.add(new Visit(VisitKind.VISIT_SUPER_FIELD_SETTER_POSTFIX, - getter: field, setter: setter, operator: operator)); - } - - @override - visitSuperGetterFieldPostfix( - Send node, - FunctionElement getter, - FieldElement field, - IncDecOperator operator, - arg) { - visits.add(new Visit(VisitKind.VISIT_SUPER_GETTER_FIELD_POSTFIX, - getter: getter, setter: field, operator: operator)); - } - - @override - visitSuperGetterSetterPostfix( - Send node, - FunctionElement getter, - FunctionElement setter, - IncDecOperator operator, - arg) { - visits.add(new Visit(VisitKind.VISIT_SUPER_GETTER_SETTER_POSTFIX, - getter: getter, setter: setter, operator: operator)); - } - - @override - visitSuperMethodSetterPostfix( - Send node, - FunctionElement method, - FunctionElement setter, - IncDecOperator operator, - arg) { - visits.add(new Visit(VisitKind.VISIT_SUPER_METHOD_SETTER_POSTFIX, - getter: method, setter: setter, operator: operator)); - } - - @override - visitThisPropertyPostfix( - Send node, - IncDecOperator operator, - Selector getterSelector, - Selector setterSelector, - arg) { - visits.add(new Visit(VisitKind.VISIT_THIS_PROPERTY_POSTFIX, - operator: operator, - getter: getterSelector, setter: setterSelector)); - } - - @override - visitTopLevelFieldPostfix( - Send node, - FieldElement field, - IncDecOperator operator, - arg) { - visits.add(new Visit(VisitKind.VISIT_TOP_LEVEL_FIELD_POSTFIX, - element: field, operator: operator)); - } - - @override - visitTopLevelGetterSetterPostfix( - Send node, - FunctionElement getter, - FunctionElement setter, - IncDecOperator operator, - arg) { - visits.add(new Visit(VisitKind.VISIT_TOP_LEVEL_GETTER_SETTER_POSTFIX, - getter: getter, setter: setter, operator: operator)); - } - - @override - visitTopLevelMethodSetterPostfix( - Send node, - FunctionElement method, - FunctionElement setter, - IncDecOperator operator, - arg) { - visits.add(new Visit(VisitKind.VISIT_TOP_LEVEL_METHOD_SETTER_POSTFIX, - getter: method, setter: setter, operator: operator)); - } - - @override - visitTypeVariableTypeLiteralPostfix( - Send node, - TypeVariableElement element, - IncDecOperator operator, - arg) { - visits.add(new Visit(VisitKind.VISIT_TYPE_VARIABLE_TYPE_LITERAL_POSTFIX, - element: element, operator: operator)); - } - - @override - visitTypedefTypeLiteralPostfix( - Send node, - ConstantExpression constant, - IncDecOperator operator, - arg) { - visits.add(new Visit(VisitKind.VISIT_TYPEDEF_TYPE_LITERAL_POSTFIX, - constant: constant.getText(), operator: operator)); - } - - @override - visitUnresolvedCompound( - Send node, - ErroneousElement element, - AssignmentOperator operator, - Node rhs, - arg) { - visits.add(new Visit(VisitKind.VISIT_UNRESOLVED_COMPOUND, - operator: operator, rhs: rhs)); - apply(rhs, arg); - } - - @override - visitUnresolvedGet( - Send node, - Element element, - arg) { - visits.add(new Visit(VisitKind.VISIT_UNRESOLVED_GET, name: element.name)); - } - - @override - visitUnresolvedSet( - Send node, - Element element, - Node rhs, - arg) { - visits.add(new Visit(VisitKind.VISIT_UNRESOLVED_SET, - name: element.name, rhs: rhs)); - super.visitUnresolvedSet(node, element, rhs, arg); - } - - @override - visitUnresolvedInvoke( - Send node, - Element element, - NodeList arguments, - Selector selector, - arg) { - visits.add(new Visit(VisitKind.VISIT_UNRESOLVED_INVOKE, - name: element.name, arguments: arguments)); - super.visitUnresolvedInvoke(node, element, arguments, selector, arg); - } - - @override - visitUnresolvedPostfix( - Send node, - ErroneousElement element, - IncDecOperator operator, - arg) { - visits.add(new Visit( - VisitKind.VISIT_UNRESOLVED_POSTFIX, operator: operator)); - } - - @override - visitUnresolvedPrefix( - Send node, - ErroneousElement element, - IncDecOperator operator, - arg) { - visits.add(new Visit( - VisitKind.VISIT_UNRESOLVED_PREFIX, operator: operator)); - } - - @override - visitUnresolvedSuperCompoundIndexSet( - Send node, - Element element, - Node index, - AssignmentOperator operator, - Node rhs, - arg) { - visits.add(new Visit( - VisitKind.VISIT_UNRESOLVED_SUPER_COMPOUND_INDEX_SET, - index: index, operator: operator, rhs: rhs)); - apply(index, arg); - apply(rhs, arg); - } - - @override - visitUnresolvedSuperGetterCompoundIndexSet( - Send node, - Element element, - MethodElement setter, - Node index, - AssignmentOperator operator, - Node rhs, - arg) { - visits.add(new Visit( - VisitKind.VISIT_UNRESOLVED_SUPER_GETTER_COMPOUND_INDEX_SET, - setter: setter, index: index, operator: operator, rhs: rhs)); - apply(index, arg); - apply(rhs, arg); - } - - @override - visitUnresolvedSuperSetterCompoundIndexSet( - Send node, - MethodElement getter, - Element element, - Node index, - AssignmentOperator operator, - Node rhs, - arg) { - visits.add(new Visit( - VisitKind.VISIT_UNRESOLVED_SUPER_SETTER_COMPOUND_INDEX_SET, - getter: getter, index: index, operator: operator, rhs: rhs)); - apply(index, arg); - apply(rhs, arg); - } - - @override - visitUnresolvedSuperIndexSet( - Send node, - ErroneousElement element, - Node index, - Node rhs, - arg) { - visits.add(new Visit(VisitKind.VISIT_UNRESOLVED_SUPER_INDEX_SET, - index: index, rhs: rhs)); - apply(index, arg); - apply(rhs, arg); - } - - @override - visitUnresolvedSuperIndexPostfix( - Send node, - Element element, - Node index, - IncDecOperator operator, - arg) { - visits.add(new Visit(VisitKind.VISIT_UNRESOLVED_SUPER_INDEX_POSTFIX, - index: index, operator: operator)); - apply(index, arg); - } - - @override - visitUnresolvedSuperGetterIndexPostfix( - Send node, - Element element, - MethodElement setter, - Node index, - IncDecOperator operator, - arg) { - visits.add(new Visit(VisitKind.VISIT_UNRESOLVED_SUPER_GETTER_INDEX_POSTFIX, - setter: setter, index: index, operator: operator)); - apply(index, arg); - } - - @override - visitUnresolvedSuperSetterIndexPostfix( - Send node, - MethodElement getter, - Element element, - Node index, - IncDecOperator operator, - arg) { - visits.add(new Visit(VisitKind.VISIT_UNRESOLVED_SUPER_SETTER_INDEX_POSTFIX, - getter: getter, index: index, operator: operator)); - apply(index, arg); - } - - @override - visitUnresolvedSuperIndexPrefix( - Send node, - Element element, - Node index, - IncDecOperator operator, - arg) { - visits.add(new Visit(VisitKind.VISIT_UNRESOLVED_SUPER_INDEX_PREFIX, - index: index, operator: operator)); - apply(index, arg); - } - - @override - visitUnresolvedSuperGetterIndexPrefix( - Send node, - Element element, - MethodElement setter, - Node index, - IncDecOperator operator, - arg) { - visits.add(new Visit(VisitKind.VISIT_UNRESOLVED_SUPER_GETTER_INDEX_PREFIX, - setter: setter, index: index, operator: operator)); - apply(index, arg); - } - - @override - visitUnresolvedSuperSetterIndexPrefix( - Send node, - MethodElement getter, - Element element, - Node index, - IncDecOperator operator, - arg) { - visits.add(new Visit(VisitKind.VISIT_UNRESOLVED_SUPER_SETTER_INDEX_PREFIX, - getter: getter, index: index, operator: operator)); - apply(index, arg); - } - - @override - visitIndexPostfix( - Send node, - Node receiver, - Node index, - IncDecOperator operator, - arg) { - visits.add(new Visit(VisitKind.VISIT_INDEX_POSTFIX, - receiver: receiver, index: index, operator: operator)); - apply(receiver, arg); - apply(index, arg); - } - - @override - visitIndexPrefix( - Send node, - Node receiver, - Node index, - IncDecOperator operator, - arg) { - visits.add(new Visit(VisitKind.VISIT_INDEX_PREFIX, - receiver: receiver, index: index, operator: operator)); - apply(receiver, arg); - apply(index, arg); - } - - @override - visitSuperIndexPostfix( - Send node, - FunctionElement indexFunction, - FunctionElement indexSetFunction, - Node index, - IncDecOperator operator, - arg) { - visits.add(new Visit(VisitKind.VISIT_SUPER_INDEX_POSTFIX, - getter: indexFunction, setter: indexSetFunction, - index: index, operator: operator)); - apply(index, arg); - } - - @override - visitSuperIndexPrefix( - Send node, - FunctionElement indexFunction, - FunctionElement indexSetFunction, - Node index, - IncDecOperator operator, - arg) { - visits.add(new Visit(VisitKind.VISIT_SUPER_INDEX_PREFIX, - getter: indexFunction, setter: indexSetFunction, - index: index, operator: operator)); - apply(index, arg); - } - - @override - visitUnresolvedClassConstructorInvoke( - NewExpression node, - Element constructor, - DartType type, - NodeList arguments, - Selector selector, - arg) { - // TODO(johnniwinther): Test [type] when it is not `dynamic`. - visits.add(new Visit( - VisitKind.VISIT_UNRESOLVED_CLASS_CONSTRUCTOR_INVOKE, - arguments: arguments)); - apply(arguments, arg); - } - - @override - visitUnresolvedConstructorInvoke( - NewExpression node, - Element constructor, - DartType type, - NodeList arguments, - Selector selector, - arg) { - // TODO(johnniwinther): Test [type] when it is not `dynamic`. - visits.add(new Visit( - VisitKind.VISIT_UNRESOLVED_CONSTRUCTOR_INVOKE, - arguments: arguments)); - apply(arguments, arg); - } - - @override - visitConstConstructorInvoke( - NewExpression node, - ConstructedConstantExpression constant, - arg) { - visits.add(new Visit(VisitKind.VISIT_CONST_CONSTRUCTOR_INVOKE, - constant: constant.getText())); - super.visitConstConstructorInvoke(node, constant, arg); - } - - @override - visitBoolFromEnvironmentConstructorInvoke( - NewExpression node, - BoolFromEnvironmentConstantExpression constant, - arg) { - visits.add(new Visit( - VisitKind.VISIT_BOOL_FROM_ENVIRONMENT_CONSTRUCTOR_INVOKE, - constant: constant.getText())); - super.visitBoolFromEnvironmentConstructorInvoke(node, constant, arg); - } - - @override - visitIntFromEnvironmentConstructorInvoke( - NewExpression node, - IntFromEnvironmentConstantExpression constant, - arg) { - visits.add(new Visit( - VisitKind.VISIT_INT_FROM_ENVIRONMENT_CONSTRUCTOR_INVOKE, - constant: constant.getText())); - super.visitIntFromEnvironmentConstructorInvoke(node, constant, arg); - } - - @override - visitStringFromEnvironmentConstructorInvoke( - NewExpression node, - StringFromEnvironmentConstantExpression constant, - arg) { - visits.add(new Visit( - VisitKind.VISIT_STRING_FROM_ENVIRONMENT_CONSTRUCTOR_INVOKE, - constant: constant.getText())); - super.visitStringFromEnvironmentConstructorInvoke(node, constant, arg); - } - - @override - errorNonConstantConstructorInvoke( - NewExpression node, - Element element, - DartType type, - NodeList arguments, - CallStructure callStructure, - arg) { - visits.add(new Visit(VisitKind.ERROR_NON_CONSTANT_CONSTRUCTOR_INVOKE, - element: element, type: type, - arguments: arguments, selector: callStructure)); - super.errorNonConstantConstructorInvoke( - node, element, type, arguments, callStructure, arg); - } - - @override - visitConstructorIncompatibleInvoke( - NewExpression node, - ConstructorElement constructor, - InterfaceType type, - NodeList arguments, - CallStructure callStructure, - arg) { - visits.add(new Visit(VisitKind.VISIT_CONSTRUCTOR_INCOMPATIBLE_INVOKE, - element: constructor, type: type, - arguments: arguments, selector: callStructure)); - super.visitConstructorIncompatibleInvoke( - node, constructor, type, arguments, callStructure, arg); - } - - @override - visitFactoryConstructorInvoke( - NewExpression node, - ConstructorElement constructor, - InterfaceType type, - NodeList arguments, - CallStructure callStructure, - arg) { - visits.add(new Visit( - VisitKind.VISIT_FACTORY_CONSTRUCTOR_INVOKE, - element: constructor, - type: type, - arguments: arguments, - selector: callStructure)); - apply(arguments, arg); - } - - @override - visitGenerativeConstructorInvoke( - NewExpression node, - ConstructorElement constructor, - InterfaceType type, - NodeList arguments, - CallStructure callStructure, - arg) { - visits.add(new Visit( - VisitKind.VISIT_GENERATIVE_CONSTRUCTOR_INVOKE, - element: constructor, - type: type, - arguments: arguments, - selector: callStructure)); - apply(arguments, arg); - } - - @override - visitRedirectingFactoryConstructorInvoke( - NewExpression node, - ConstructorElement constructor, - InterfaceType type, - ConstructorElement effectiveTarget, - InterfaceType effectiveTargetType, - NodeList arguments, - CallStructure callStructure, - arg) { - visits.add(new Visit( - VisitKind.VISIT_REDIRECTING_FACTORY_CONSTRUCTOR_INVOKE, - element: constructor, - type: type, - target: effectiveTarget, - targetType: effectiveTargetType, - arguments: arguments, - selector: callStructure)); - apply(arguments, arg); - } - - @override - visitRedirectingGenerativeConstructorInvoke( - NewExpression node, - ConstructorElement constructor, - InterfaceType type, - NodeList arguments, - CallStructure callStructure, - arg) { - visits.add(new Visit( - VisitKind.VISIT_REDIRECTING_GENERATIVE_CONSTRUCTOR_INVOKE, - element: constructor, - type: type, - arguments: arguments, - selector: callStructure)); - apply(arguments, arg); - } - - @override - visitAbstractClassConstructorInvoke( - NewExpression node, - ConstructorElement constructor, - InterfaceType type, - NodeList arguments, - CallStructure callStructure, - arg) { - visits.add(new Visit( - VisitKind.VISIT_ABSTRACT_CLASS_CONSTRUCTOR_INVOKE, - element: constructor, - type: type, - arguments: arguments, - selector: callStructure)); - apply(arguments, arg); - } - - @override - visitUnresolvedRedirectingFactoryConstructorInvoke( - NewExpression node, - ConstructorElement constructor, - InterfaceType type, - NodeList arguments, - CallStructure callStructure, - arg) { - visits.add(new Visit( - VisitKind.VISIT_UNRESOLVED_REDIRECTING_FACTORY_CONSTRUCTOR_INVOKE, - element: constructor, - type: type, - arguments: arguments, - selector: callStructure)); - apply(arguments, arg); - } - - @override - visitUnresolvedStaticGetterCompound( - Send node, - Element element, - MethodElement setter, - AssignmentOperator operator, - Node rhs, - arg) { - visits.add(new Visit(VisitKind.VISIT_UNRESOLVED_STATIC_GETTER_COMPOUND, - setter: setter, operator: operator, rhs: rhs)); - apply(rhs, arg); - } - - @override - visitUnresolvedTopLevelGetterCompound( - Send node, - Element element, - MethodElement setter, - AssignmentOperator operator, - Node rhs, - arg) { - visits.add(new Visit(VisitKind.VISIT_UNRESOLVED_TOP_LEVEL_GETTER_COMPOUND, - setter: setter, operator: operator, rhs: rhs)); - apply(rhs, arg); - } - - @override - visitUnresolvedStaticSetterCompound( - Send node, - MethodElement getter, - Element element, - AssignmentOperator operator, - Node rhs, - arg) { - visits.add(new Visit(VisitKind.VISIT_UNRESOLVED_STATIC_SETTER_COMPOUND, - getter: getter, operator: operator, rhs: rhs)); - apply(rhs, arg); - } - - @override - visitUnresolvedTopLevelSetterCompound( - Send node, - MethodElement getter, - Element element, - AssignmentOperator operator, - Node rhs, - arg) { - visits.add(new Visit(VisitKind.VISIT_UNRESOLVED_TOP_LEVEL_SETTER_COMPOUND, - getter: getter, operator: operator, rhs: rhs)); - apply(rhs, arg); - } - - @override - visitStaticMethodCompound( - Send node, - MethodElement method, - AssignmentOperator operator, - Node rhs, - arg) { - visits.add(new Visit(VisitKind.VISIT_STATIC_METHOD_COMPOUND, - element: method, operator: operator, rhs: rhs)); - apply(rhs, arg); - } - - @override - visitTopLevelMethodCompound( - Send node, - MethodElement method, - AssignmentOperator operator, - Node rhs, - arg) { - visits.add(new Visit(VisitKind.VISIT_TOP_LEVEL_METHOD_COMPOUND, - element: method, operator: operator, rhs: rhs)); - apply(rhs, arg); - } - - @override - visitUnresolvedStaticGetterPrefix( - Send node, - Element element, - MethodElement setter, - IncDecOperator operator, - arg) { - visits.add(new Visit(VisitKind.VISIT_UNRESOLVED_STATIC_GETTER_PREFIX, - setter: setter, operator: operator)); - } - - @override - visitUnresolvedTopLevelGetterPrefix( - Send node, - Element element, - MethodElement setter, - IncDecOperator operator, - arg) { - visits.add(new Visit(VisitKind.VISIT_UNRESOLVED_TOP_LEVEL_GETTER_PREFIX, - setter: setter, operator: operator)); - } - - @override - visitUnresolvedStaticSetterPrefix( - Send node, - MethodElement getter, - Element element, - IncDecOperator operator, - arg) { - visits.add(new Visit(VisitKind.VISIT_UNRESOLVED_STATIC_SETTER_PREFIX, - getter: getter, operator: operator)); - } - - @override - visitUnresolvedTopLevelSetterPrefix( - Send node, - MethodElement getter, - Element element, - IncDecOperator operator, - arg) { - visits.add(new Visit(VisitKind.VISIT_UNRESOLVED_TOP_LEVEL_SETTER_PREFIX, - getter: getter, operator: operator)); - } - - @override - visitStaticMethodPrefix( - Send node, - MethodElement method, - IncDecOperator operator, - arg) { - visits.add(new Visit(VisitKind.VISIT_STATIC_METHOD_PREFIX, - element: method, operator: operator)); - } - - @override - visitTopLevelMethodPrefix( - Send node, - MethodElement method, - IncDecOperator operator, - arg) { - visits.add(new Visit(VisitKind.VISIT_TOP_LEVEL_METHOD_PREFIX, - element: method, operator: operator)); - } - - @override - visitUnresolvedStaticGetterPostfix( - Send node, - Element element, - MethodElement setter, - IncDecOperator operator, - arg) { - visits.add(new Visit(VisitKind.VISIT_UNRESOLVED_STATIC_GETTER_POSTFIX, - setter: setter, operator: operator)); - } - - @override - visitUnresolvedTopLevelGetterPostfix( - Send node, - Element element, - MethodElement setter, - IncDecOperator operator, - arg) { - visits.add(new Visit(VisitKind.VISIT_UNRESOLVED_TOP_LEVEL_GETTER_POSTFIX, - setter: setter, operator: operator)); - } - - @override - visitUnresolvedStaticSetterPostfix( - Send node, - MethodElement getter, - Element element, - IncDecOperator operator, - arg) { - visits.add(new Visit(VisitKind.VISIT_UNRESOLVED_STATIC_SETTER_POSTFIX, - getter: getter, operator: operator)); - } - - @override - visitUnresolvedTopLevelSetterPostfix( - Send node, - MethodElement getter, - Element element, - IncDecOperator operator, - arg) { - visits.add(new Visit(VisitKind.VISIT_UNRESOLVED_TOP_LEVEL_SETTER_POSTFIX, - getter: getter, operator: operator)); - } - - @override - visitStaticMethodPostfix( - Send node, - MethodElement method, - IncDecOperator operator, - arg) { - visits.add(new Visit(VisitKind.VISIT_STATIC_METHOD_POSTFIX, - element: method, operator: operator)); - } - - @override - visitTopLevelMethodPostfix( - Send node, - MethodElement method, - IncDecOperator operator, - arg) { - visits.add(new Visit(VisitKind.VISIT_TOP_LEVEL_METHOD_POSTFIX, - element: method, operator: operator)); - } - - @override - visitUnresolvedSuperGetterCompound( - Send node, Element element, - MethodElement setter, - AssignmentOperator operator, - Node rhs, - arg) { - visits.add(new Visit(VisitKind.VISIT_UNRESOLVED_SUPER_GETTER_COMPOUND, - setter: setter, operator: operator, rhs: rhs)); - apply(rhs, arg); - } - - @override - visitUnresolvedSuperGetterPostfix( - Send node, - Element element, - MethodElement setter, - IncDecOperator operator, - arg) { - visits.add(new Visit(VisitKind.VISIT_UNRESOLVED_SUPER_GETTER_POSTFIX, - setter: setter, operator: operator)); - } - - @override - visitUnresolvedSuperGetterPrefix( - Send node, - Element element, - MethodElement setter, - IncDecOperator operator, - arg) { - visits.add(new Visit(VisitKind.VISIT_UNRESOLVED_SUPER_GETTER_PREFIX, - setter: setter, operator: operator)); - } - - @override - visitUnresolvedSuperSetterCompound( - Send node, MethodElement getter, - Element element, - AssignmentOperator operator, - Node rhs, - arg) { - visits.add(new Visit(VisitKind.VISIT_UNRESOLVED_SUPER_SETTER_COMPOUND, - getter: getter, operator: operator, rhs: rhs)); - apply(rhs, arg); - } - - @override - visitUnresolvedSuperSetterPostfix( - Send node, - MethodElement getter, - Element element, - IncDecOperator operator, - arg) { - visits.add(new Visit(VisitKind.VISIT_UNRESOLVED_SUPER_SETTER_POSTFIX, - getter: getter, operator: operator)); - } - - @override - visitUnresolvedSuperSetterPrefix( - Send node, - MethodElement getter, - Element element, - IncDecOperator operator, - arg) { - visits.add(new Visit(VisitKind.VISIT_UNRESOLVED_SUPER_SETTER_PREFIX, - getter: getter, operator: operator)); - } - - @override - visitIfNotNullDynamicPropertyGet( - Send node, - Node receiver, - Selector selector, - arg) { - visits.add(new Visit(VisitKind.VISIT_IF_NOT_NULL_DYNAMIC_PROPERTY_GET, - receiver: receiver, name: selector.name)); - super.visitIfNotNullDynamicPropertyGet(node, receiver, selector, arg); - } - - @override - visitIfNotNullDynamicPropertySet( - Send node, - Node receiver, - Selector selector, - Node rhs, - arg) { - visits.add(new Visit(VisitKind.VISIT_IF_NOT_NULL_DYNAMIC_PROPERTY_SET, - receiver: receiver, name: selector.name, rhs: rhs)); - super.visitIfNotNullDynamicPropertySet(node, receiver, selector, rhs, arg); - } - - @override - visitIfNotNullDynamicPropertyInvoke( - Send node, - Node receiver, - NodeList arguments, - Selector selector, - arg) { - visits.add(new Visit(VisitKind.VISIT_IF_NOT_NULL_DYNAMIC_PROPERTY_INVOKE, - receiver: receiver, selector: selector, arguments: arguments)); - super.visitIfNotNullDynamicPropertyInvoke( - node, receiver, arguments, selector, arg); - } - - @override - visitIfNotNullDynamicPropertyPrefix( - Send node, - Node receiver, - IncDecOperator operator, - Selector getterSelector, - Selector setterSelector, - arg) { - visits.add(new Visit(VisitKind.VISIT_IF_NOT_NULL_DYNAMIC_PROPERTY_PREFIX, - receiver: receiver, operator: operator, - getter: getterSelector, setter: setterSelector)); - super.visitIfNotNullDynamicPropertyPrefix( - node, receiver, operator, getterSelector, setterSelector, arg); - } - - @override - visitIfNotNullDynamicPropertyPostfix( - Send node, - Node receiver, - IncDecOperator operator, - Selector getterSelector, - Selector setterSelector, - arg) { - visits.add(new Visit(VisitKind.VISIT_IF_NOT_NULL_DYNAMIC_PROPERTY_POSTFIX, - receiver: receiver, operator: operator, - getter: getterSelector, setter: setterSelector)); - super.visitIfNotNullDynamicPropertyPostfix( - node, receiver, operator, getterSelector, setterSelector, arg); - } - - @override - visitIfNotNullDynamicPropertyCompound( - Send node, - Node receiver, - AssignmentOperator operator, - Node rhs, - Selector getterSelector, - Selector setterSelector, - arg) { - visits.add(new Visit(VisitKind.VISIT_IF_NOT_NULL_DYNAMIC_PROPERTY_COMPOUND, - receiver: receiver, operator: operator, rhs: rhs, - getter: getterSelector, setter: setterSelector)); - super.visitIfNotNullDynamicPropertyCompound( - node, receiver, operator, rhs, getterSelector, setterSelector, arg); - } - - @override - visitIfNull( - Send node, - Node left, - Node right, - arg) { - visits.add(new Visit(VisitKind.VISIT_IF_NULL, left: left, right: right)); - super.visitIfNull(node, left, right, arg); - } - - @override - visitConstantGet( - Send node, - ConstantExpression constant, - arg) { - visits.add(new Visit(VisitKind.VISIT_CONSTANT_GET, - constant: constant.getText())); - super.visitConstantGet(node, constant, arg); - } - - @override - visitConstantInvoke( - Send node, - ConstantExpression constant, - NodeList arguments, - CallStructure callStructure, - arg) { - visits.add(new Visit(VisitKind.VISIT_CONSTANT_INVOKE, - constant: constant.getText())); - super.visitConstantInvoke(node, constant, arguments, callStructure, arg); - } -} +// 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; + +class SemanticSendTestVisitor extends SemanticTestVisitor { + + SemanticSendTestVisitor(TreeElements elements) : super(elements); + + @override + visitAs( + Send node, + Node expression, + DartType type, + arg) { + visits.add(new Visit(VisitKind.VISIT_AS, + expression: expression, type: type)); + apply(expression, arg); + } + + @override + visitAssert( + Send node, + Node expression, + arg) { + visits.add(new Visit(VisitKind.VISIT_ASSERT, expression: expression)); + super.visitAssert(node, expression, arg); + } + + @override + errorInvalidAssert( + Send node, + NodeList arguments, + arg) { + visits.add(new Visit(VisitKind.ERROR_INVALID_ASSERT, arguments: arguments)); + super.errorInvalidAssert(node, arguments, arg); + } + + @override + visitBinary( + Send node, + Node left, + BinaryOperator operator, + Node right, + arg) { + visits.add(new Visit(VisitKind.VISIT_BINARY, + left: left, operator: operator, right: right)); + super.visitBinary(node, left, operator, right, arg); + } + + @override + errorUndefinedBinaryExpression( + Send node, + Node left, + Operator operator, + Node right, + arg) { + visits.add(new Visit(VisitKind.ERROR_UNDEFINED_BINARY_EXPRESSION, + left: left, operator: operator, right: right)); + super.errorUndefinedBinaryExpression(node, left, operator, right, arg); + } + + @override + visitIndex( + Send node, + Node receiver, + Node index, + arg) { + visits.add(new Visit(VisitKind.VISIT_INDEX, + receiver: receiver, index: index)); + apply(receiver, arg); + apply(index, arg); + } + + @override + visitClassTypeLiteralGet( + Send node, + ConstantExpression constant, + arg) { + visits.add(new Visit(VisitKind.VISIT_CLASS_TYPE_LITERAL_GET, + constant: constant.getText())); + } + + @override + visitClassTypeLiteralInvoke( + Send node, + ConstantExpression constant, + NodeList arguments, + CallStructure callStructure, + arg) { + visits.add(new Visit(VisitKind.VISIT_CLASS_TYPE_LITERAL_INVOKE, + constant: constant.getText(), arguments: arguments)); + apply(arguments, arg); + } + + @override + visitClassTypeLiteralSet( + SendSet node, + ConstantExpression constant, + Node rhs, + arg) { + visits.add(new Visit(VisitKind.VISIT_CLASS_TYPE_LITERAL_INVOKE, + constant: constant.getText(), rhs: rhs)); + super.visitClassTypeLiteralSet(node, constant, rhs, arg); + } + + @override + visitNotEquals( + Send node, + Node left, + Node right, + arg) { + visits.add(new Visit(VisitKind.VISIT_NOT_EQUALS, + left: left, right: right)); + apply(left, arg); + apply(right, arg); + } + + @override + visitDynamicPropertyPrefix( + Send node, + Node receiver, + IncDecOperator operator, + Selector getterSelector, + Selector setterSelector, + arg) { + visits.add(new Visit(VisitKind.VISIT_DYNAMIC_PROPERTY_PREFIX, + receiver: receiver, operator: operator, + getter: getterSelector, setter: setterSelector)); + apply(receiver, arg); + } + + @override + visitDynamicPropertyPostfix( + Send node, + Node receiver, + IncDecOperator operator, + Selector getterSelector, + Selector setterSelector, + arg) { + visits.add(new Visit(VisitKind.VISIT_DYNAMIC_PROPERTY_POSTFIX, + receiver: receiver, operator: operator, + getter: getterSelector, setter: setterSelector)); + apply(receiver, arg); + } + + @override + visitDynamicPropertyGet( + Send node, + Node receiver, + Selector selector, + arg) { + visits.add(new Visit(VisitKind.VISIT_DYNAMIC_PROPERTY_GET, + receiver: receiver, name: selector.name)); + apply(receiver, arg); + } + + @override + visitDynamicPropertyInvoke( + Send node, + Node receiver, + NodeList arguments, + Selector selector, + arg) { + visits.add(new Visit(VisitKind.VISIT_DYNAMIC_PROPERTY_INVOKE, + receiver: receiver, name: selector.name, arguments: arguments)); + apply(receiver, arg); + apply(arguments, arg); + } + + @override + visitDynamicPropertySet( + SendSet node, + Node receiver, + Selector selector, + Node rhs, + arg) { + visits.add(new Visit(VisitKind.VISIT_DYNAMIC_PROPERTY_SET, + receiver: receiver, name: selector.name, rhs: rhs)); + super.visitDynamicPropertySet(node, receiver, selector, rhs, arg); + } + + @override + visitDynamicTypeLiteralGet( + Send node, + ConstantExpression constant, + arg) { + visits.add(new Visit(VisitKind.VISIT_DYNAMIC_TYPE_LITERAL_GET, + constant: constant.getText())); + } + + @override + visitDynamicTypeLiteralInvoke( + Send node, + ConstantExpression constant, + NodeList arguments, + CallStructure callStructure, + arg) { + visits.add(new Visit(VisitKind.VISIT_DYNAMIC_TYPE_LITERAL_INVOKE, + constant: constant.getText(), arguments: arguments)); + } + + @override + visitDynamicTypeLiteralSet( + Send node, + ConstantExpression constant, + Node rhs, + arg) { + visits.add(new Visit(VisitKind.VISIT_DYNAMIC_TYPE_LITERAL_SET, + rhs: rhs)); + super.visitDynamicTypeLiteralSet(node, constant, rhs, arg); + } + + @override + visitExpressionInvoke( + Send node, + Node expression, + NodeList arguments, + Selector selector, + arg) { + visits.add(new Visit(VisitKind.VISIT_EXPRESSION_INVOKE, + receiver: expression, arguments: arguments)); + } + + @override + visitIs( + Send node, + Node expression, + DartType type, + arg) { + visits.add(new Visit(VisitKind.VISIT_IS, + expression: expression, type: type)); + apply(expression, arg); + } + + @override + visitIsNot( + Send node, + Node expression, + DartType type, + arg) { + visits.add(new Visit(VisitKind.VISIT_IS_NOT, + expression: expression, type: type)); + apply(expression, arg); + } + + @override + visitLogicalAnd( + Send node, + Node left, + Node right, + arg) { + visits.add(new Visit(VisitKind.VISIT_LOGICAL_AND, + left: left, right: right)); + apply(left, arg); + apply(right, arg); + } + + @override + visitLogicalOr( + Send node, + Node left, + Node right, + arg) { + visits.add(new Visit(VisitKind.VISIT_LOGICAL_OR, + left: left, right: right)); + apply(left, arg); + apply(right, arg); + } + + @override + visitLocalFunctionGet( + Send node, + LocalFunctionElement function, + arg) { + visits.add(new Visit(VisitKind.VISIT_LOCAL_FUNCTION_GET, + element: function)); + } + + @override + visitLocalFunctionSet( + SendSet node, + LocalFunctionElement function, + Node rhs, + arg) { + visits.add(new Visit(VisitKind.VISIT_LOCAL_FUNCTION_SET, + element: function, rhs: rhs)); + super.visitLocalFunctionSet(node, function, rhs, arg); + } + + @override + visitLocalFunctionInvoke( + Send node, + LocalFunctionElement function, + NodeList arguments, + CallStructure callStructure, + arg) { + visits.add(new Visit(VisitKind.VISIT_LOCAL_FUNCTION_INVOKE, + element: function, arguments: arguments, selector: callStructure)); + super.visitLocalFunctionInvoke( + node, function, arguments, callStructure, arg); + } + + @override + visitLocalFunctionIncompatibleInvoke( + Send node, + LocalFunctionElement function, + NodeList arguments, + CallStructure callStructure, + arg) { + visits.add(new Visit(VisitKind.VISIT_LOCAL_FUNCTION_INCOMPATIBLE_INVOKE, + element: function, arguments: arguments, selector: callStructure)); + super.visitLocalFunctionInvoke( + node, function, arguments, callStructure, arg); + } + + @override + visitLocalVariableGet( + Send node, + LocalVariableElement variable, + arg) { + visits.add(new Visit(VisitKind.VISIT_LOCAL_VARIABLE_GET, + element: variable)); + } + + @override + visitLocalVariableInvoke( + Send node, + LocalVariableElement variable, + NodeList arguments, + CallStructure callStructure, + arg) { + visits.add(new Visit(VisitKind.VISIT_LOCAL_VARIABLE_INVOKE, + element: variable, arguments: arguments, selector: callStructure)); + apply(arguments, arg); + } + + @override + visitLocalVariableSet( + SendSet node, + LocalVariableElement variable, + Node rhs, + arg) { + visits.add(new Visit(VisitKind.VISIT_LOCAL_VARIABLE_SET, + element: variable, rhs: rhs)); + super.visitLocalVariableSet(node, variable, rhs, arg); + } + + @override + visitFinalLocalVariableSet( + SendSet node, + LocalVariableElement variable, + Node rhs, + arg) { + visits.add(new Visit(VisitKind.VISIT_FINAL_LOCAL_VARIABLE_SET, + element: variable, rhs: rhs)); + super.visitFinalLocalVariableSet(node, variable, rhs, arg); + } + + @override + visitParameterGet( + Send node, + ParameterElement parameter, + arg) { + visits.add(new Visit(VisitKind.VISIT_PARAMETER_GET, element: parameter)); + } + + @override + visitParameterInvoke( + Send node, + ParameterElement parameter, + NodeList arguments, + CallStructure callStructure, + arg) { + visits.add(new Visit(VisitKind.VISIT_PARAMETER_INVOKE, + element: parameter, arguments: arguments, selector: callStructure)); + apply(arguments, arg); + } + + @override + visitParameterSet( + SendSet node, + ParameterElement parameter, + Node rhs, + arg) { + visits.add(new Visit(VisitKind.VISIT_PARAMETER_SET, + element: parameter, rhs: rhs)); + super.visitParameterSet(node, parameter, rhs, arg); + } + + @override + visitFinalParameterSet( + SendSet node, + ParameterElement parameter, + Node rhs, + arg) { + visits.add(new Visit(VisitKind.VISIT_FINAL_PARAMETER_SET, + element: parameter, rhs: rhs)); + super.visitFinalParameterSet(node, parameter, rhs, arg); + } + + @override + visitStaticFieldGet( + Send node, + FieldElement field, + arg) { + visits.add(new Visit(VisitKind.VISIT_STATIC_FIELD_GET, element: field)); + } + + @override + visitStaticFieldInvoke( + Send node, + FieldElement field, + NodeList arguments, + CallStructure callStructure, + arg) { + visits.add(new Visit(VisitKind.VISIT_STATIC_FIELD_INVOKE, + element: field, arguments: arguments)); + apply(arguments, arg); + } + + @override + visitStaticFieldSet( + SendSet node, + FieldElement field, + Node rhs, + arg) { + visits.add(new Visit(VisitKind.VISIT_STATIC_FIELD_SET, + element: field, rhs: rhs)); + super.visitStaticFieldSet(node, field, rhs, arg); + } + + @override + visitFinalStaticFieldSet( + SendSet node, + FieldElement field, + Node rhs, + arg) { + visits.add(new Visit(VisitKind.VISIT_FINAL_STATIC_FIELD_SET, + element: field, rhs: rhs)); + super.visitFinalStaticFieldSet(node, field, rhs, arg); + } + + @override + visitStaticFunctionGet( + Send node, + MethodElement function, + arg) { + visits.add(new Visit(VisitKind.VISIT_STATIC_FUNCTION_GET, + element: function)); + } + + @override + visitStaticFunctionSet( + SendSet node, + MethodElement function, + Node rhs, + arg) { + visits.add(new Visit(VisitKind.VISIT_STATIC_FUNCTION_SET, + element: function, rhs: rhs)); + super.visitStaticFunctionSet(node, function, rhs, arg); + } + + @override + visitStaticFunctionInvoke( + Send node, + MethodElement function, + NodeList arguments, + CallStructure callStructure, + arg) { + visits.add(new Visit(VisitKind.VISIT_STATIC_FUNCTION_INVOKE, + element: function, arguments: arguments)); + super.visitStaticFunctionInvoke( + node, function, arguments, callStructure, arg); + } + + @override + visitStaticFunctionIncompatibleInvoke( + Send node, + MethodElement function, + NodeList arguments, + CallStructure callStructure, + arg) { + visits.add(new Visit(VisitKind.VISIT_STATIC_FUNCTION_INCOMPATIBLE_INVOKE, + element: function, arguments: arguments)); + apply(arguments, arg); + } + + @override + visitStaticGetterGet( + Send node, + FunctionElement getter, + arg) { + visits.add(new Visit(VisitKind.VISIT_STATIC_GETTER_GET, + element: getter)); + super.visitStaticGetterGet(node, getter, arg); + } + + @override + visitStaticGetterSet( + SendSet node, + MethodElement getter, + Node rhs, + arg) { + visits.add(new Visit(VisitKind.VISIT_STATIC_GETTER_SET, + element: getter, rhs: rhs)); + super.visitStaticGetterSet(node, getter, rhs, arg); + } + + @override + visitStaticGetterInvoke( + Send node, + FunctionElement getter, + NodeList arguments, + CallStructure callStructure, + arg) { + visits.add(new Visit(VisitKind.VISIT_STATIC_GETTER_INVOKE, + element: getter, arguments: arguments)); + super.visitStaticGetterInvoke(node, getter, arguments, callStructure, arg); + } + + @override + visitStaticSetterInvoke( + Send node, + FunctionElement setter, + NodeList arguments, + CallStructure callStructure, + arg) { + visits.add(new Visit(VisitKind.VISIT_STATIC_SETTER_INVOKE, + element: setter, arguments: arguments)); + super.visitStaticSetterInvoke(node, setter, arguments, callStructure, arg); + } + + @override + visitStaticSetterGet( + Send node, + FunctionElement getter, + arg) { + visits.add(new Visit(VisitKind.VISIT_STATIC_SETTER_GET, + element: getter)); + super.visitStaticSetterGet(node, getter, arg); + } + + @override + visitStaticSetterSet( + SendSet node, + FunctionElement setter, + Node rhs, + arg) { + visits.add(new Visit(VisitKind.VISIT_STATIC_SETTER_SET, + element: setter, rhs: rhs)); + super.visitStaticSetterSet(node, setter, rhs, arg); + } + + @override + visitSuperBinary( + Send node, + FunctionElement function, + BinaryOperator operator, + Node argument, + arg) { + visits.add(new Visit(VisitKind.VISIT_SUPER_BINARY, + element: function, operator: operator, right: argument)); + apply(argument, arg); + } + + @override + visitUnresolvedSuperBinary( + Send node, + Element element, + BinaryOperator operator, + Node argument, + arg) { + visits.add(new Visit(VisitKind.VISIT_UNRESOLVED_SUPER_BINARY, + operator: operator, right: argument)); + apply(argument, arg); + } + + @override + visitSuperIndex( + Send node, + FunctionElement function, + Node index, + arg) { + visits.add(new Visit(VisitKind.VISIT_SUPER_INDEX, + element: function, index: index)); + apply(index, arg); + } + + @override + visitUnresolvedSuperIndex( + Send node, + Element element, + Node index, + arg) { + visits.add(new Visit(VisitKind.VISIT_UNRESOLVED_SUPER_INDEX, + index: index)); + apply(index, arg); + } + + @override + visitSuperNotEquals( + Send node, + FunctionElement function, + Node argument, + arg) { + visits.add(new Visit(VisitKind.VISIT_SUPER_NOT_EQUALS, + element: function, right: argument)); + apply(argument, arg); + } + + @override + visitThisGet(Identifier node, arg) { + visits.add(new Visit(VisitKind.VISIT_THIS_GET)); + } + + @override + visitThisInvoke( + Send node, + NodeList arguments, + CallStructure callStructure, + arg) { + visits.add(new Visit(VisitKind.VISIT_THIS_INVOKE, arguments: arguments)); + apply(arguments, arg); + } + + @override + visitThisPropertyGet( + Send node, + Selector selector, + arg) { + visits.add(new Visit(VisitKind.VISIT_THIS_PROPERTY_GET, + name: selector.name)); + } + + @override + visitThisPropertyInvoke( + Send node, + NodeList arguments, + Selector selector, + arg) { + visits.add(new Visit(VisitKind.VISIT_THIS_PROPERTY_INVOKE, + name: selector.name, arguments: arguments)); + apply(arguments, arg); + } + + @override + visitThisPropertySet( + SendSet node, + Selector selector, + Node rhs, + arg) { + visits.add(new Visit(VisitKind.VISIT_THIS_PROPERTY_SET, + name: selector.name, rhs: rhs)); + apply(rhs, arg); + } + + @override + visitTopLevelFieldGet( + Send node, + FieldElement field, + arg) { + visits.add(new Visit(VisitKind.VISIT_TOP_LEVEL_FIELD_GET, element: field)); + } + + @override + visitTopLevelFieldInvoke( + Send node, + FieldElement field, + NodeList arguments, + CallStructure callStructure, + arg) { + visits.add(new Visit(VisitKind.VISIT_TOP_LEVEL_FIELD_INVOKE, + element: field, arguments: arguments)); + apply(arguments, arg); + } + + @override + visitTopLevelFieldSet( + SendSet node, + FieldElement field, + Node rhs, + arg) { + visits.add(new Visit(VisitKind.VISIT_TOP_LEVEL_FIELD_SET, + element: field, rhs: rhs)); + super.visitTopLevelFieldSet(node, field, rhs, arg); + } + + @override + visitFinalTopLevelFieldSet( + SendSet node, + FieldElement field, + Node rhs, + arg) { + visits.add(new Visit(VisitKind.VISIT_FINAL_TOP_LEVEL_FIELD_SET, + element: field, rhs: rhs)); + super.visitFinalTopLevelFieldSet(node, field, rhs, arg); + } + + @override + visitTopLevelFunctionGet( + Send node, + MethodElement function, + arg) { + visits.add(new Visit(VisitKind.VISIT_TOP_LEVEL_FUNCTION_GET, + element: function)); + } + + @override + visitTopLevelFunctionSet( + SendSet node, + MethodElement function, + Node rhs, + arg) { + visits.add(new Visit(VisitKind.VISIT_TOP_LEVEL_FUNCTION_SET, + element: function, rhs: rhs)); + super.visitTopLevelFunctionSet(node, function, rhs, arg); + } + + @override + visitTopLevelFunctionInvoke( + Send node, + MethodElement function, + NodeList arguments, + CallStructure callStructure, + arg) { + visits.add(new Visit(VisitKind.VISIT_TOP_LEVEL_FUNCTION_INVOKE, + element: function, arguments: arguments)); + apply(arguments, arg); + } + + @override + visitTopLevelFunctionIncompatibleInvoke( + Send node, + MethodElement function, + NodeList arguments, + CallStructure callStructure, + arg) { + visits.add(new Visit(VisitKind.VISIT_TOP_LEVEL_FUNCTION_INCOMPATIBLE_INVOKE, + element: function, arguments: arguments)); + apply(arguments, arg); + } + + @override + visitTopLevelGetterGet( + Send node, + FunctionElement getter, + arg) { + visits.add(new Visit(VisitKind.VISIT_TOP_LEVEL_GETTER_GET, + element: getter)); + super.visitTopLevelGetterGet(node, getter, arg); + } + + @override + visitTopLevelSetterGet( + Send node, + FunctionElement setter, + arg) { + visits.add(new Visit(VisitKind.VISIT_TOP_LEVEL_SETTER_GET, + element: setter)); + super.visitTopLevelSetterGet(node, setter, arg); + } + + @override + visitTopLevelGetterInvoke( + Send node, + FunctionElement getter, + NodeList arguments, + CallStructure callStructure, + arg) { + visits.add(new Visit(VisitKind.VISIT_TOP_LEVEL_GETTER_INVOKE, + element: getter, arguments: arguments)); + super.visitTopLevelGetterInvoke( + node, getter, arguments, callStructure, arg); + } + + @override + visitTopLevelSetterInvoke( + Send node, + FunctionElement setter, + NodeList arguments, + CallStructure callStructure, + arg) { + visits.add(new Visit(VisitKind.VISIT_TOP_LEVEL_SETTER_INVOKE, + element: setter, arguments: arguments)); + super.visitTopLevelSetterInvoke( + node, setter, arguments, callStructure, arg); + } + + @override + visitTopLevelGetterSet( + SendSet node, + FunctionElement getter, + Node rhs, + arg) { + visits.add(new Visit(VisitKind.VISIT_TOP_LEVEL_GETTER_SET, + element: getter, rhs: rhs)); + super.visitTopLevelGetterSet(node, getter, rhs, arg); + } + + @override + visitTopLevelSetterSet( + SendSet node, + FunctionElement setter, + Node rhs, + arg) { + visits.add(new Visit(VisitKind.VISIT_TOP_LEVEL_SETTER_SET, + element: setter, rhs: rhs)); + super.visitTopLevelSetterSet(node, setter, rhs, arg); + } + + @override + visitTypeVariableTypeLiteralGet( + Send node, + TypeVariableElement element, + arg) { + visits.add(new Visit(VisitKind.VISIT_TYPE_VARIABLE_TYPE_LITERAL_GET, + element: element)); + } + + @override + visitTypeVariableTypeLiteralInvoke( + Send node, + TypeVariableElement element, + NodeList arguments, + CallStructure callStructure, + arg) { + visits.add(new Visit(VisitKind.VISIT_TYPE_VARIABLE_TYPE_LITERAL_INVOKE, + element: element, arguments: arguments)); + apply(arguments, arg); + } + + @override + visitTypeVariableTypeLiteralSet( + SendSet node, + TypeVariableElement element, + Node rhs, + arg) { + visits.add(new Visit(VisitKind.VISIT_TYPE_VARIABLE_TYPE_LITERAL_SET, + element: element, rhs: rhs)); + super.visitTypeVariableTypeLiteralSet(node, element, rhs, arg); + } + + @override + visitTypedefTypeLiteralGet( + Send node, + ConstantExpression constant, + arg) { + visits.add(new Visit(VisitKind.VISIT_TYPEDEF_TYPE_LITERAL_GET, + constant: constant.getText())); + } + + @override + visitTypedefTypeLiteralInvoke( + Send node, + ConstantExpression constant, + NodeList arguments, + CallStructure callStructure, + arg) { + visits.add(new Visit(VisitKind.VISIT_TYPEDEF_TYPE_LITERAL_INVOKE, + constant: constant.getText(), arguments: arguments)); + apply(arguments, arg); + } + + @override + visitTypedefTypeLiteralSet( + SendSet node, + ConstantExpression constant, + Node rhs, + arg) { + visits.add(new Visit(VisitKind.VISIT_TYPEDEF_TYPE_LITERAL_SET, + constant: constant.getText(), rhs: rhs)); + super.visitTypedefTypeLiteralSet(node, constant, rhs, arg); + } + + @override + visitUnary( + Send node, + UnaryOperator operator, + Node expression, + arg) { + visits.add(new Visit(VisitKind.VISIT_UNARY, + expression: expression, operator: operator)); + super.visitUnary(node, operator, expression, arg); + } + + @override + errorUndefinedUnaryExpression( + Send node, + Operator operator, + Node expression, + arg) { + visits.add(new Visit(VisitKind.ERROR_UNDEFINED_UNARY_EXPRESSION, + expression: expression, operator: operator)); + super.errorUndefinedUnaryExpression(node, operator, expression, arg); + } + + @override + visitNot( + Send node, + Node expression, + arg) { + visits.add(new Visit(VisitKind.VISIT_NOT, expression: expression)); + apply(expression, arg); + } + + @override + visitSuperFieldGet( + Send node, + FieldElement field, + arg) { + visits.add(new Visit(VisitKind.VISIT_SUPER_FIELD_GET, element: field)); + } + + @override + visitUnresolvedSuperGet( + Send node, + Element element, + arg) { + visits.add(new Visit(VisitKind.VISIT_UNRESOLVED_SUPER_GET)); + } + + @override + visitSuperFieldInvoke( + Send node, + FieldElement field, + NodeList arguments, + CallStructure callStructure, + arg) { + visits.add(new Visit(VisitKind.VISIT_SUPER_FIELD_INVOKE, + element: field, arguments: arguments)); + apply(arguments, arg); + } + + @override + visitUnresolvedSuperInvoke( + Send node, + Element element, + NodeList arguments, + Selector selector, + arg) { + visits.add(new Visit(VisitKind.VISIT_UNRESOLVED_SUPER_INVOKE, + arguments: arguments)); + apply(arguments, arg); + } + + @override + visitSuperFieldSet( + SendSet node, + FieldElement field, + Node rhs, + arg) { + visits.add(new Visit(VisitKind.VISIT_SUPER_FIELD_SET, + element: field, rhs: rhs)); + super.visitSuperFieldSet(node, field, rhs, arg); + } + + @override + visitFinalSuperFieldSet( + SendSet node, + FieldElement field, + Node rhs, + arg) { + visits.add(new Visit(VisitKind.VISIT_FINAL_SUPER_FIELD_SET, + element: field, rhs: rhs)); + super.visitFinalSuperFieldSet(node, field, rhs, arg); + } + + @override + visitSuperMethodGet( + Send node, + MethodElement method, + arg) { + visits.add(new Visit(VisitKind.VISIT_SUPER_METHOD_GET, element: method)); + } + + @override + visitSuperMethodSet( + SendSet node, + MethodElement method, + Node rhs, + arg) { + visits.add(new Visit(VisitKind.VISIT_SUPER_METHOD_SET, + element: method, rhs: rhs)); + super.visitSuperMethodSet(node, method, rhs, arg); + } + + @override + visitSuperMethodInvoke( + Send node, + MethodElement method, + NodeList arguments, + CallStructure callStructure, + arg) { + visits.add(new Visit(VisitKind.VISIT_SUPER_METHOD_INVOKE, + element: method, arguments: arguments)); + apply(arguments, arg); + } + + @override + visitSuperMethodIncompatibleInvoke( + Send node, + MethodElement method, + NodeList arguments, + CallStructure callStructure, + arg) { + visits.add(new Visit(VisitKind.VISIT_SUPER_METHOD_INCOMPATIBLE_INVOKE, + element: method, arguments: arguments)); + apply(arguments, arg); + } + + @override + visitSuperGetterGet( + Send node, + FunctionElement getter, + arg) { + visits.add(new Visit(VisitKind.VISIT_SUPER_GETTER_GET, element: getter)); + super.visitSuperGetterGet(node, getter, arg); + } + + @override + visitSuperSetterGet( + Send node, + FunctionElement setter, + arg) { + visits.add(new Visit(VisitKind.VISIT_SUPER_SETTER_GET, element: setter)); + super.visitSuperSetterGet(node, setter, arg); + } + + @override + visitSuperGetterInvoke( + Send node, + FunctionElement getter, + NodeList arguments, + CallStructure callStructure, + arg) { + visits.add(new Visit(VisitKind.VISIT_SUPER_GETTER_INVOKE, + element: getter, arguments: arguments)); + super.visitSuperGetterInvoke(node, getter, arguments, callStructure, arg); + } + + @override + visitSuperSetterInvoke( + Send node, + FunctionElement setter, + NodeList arguments, + CallStructure callStructure, + arg) { + visits.add(new Visit(VisitKind.VISIT_SUPER_SETTER_INVOKE, + element: setter, arguments: arguments)); + super.visitSuperSetterInvoke(node, setter, arguments, callStructure, arg); + } + + @override + visitSuperGetterSet( + SendSet node, + FunctionElement getter, + Node rhs, + arg) { + visits.add(new Visit(VisitKind.VISIT_SUPER_GETTER_SET, + element: getter, rhs: rhs)); + super.visitSuperGetterSet(node, getter, rhs, arg); + } + + @override + visitSuperSetterSet( + SendSet node, + FunctionElement setter, + Node rhs, + arg) { + visits.add(new Visit(VisitKind.VISIT_SUPER_SETTER_SET, + element: setter, rhs: rhs)); + super.visitSuperSetterSet(node, setter, rhs, arg); + } + + @override + visitSuperUnary( + Send node, + UnaryOperator operator, + FunctionElement function, + arg) { + visits.add(new Visit(VisitKind.VISIT_SUPER_UNARY, + element: function, operator: operator)); + } + + @override + visitUnresolvedSuperUnary( + Send node, + UnaryOperator operator, + Element element, + arg) { + visits.add(new Visit(VisitKind.VISIT_UNRESOLVED_SUPER_UNARY, + operator: operator)); + } + + @override + visitEquals( + Send node, + Node left, + Node right, + arg) { + visits.add(new Visit(VisitKind.VISIT_EQUALS, left: left, right: right)); + apply(left, arg); + apply(right, arg); + } + + @override + visitSuperEquals( + Send node, + FunctionElement function, + Node argument, + arg) { + visits.add(new Visit(VisitKind.VISIT_SUPER_EQUALS, + element: function, right: argument)); + apply(argument, arg); + } + + @override + visitIndexSet( + Send node, + Node receiver, + Node index, + Node rhs, + arg) { + visits.add(new Visit(VisitKind.VISIT_INDEX_SET, + receiver: receiver, index: index, rhs: rhs)); + apply(receiver, arg); + apply(index, arg); + apply(rhs, arg); + } + + @override + visitSuperIndexSet( + Send node, + FunctionElement function, + Node index, + Node rhs, + arg) { + visits.add(new Visit(VisitKind.VISIT_SUPER_INDEX_SET, + element: function, index: index, rhs: rhs)); + apply(index, arg); + apply(rhs, arg); + } + + @override + visitDynamicPropertyCompound( + Send node, + Node receiver, + AssignmentOperator operator, + Node rhs, + Selector getterSelector, + Selector setterSelector, + arg) { + visits.add(new Visit(VisitKind.VISIT_DYNAMIC_PROPERTY_COMPOUND, + receiver: receiver, operator: operator, rhs: rhs, + getter: getterSelector, setter: setterSelector)); + apply(receiver, arg); + apply(rhs, arg); + } + + @override + visitFinalLocalVariableCompound( + Send node, + LocalVariableElement variable, + AssignmentOperator operator, + Node rhs, + arg) { + visits.add(new Visit(VisitKind.VISIT_FINAL_LOCAL_VARIABLE_COMPOUND, + element: variable, operator: operator, rhs: rhs)); + apply(rhs, arg); + } + + @override + visitFinalLocalVariablePrefix( + Send node, + LocalVariableElement variable, + IncDecOperator operator, + arg) { + visits.add(new Visit(VisitKind.VISIT_FINAL_LOCAL_VARIABLE_PREFIX, + element: variable, operator: operator)); + } + + @override + visitFinalLocalVariablePostfix( + Send node, + LocalVariableElement variable, + IncDecOperator operator, + arg) { + visits.add(new Visit(VisitKind.VISIT_FINAL_LOCAL_VARIABLE_POSTFIX, + element: variable, operator: operator)); + } + + @override + visitFinalParameterCompound( + Send node, + ParameterElement parameter, + AssignmentOperator operator, + Node rhs, + arg) { + visits.add(new Visit(VisitKind.VISIT_FINAL_PARAMETER_COMPOUND, + element: parameter, operator: operator, rhs: rhs)); + apply(rhs, arg); + } + + @override + visitFinalParameterPrefix( + Send node, + ParameterElement parameter, + IncDecOperator operator, + arg) { + visits.add(new Visit(VisitKind.VISIT_FINAL_PARAMETER_PREFIX, + element: parameter, operator: operator)); + } + + @override + visitFinalParameterPostfix( + Send node, + ParameterElement parameter, + IncDecOperator operator, + arg) { + visits.add(new Visit(VisitKind.VISIT_FINAL_PARAMETER_POSTFIX, + element: parameter, operator: operator)); + } + + @override + visitFinalStaticFieldCompound( + Send node, + FieldElement field, + AssignmentOperator operator, + Node rhs, + arg) { + visits.add(new Visit(VisitKind.VISIT_STATIC_FINAL_FIELD_COMPOUND, + element: field, operator: operator, rhs: rhs)); + apply(rhs, arg); + } + + @override + visitFinalStaticFieldPostfix( + Send node, + FieldElement field, + IncDecOperator operator, + arg) { + visits.add(new Visit(VisitKind.VISIT_STATIC_FINAL_FIELD_POSTFIX, + element: field, operator: operator)); + } + + @override + visitFinalStaticFieldPrefix( + Send node, + FieldElement field, + IncDecOperator operator, + arg) { + visits.add(new Visit(VisitKind.VISIT_STATIC_FINAL_FIELD_PREFIX, + element: field, operator: operator)); + } + + @override + visitFinalSuperFieldCompound( + Send node, + FieldElement field, + AssignmentOperator operator, + Node rhs, + arg) { + visits.add(new Visit(VisitKind.VISIT_SUPER_FINAL_FIELD_COMPOUND, + element: field, operator: operator, rhs: rhs)); + apply(rhs, arg); + } + + @override + visitFinalTopLevelFieldCompound( + Send node, + FieldElement field, + AssignmentOperator operator, + Node rhs, + arg) { + visits.add(new Visit(VisitKind.VISIT_TOP_LEVEL_FINAL_FIELD_COMPOUND, + element: field, operator: operator, rhs: rhs)); + apply(rhs, arg); + } + + @override + visitFinalTopLevelFieldPostfix( + Send node, + FieldElement field, + IncDecOperator operator, + arg) { + visits.add(new Visit(VisitKind.VISIT_TOP_LEVEL_FINAL_FIELD_POSTFIX, + element: field, operator: operator)); + } + + @override + visitFinalTopLevelFieldPrefix( + Send node, + FieldElement field, + IncDecOperator operator, + arg) { + visits.add(new Visit(VisitKind.VISIT_TOP_LEVEL_FINAL_FIELD_PREFIX, + element: field, operator: operator)); + } + + @override + visitLocalFunctionCompound( + Send node, + LocalFunctionElement function, + AssignmentOperator operator, + Node rhs, + arg) { + visits.add(new Visit(VisitKind.VISIT_LOCAL_FUNCTION_COMPOUND, + element: function, operator: operator, rhs: rhs)); + apply(rhs, arg); + } + + @override + visitLocalVariableCompound( + Send node, + LocalVariableElement variable, + AssignmentOperator operator, + Node rhs, + arg) { + visits.add(new Visit(VisitKind.VISIT_LOCAL_VARIABLE_COMPOUND, + element: variable, operator: operator, rhs: rhs)); + apply(rhs, arg); + } + + @override + visitParameterCompound( + Send node, + ParameterElement parameter, + AssignmentOperator operator, + Node rhs, + arg) { + visits.add(new Visit(VisitKind.VISIT_PARAMETER_COMPOUND, + element: parameter, operator: operator, rhs: rhs)); + apply(rhs, arg); + } + + @override + visitStaticFieldCompound( + Send node, + FieldElement field, + AssignmentOperator operator, + Node rhs, + arg) { + visits.add(new Visit(VisitKind.VISIT_STATIC_FIELD_COMPOUND, + element: field, operator: operator, rhs: rhs)); + apply(rhs, arg); + } + + @override + visitStaticGetterSetterCompound( + Send node, + FunctionElement getter, + FunctionElement setter, + AssignmentOperator operator, + Node rhs, + arg) { + visits.add(new Visit(VisitKind.VISIT_STATIC_GETTER_SETTER_COMPOUND, + operator: operator, rhs: rhs, + getter: getter, setter: setter)); + apply(rhs, arg); + } + + @override + visitSuperFieldCompound( + Send node, + FieldElement field, + AssignmentOperator operator, + Node rhs, + arg) { + visits.add(new Visit(VisitKind.VISIT_SUPER_FIELD_COMPOUND, + element: field, operator: operator, rhs: rhs)); + apply(rhs, arg); + } + + @override + visitSuperGetterSetterCompound( + Send node, + FunctionElement getter, + FunctionElement setter, + AssignmentOperator operator, + Node rhs, + arg) { + visits.add(new Visit(VisitKind.VISIT_SUPER_GETTER_SETTER_COMPOUND, + operator: operator, rhs: rhs, + getter: getter, setter: setter)); + apply(rhs, arg); + } + + @override + visitThisPropertyCompound( + Send node, + AssignmentOperator operator, + Node rhs, + Selector getterSelector, + Selector setterSelector, + arg) { + visits.add(new Visit(VisitKind.VISIT_THIS_PROPERTY_COMPOUND, + operator: operator, rhs: rhs, + getter: getterSelector, setter: setterSelector)); + apply(rhs, arg); + } + + @override + visitTopLevelFieldCompound( + Send node, + FieldElement field, + AssignmentOperator operator, + Node rhs, + arg) { + visits.add(new Visit(VisitKind.VISIT_TOP_LEVEL_FIELD_COMPOUND, + element: field, operator: operator, rhs: rhs)); + apply(rhs, arg); + } + + @override + visitTopLevelGetterSetterCompound( + Send node, + FunctionElement getter, + FunctionElement setter, + AssignmentOperator operator, + Node rhs, + arg) { + visits.add(new Visit(VisitKind.VISIT_TOP_LEVEL_GETTER_SETTER_COMPOUND, + operator: operator, rhs: rhs, + getter: getter, setter: setter)); + apply(rhs, arg); + } + + @override + visitStaticMethodSetterCompound( + Send node, + FunctionElement method, + FunctionElement setter, + AssignmentOperator operator, + Node rhs, + arg) { + visits.add(new Visit(VisitKind.VISIT_STATIC_METHOD_SETTER_COMPOUND, + operator: operator, rhs: rhs, + getter: method, setter: setter)); + apply(rhs, arg); + } + + @override + visitSuperFieldSetterCompound( + Send node, + FieldElement field, + FunctionElement setter, + AssignmentOperator operator, + Node rhs, + arg) { + visits.add(new Visit(VisitKind.VISIT_SUPER_FIELD_SETTER_COMPOUND, + operator: operator, rhs: rhs, + getter: field, setter: setter)); + apply(rhs, arg); + } + + @override + visitSuperGetterFieldCompound( + Send node, + FunctionElement getter, + FieldElement field, + AssignmentOperator operator, + Node rhs, + arg) { + visits.add(new Visit(VisitKind.VISIT_SUPER_GETTER_FIELD_COMPOUND, + operator: operator, rhs: rhs, + getter: getter, setter: field)); + apply(rhs, arg); + } + + @override + visitSuperMethodSetterCompound( + Send node, + FunctionElement method, + FunctionElement setter, + AssignmentOperator operator, + Node rhs, + arg) { + visits.add(new Visit(VisitKind.VISIT_SUPER_METHOD_SETTER_COMPOUND, + getter: method, setter: setter, operator: operator, rhs: rhs)); + apply(rhs, arg); + } + + @override + visitSuperMethodCompound( + Send node, + FunctionElement method, + AssignmentOperator operator, + Node rhs, + arg) { + visits.add(new Visit(VisitKind.VISIT_SUPER_METHOD_COMPOUND, + element: method, operator: operator, rhs: rhs)); + apply(rhs, arg); + } + + @override + visitSuperMethodPrefix( + Send node, + FunctionElement method, + IncDecOperator operator, + arg) { + visits.add(new Visit(VisitKind.VISIT_SUPER_METHOD_PREFIX, + element: method, operator: operator)); + } + + @override + visitSuperMethodPostfix( + Send node, + FunctionElement method, + IncDecOperator operator, + arg) { + visits.add(new Visit(VisitKind.VISIT_SUPER_METHOD_POSTFIX, + element: method, operator: operator)); + } + + @override + visitUnresolvedSuperCompound( + Send node, + Element element, + AssignmentOperator operator, + Node rhs, + arg) { + visits.add(new Visit(VisitKind.VISIT_UNRESOLVED_SUPER_COMPOUND, + operator: operator, rhs: rhs)); + apply(rhs, arg); + } + + @override + visitUnresolvedSuperPrefix( + Send node, + Element element, + IncDecOperator operator, + arg) { + visits.add(new Visit(VisitKind.VISIT_UNRESOLVED_SUPER_PREFIX, + operator: operator)); + } + + @override + visitUnresolvedSuperPostfix( + Send node, + Element element, + IncDecOperator operator, + arg) { + visits.add(new Visit(VisitKind.VISIT_UNRESOLVED_SUPER_POSTFIX, + operator: operator)); + } + + @override + visitTopLevelMethodSetterCompound( + Send node, + FunctionElement method, + FunctionElement setter, + AssignmentOperator operator, + Node rhs, + arg) { + visits.add(new Visit(VisitKind.VISIT_TOP_LEVEL_METHOD_SETTER_COMPOUND, + getter: method, setter: setter, operator: operator, rhs: rhs)); + apply(rhs, arg); + } + + @override + visitCompoundIndexSet( + Send node, + Node receiver, + Node index, + AssignmentOperator operator, + Node rhs, + arg) { + visits.add(new Visit(VisitKind.VISIT_COMPOUND_INDEX_SET, + receiver: receiver, index: index, rhs: rhs, operator: operator)); + apply(receiver, arg); + apply(index, arg); + apply(rhs, arg); + } + + @override + visitSuperCompoundIndexSet( + Send node, + FunctionElement getter, + FunctionElement setter, + Node index, + AssignmentOperator operator, + Node rhs, + arg) { + visits.add(new Visit(VisitKind.VISIT_SUPER_COMPOUND_INDEX_SET, + getter: getter, setter: setter, + index: index, rhs: rhs, operator: operator)); + apply(index, arg); + apply(rhs, arg); + } + + @override + visitClassTypeLiteralCompound( + Send node, + ConstantExpression constant, + AssignmentOperator operator, + Node rhs, + arg) { + visits.add(new Visit(VisitKind.VISIT_CLASS_TYPE_LITERAL_COMPOUND, + constant: constant.getText(), operator: operator, rhs: rhs)); + apply(rhs, arg); + } + + @override + visitDynamicTypeLiteralCompound( + Send node, + ConstantExpression constant, + AssignmentOperator operator, + Node rhs, + arg) { + visits.add(new Visit(VisitKind.VISIT_DYNAMIC_TYPE_LITERAL_COMPOUND, + constant: constant.getText(), operator: operator, rhs: rhs)); + apply(rhs, arg); + } + + @override + visitTypeVariableTypeLiteralCompound( + Send node, + TypeVariableElement element, + AssignmentOperator operator, + Node rhs, + arg) { + visits.add(new Visit(VisitKind.VISIT_TYPE_VARIABLE_TYPE_LITERAL_COMPOUND, + element: element, operator: operator, rhs: rhs)); + apply(rhs, arg); + } + + @override + visitTypedefTypeLiteralCompound( + Send node, + ConstantExpression constant, + AssignmentOperator operator, + Node rhs, + arg) { + visits.add(new Visit(VisitKind.VISIT_TYPEDEF_TYPE_LITERAL_COMPOUND, + constant: constant.getText(), operator: operator, rhs: rhs)); + apply(rhs, arg); + } + + @override + visitLocalFunctionPrefix( + Send node, + LocalFunctionElement function, + IncDecOperator operator, + arg) { + visits.add(new Visit(VisitKind.VISIT_LOCAL_FUNCTION_PREFIX, + element: function, operator: operator)); + } + + @override + visitClassTypeLiteralPrefix( + Send node, + ConstantExpression constant, + IncDecOperator operator, + arg) { + visits.add(new Visit(VisitKind.VISIT_CLASS_TYPE_LITERAL_PREFIX, + constant: constant.getText(), operator: operator)); + } + + @override + visitDynamicTypeLiteralPrefix( + Send node, + ConstantExpression constant, + IncDecOperator operator, + arg) { + visits.add(new Visit(VisitKind.VISIT_DYNAMIC_TYPE_LITERAL_PREFIX, + constant: constant.getText(), operator: operator)); + } + + @override + visitLocalVariablePrefix( + Send node, + LocalVariableElement variable, + IncDecOperator operator, + arg) { + visits.add(new Visit(VisitKind.VISIT_LOCAL_VARIABLE_PREFIX, + element: variable, operator: operator)); + } + + @override + visitParameterPrefix( + Send node, + ParameterElement parameter, + IncDecOperator operator, + arg) { + visits.add(new Visit(VisitKind.VISIT_PARAMETER_PREFIX, + element: parameter, operator: operator)); + } + + @override + visitStaticFieldPrefix( + Send node, + FieldElement field, + IncDecOperator operator, + arg) { + visits.add(new Visit(VisitKind.VISIT_STATIC_FIELD_PREFIX, + element: field, operator: operator)); + } + + @override + visitStaticGetterSetterPrefix( + Send node, + FunctionElement getter, + FunctionElement setter, + IncDecOperator operator, + arg) { + visits.add(new Visit(VisitKind.VISIT_STATIC_GETTER_SETTER_PREFIX, + getter: getter, setter: setter, operator: operator)); + } + + @override + visitStaticMethodSetterPrefix( + Send node, + FunctionElement getter, + FunctionElement setter, + IncDecOperator operator, + arg) { + visits.add(new Visit(VisitKind.VISIT_STATIC_METHOD_SETTER_PREFIX, + getter: getter, setter: setter, operator: operator)); + } + + @override + visitSuperFieldFieldCompound( + Send node, + FieldElement readField, + FieldElement writtenField, + AssignmentOperator operator, + Node rhs, + arg) { + visits.add(new Visit(VisitKind.VISIT_SUPER_FIELD_FIELD_COMPOUND, + getter: readField, setter: writtenField, operator: operator, rhs: rhs)); + apply(rhs, arg); + } + + @override + visitSuperFieldFieldPrefix( + Send node, + FieldElement readField, + FieldElement writtenField, + IncDecOperator operator, + arg) { + visits.add(new Visit(VisitKind.VISIT_SUPER_FIELD_FIELD_PREFIX, + getter: readField, setter: writtenField, operator: operator)); + } + + @override + visitSuperFieldPrefix( + Send node, + FieldElement field, + IncDecOperator operator, + arg) { + visits.add(new Visit(VisitKind.VISIT_SUPER_FIELD_PREFIX, + element: field, operator: operator)); + } + + @override + visitFinalSuperFieldPrefix( + Send node, + FieldElement field, + IncDecOperator operator, + arg) { + visits.add(new Visit(VisitKind.VISIT_SUPER_FINAL_FIELD_PREFIX, + element: field, operator: operator)); + } + + @override + visitSuperFieldSetterPrefix( + Send node, + FieldElement field, + FunctionElement setter, + IncDecOperator operator, + arg) { + visits.add(new Visit(VisitKind.VISIT_SUPER_FIELD_SETTER_PREFIX, + getter: field, setter: setter, operator: operator)); + } + + @override + visitSuperGetterFieldPrefix( + Send node, + FunctionElement getter, + FieldElement field, + IncDecOperator operator, + arg) { + visits.add(new Visit(VisitKind.VISIT_SUPER_GETTER_FIELD_PREFIX, + getter: getter, setter: field, operator: operator)); + } + + @override + visitSuperGetterSetterPrefix( + Send node, + FunctionElement getter, + FunctionElement setter, + IncDecOperator operator, + arg) { + visits.add(new Visit(VisitKind.VISIT_SUPER_GETTER_SETTER_PREFIX, + getter: getter, setter: setter, operator: operator)); + } + + @override + visitSuperMethodSetterPrefix( + Send node, + FunctionElement method, + FunctionElement setter, + IncDecOperator operator, + arg) { + visits.add(new Visit(VisitKind.VISIT_SUPER_METHOD_SETTER_PREFIX, + getter: method, setter: setter, operator: operator)); + } + + @override + visitThisPropertyPrefix( + Send node, + IncDecOperator operator, + Selector getterSelector, + Selector setterSelector, + arg) { + visits.add(new Visit(VisitKind.VISIT_THIS_PROPERTY_PREFIX, + operator: operator, + getter: getterSelector, setter: setterSelector)); + } + + @override + visitTopLevelFieldPrefix( + Send node, + FieldElement field, + IncDecOperator operator, + arg) { + visits.add(new Visit(VisitKind.VISIT_TOP_LEVEL_FIELD_PREFIX, + element: field, operator: operator)); + } + + @override + visitTopLevelGetterSetterPrefix( + Send node, + FunctionElement getter, + FunctionElement setter, + IncDecOperator operator, + arg) { + visits.add(new Visit(VisitKind.VISIT_TOP_LEVEL_GETTER_SETTER_PREFIX, + getter: getter, setter: setter, operator: operator)); + } + + @override + visitTopLevelMethodSetterPrefix( + Send node, + FunctionElement method, + FunctionElement setter, + IncDecOperator operator, + arg) { + visits.add(new Visit(VisitKind.VISIT_TOP_LEVEL_METHOD_SETTER_PREFIX, + getter: method, setter: setter, operator: operator)); + } + + @override + visitTypeVariableTypeLiteralPrefix( + Send node, + TypeVariableElement element, + IncDecOperator operator, + arg) { + visits.add(new Visit(VisitKind.VISIT_TYPE_VARIABLE_TYPE_LITERAL_PREFIX, + element: element, operator: operator)); + } + + @override + visitTypedefTypeLiteralPrefix( + Send node, + ConstantExpression constant, + IncDecOperator operator, + arg) { + visits.add(new Visit(VisitKind.VISIT_TYPEDEF_TYPE_LITERAL_PREFIX, + constant: constant.getText(), operator: operator)); + } + + @override + visitLocalFunctionPostfix( + Send node, + LocalFunctionElement function, + IncDecOperator operator, + arg) { + visits.add(new Visit(VisitKind.VISIT_LOCAL_FUNCTION_POSTFIX, + element: function, operator: operator)); + } + + @override + visitClassTypeLiteralPostfix( + Send node, + ConstantExpression constant, + IncDecOperator operator, + arg) { + visits.add(new Visit(VisitKind.VISIT_CLASS_TYPE_LITERAL_POSTFIX, + constant: constant.getText(), operator: operator)); + } + + @override + visitDynamicTypeLiteralPostfix( + Send node, + ConstantExpression constant, + IncDecOperator operator, + arg) { + visits.add(new Visit(VisitKind.VISIT_DYNAMIC_TYPE_LITERAL_POSTFIX, + constant: constant.getText(), operator: operator)); + } + + @override + visitLocalVariablePostfix( + Send node, + LocalVariableElement variable, + IncDecOperator operator, + arg) { + visits.add(new Visit(VisitKind.VISIT_LOCAL_VARIABLE_POSTFIX, + element: variable, operator: operator)); + } + + @override + visitParameterPostfix( + Send node, + ParameterElement parameter, + IncDecOperator operator, + arg) { + visits.add(new Visit(VisitKind.VISIT_PARAMETER_POSTFIX, + element: parameter, operator: operator)); + } + + @override + visitStaticFieldPostfix( + Send node, + FieldElement field, + IncDecOperator operator, + arg) { + visits.add(new Visit(VisitKind.VISIT_STATIC_FIELD_POSTFIX, + element: field, operator: operator)); + } + + @override + visitStaticGetterSetterPostfix( + Send node, + FunctionElement getter, + FunctionElement setter, + IncDecOperator operator, + arg) { + visits.add(new Visit(VisitKind.VISIT_STATIC_GETTER_SETTER_POSTFIX, + getter: getter, setter: setter, operator: operator)); + } + + @override + visitStaticMethodSetterPostfix( + Send node, + FunctionElement getter, + FunctionElement setter, + IncDecOperator operator, + arg) { + visits.add(new Visit(VisitKind.VISIT_STATIC_METHOD_SETTER_POSTFIX, + getter: getter, setter: setter, operator: operator)); + } + + @override + visitSuperFieldFieldPostfix( + Send node, + FieldElement readField, + FieldElement writtenField, + IncDecOperator operator, + arg) { + visits.add(new Visit(VisitKind.VISIT_SUPER_FIELD_FIELD_POSTFIX, + getter: readField, setter: writtenField, operator: operator)); + } + + @override + visitSuperFieldPostfix( + Send node, + FieldElement field, + IncDecOperator operator, + arg) { + visits.add(new Visit(VisitKind.VISIT_SUPER_FIELD_POSTFIX, + element: field, operator: operator)); + } + + @override + visitFinalSuperFieldPostfix( + Send node, + FieldElement field, + IncDecOperator operator, + arg) { + visits.add(new Visit(VisitKind.VISIT_SUPER_FINAL_FIELD_POSTFIX, + element: field, operator: operator)); + } + + @override + visitSuperFieldSetterPostfix( + Send node, + FieldElement field, + FunctionElement setter, + IncDecOperator operator, + arg) { + visits.add(new Visit(VisitKind.VISIT_SUPER_FIELD_SETTER_POSTFIX, + getter: field, setter: setter, operator: operator)); + } + + @override + visitSuperGetterFieldPostfix( + Send node, + FunctionElement getter, + FieldElement field, + IncDecOperator operator, + arg) { + visits.add(new Visit(VisitKind.VISIT_SUPER_GETTER_FIELD_POSTFIX, + getter: getter, setter: field, operator: operator)); + } + + @override + visitSuperGetterSetterPostfix( + Send node, + FunctionElement getter, + FunctionElement setter, + IncDecOperator operator, + arg) { + visits.add(new Visit(VisitKind.VISIT_SUPER_GETTER_SETTER_POSTFIX, + getter: getter, setter: setter, operator: operator)); + } + + @override + visitSuperMethodSetterPostfix( + Send node, + FunctionElement method, + FunctionElement setter, + IncDecOperator operator, + arg) { + visits.add(new Visit(VisitKind.VISIT_SUPER_METHOD_SETTER_POSTFIX, + getter: method, setter: setter, operator: operator)); + } + + @override + visitThisPropertyPostfix( + Send node, + IncDecOperator operator, + Selector getterSelector, + Selector setterSelector, + arg) { + visits.add(new Visit(VisitKind.VISIT_THIS_PROPERTY_POSTFIX, + operator: operator, + getter: getterSelector, setter: setterSelector)); + } + + @override + visitTopLevelFieldPostfix( + Send node, + FieldElement field, + IncDecOperator operator, + arg) { + visits.add(new Visit(VisitKind.VISIT_TOP_LEVEL_FIELD_POSTFIX, + element: field, operator: operator)); + } + + @override + visitTopLevelGetterSetterPostfix( + Send node, + FunctionElement getter, + FunctionElement setter, + IncDecOperator operator, + arg) { + visits.add(new Visit(VisitKind.VISIT_TOP_LEVEL_GETTER_SETTER_POSTFIX, + getter: getter, setter: setter, operator: operator)); + } + + @override + visitTopLevelMethodSetterPostfix( + Send node, + FunctionElement method, + FunctionElement setter, + IncDecOperator operator, + arg) { + visits.add(new Visit(VisitKind.VISIT_TOP_LEVEL_METHOD_SETTER_POSTFIX, + getter: method, setter: setter, operator: operator)); + } + + @override + visitTypeVariableTypeLiteralPostfix( + Send node, + TypeVariableElement element, + IncDecOperator operator, + arg) { + visits.add(new Visit(VisitKind.VISIT_TYPE_VARIABLE_TYPE_LITERAL_POSTFIX, + element: element, operator: operator)); + } + + @override + visitTypedefTypeLiteralPostfix( + Send node, + ConstantExpression constant, + IncDecOperator operator, + arg) { + visits.add(new Visit(VisitKind.VISIT_TYPEDEF_TYPE_LITERAL_POSTFIX, + constant: constant.getText(), operator: operator)); + } + + @override + visitUnresolvedCompound( + Send node, + ErroneousElement element, + AssignmentOperator operator, + Node rhs, + arg) { + visits.add(new Visit(VisitKind.VISIT_UNRESOLVED_COMPOUND, + operator: operator, rhs: rhs)); + apply(rhs, arg); + } + + @override + visitUnresolvedGet( + Send node, + Element element, + arg) { + visits.add(new Visit(VisitKind.VISIT_UNRESOLVED_GET, name: element.name)); + } + + @override + visitUnresolvedSet( + Send node, + Element element, + Node rhs, + arg) { + visits.add(new Visit(VisitKind.VISIT_UNRESOLVED_SET, + name: element.name, rhs: rhs)); + super.visitUnresolvedSet(node, element, rhs, arg); + } + + @override + visitUnresolvedInvoke( + Send node, + Element element, + NodeList arguments, + Selector selector, + arg) { + visits.add(new Visit(VisitKind.VISIT_UNRESOLVED_INVOKE, + name: element.name, arguments: arguments)); + super.visitUnresolvedInvoke(node, element, arguments, selector, arg); + } + + @override + visitUnresolvedPostfix( + Send node, + ErroneousElement element, + IncDecOperator operator, + arg) { + visits.add(new Visit( + VisitKind.VISIT_UNRESOLVED_POSTFIX, operator: operator)); + } + + @override + visitUnresolvedPrefix( + Send node, + ErroneousElement element, + IncDecOperator operator, + arg) { + visits.add(new Visit( + VisitKind.VISIT_UNRESOLVED_PREFIX, operator: operator)); + } + + @override + visitUnresolvedSuperCompoundIndexSet( + Send node, + Element element, + Node index, + AssignmentOperator operator, + Node rhs, + arg) { + visits.add(new Visit( + VisitKind.VISIT_UNRESOLVED_SUPER_COMPOUND_INDEX_SET, + index: index, operator: operator, rhs: rhs)); + apply(index, arg); + apply(rhs, arg); + } + + @override + visitUnresolvedSuperGetterCompoundIndexSet( + Send node, + Element element, + MethodElement setter, + Node index, + AssignmentOperator operator, + Node rhs, + arg) { + visits.add(new Visit( + VisitKind.VISIT_UNRESOLVED_SUPER_GETTER_COMPOUND_INDEX_SET, + setter: setter, index: index, operator: operator, rhs: rhs)); + apply(index, arg); + apply(rhs, arg); + } + + @override + visitUnresolvedSuperSetterCompoundIndexSet( + Send node, + MethodElement getter, + Element element, + Node index, + AssignmentOperator operator, + Node rhs, + arg) { + visits.add(new Visit( + VisitKind.VISIT_UNRESOLVED_SUPER_SETTER_COMPOUND_INDEX_SET, + getter: getter, index: index, operator: operator, rhs: rhs)); + apply(index, arg); + apply(rhs, arg); + } + + @override + visitUnresolvedSuperIndexSet( + Send node, + ErroneousElement element, + Node index, + Node rhs, + arg) { + visits.add(new Visit(VisitKind.VISIT_UNRESOLVED_SUPER_INDEX_SET, + index: index, rhs: rhs)); + apply(index, arg); + apply(rhs, arg); + } + + @override + visitUnresolvedSuperIndexPostfix( + Send node, + Element element, + Node index, + IncDecOperator operator, + arg) { + visits.add(new Visit(VisitKind.VISIT_UNRESOLVED_SUPER_INDEX_POSTFIX, + index: index, operator: operator)); + apply(index, arg); + } + + @override + visitUnresolvedSuperGetterIndexPostfix( + Send node, + Element element, + MethodElement setter, + Node index, + IncDecOperator operator, + arg) { + visits.add(new Visit(VisitKind.VISIT_UNRESOLVED_SUPER_GETTER_INDEX_POSTFIX, + setter: setter, index: index, operator: operator)); + apply(index, arg); + } + + @override + visitUnresolvedSuperSetterIndexPostfix( + Send node, + MethodElement getter, + Element element, + Node index, + IncDecOperator operator, + arg) { + visits.add(new Visit(VisitKind.VISIT_UNRESOLVED_SUPER_SETTER_INDEX_POSTFIX, + getter: getter, index: index, operator: operator)); + apply(index, arg); + } + + @override + visitUnresolvedSuperIndexPrefix( + Send node, + Element element, + Node index, + IncDecOperator operator, + arg) { + visits.add(new Visit(VisitKind.VISIT_UNRESOLVED_SUPER_INDEX_PREFIX, + index: index, operator: operator)); + apply(index, arg); + } + + @override + visitUnresolvedSuperGetterIndexPrefix( + Send node, + Element element, + MethodElement setter, + Node index, + IncDecOperator operator, + arg) { + visits.add(new Visit(VisitKind.VISIT_UNRESOLVED_SUPER_GETTER_INDEX_PREFIX, + setter: setter, index: index, operator: operator)); + apply(index, arg); + } + + @override + visitUnresolvedSuperSetterIndexPrefix( + Send node, + MethodElement getter, + Element element, + Node index, + IncDecOperator operator, + arg) { + visits.add(new Visit(VisitKind.VISIT_UNRESOLVED_SUPER_SETTER_INDEX_PREFIX, + getter: getter, index: index, operator: operator)); + apply(index, arg); + } + + @override + visitIndexPostfix( + Send node, + Node receiver, + Node index, + IncDecOperator operator, + arg) { + visits.add(new Visit(VisitKind.VISIT_INDEX_POSTFIX, + receiver: receiver, index: index, operator: operator)); + apply(receiver, arg); + apply(index, arg); + } + + @override + visitIndexPrefix( + Send node, + Node receiver, + Node index, + IncDecOperator operator, + arg) { + visits.add(new Visit(VisitKind.VISIT_INDEX_PREFIX, + receiver: receiver, index: index, operator: operator)); + apply(receiver, arg); + apply(index, arg); + } + + @override + visitSuperIndexPostfix( + Send node, + FunctionElement indexFunction, + FunctionElement indexSetFunction, + Node index, + IncDecOperator operator, + arg) { + visits.add(new Visit(VisitKind.VISIT_SUPER_INDEX_POSTFIX, + getter: indexFunction, setter: indexSetFunction, + index: index, operator: operator)); + apply(index, arg); + } + + @override + visitSuperIndexPrefix( + Send node, + FunctionElement indexFunction, + FunctionElement indexSetFunction, + Node index, + IncDecOperator operator, + arg) { + visits.add(new Visit(VisitKind.VISIT_SUPER_INDEX_PREFIX, + getter: indexFunction, setter: indexSetFunction, + index: index, operator: operator)); + apply(index, arg); + } + + @override + visitUnresolvedClassConstructorInvoke( + NewExpression node, + Element constructor, + DartType type, + NodeList arguments, + Selector selector, + arg) { + // TODO(johnniwinther): Test [type] when it is not `dynamic`. + visits.add(new Visit( + VisitKind.VISIT_UNRESOLVED_CLASS_CONSTRUCTOR_INVOKE, + arguments: arguments)); + apply(arguments, arg); + } + + @override + visitUnresolvedConstructorInvoke( + NewExpression node, + Element constructor, + DartType type, + NodeList arguments, + Selector selector, + arg) { + // TODO(johnniwinther): Test [type] when it is not `dynamic`. + visits.add(new Visit( + VisitKind.VISIT_UNRESOLVED_CONSTRUCTOR_INVOKE, + arguments: arguments)); + apply(arguments, arg); + } + + @override + visitConstConstructorInvoke( + NewExpression node, + ConstructedConstantExpression constant, + arg) { + visits.add(new Visit(VisitKind.VISIT_CONST_CONSTRUCTOR_INVOKE, + constant: constant.getText())); + super.visitConstConstructorInvoke(node, constant, arg); + } + + @override + visitBoolFromEnvironmentConstructorInvoke( + NewExpression node, + BoolFromEnvironmentConstantExpression constant, + arg) { + visits.add(new Visit( + VisitKind.VISIT_BOOL_FROM_ENVIRONMENT_CONSTRUCTOR_INVOKE, + constant: constant.getText())); + super.visitBoolFromEnvironmentConstructorInvoke(node, constant, arg); + } + + @override + visitIntFromEnvironmentConstructorInvoke( + NewExpression node, + IntFromEnvironmentConstantExpression constant, + arg) { + visits.add(new Visit( + VisitKind.VISIT_INT_FROM_ENVIRONMENT_CONSTRUCTOR_INVOKE, + constant: constant.getText())); + super.visitIntFromEnvironmentConstructorInvoke(node, constant, arg); + } + + @override + visitStringFromEnvironmentConstructorInvoke( + NewExpression node, + StringFromEnvironmentConstantExpression constant, + arg) { + visits.add(new Visit( + VisitKind.VISIT_STRING_FROM_ENVIRONMENT_CONSTRUCTOR_INVOKE, + constant: constant.getText())); + super.visitStringFromEnvironmentConstructorInvoke(node, constant, arg); + } + + @override + errorNonConstantConstructorInvoke( + NewExpression node, + Element element, + DartType type, + NodeList arguments, + CallStructure callStructure, + arg) { + visits.add(new Visit(VisitKind.ERROR_NON_CONSTANT_CONSTRUCTOR_INVOKE, + element: element, type: type, + arguments: arguments, selector: callStructure)); + super.errorNonConstantConstructorInvoke( + node, element, type, arguments, callStructure, arg); + } + + @override + visitConstructorIncompatibleInvoke( + NewExpression node, + ConstructorElement constructor, + InterfaceType type, + NodeList arguments, + CallStructure callStructure, + arg) { + visits.add(new Visit(VisitKind.VISIT_CONSTRUCTOR_INCOMPATIBLE_INVOKE, + element: constructor, type: type, + arguments: arguments, selector: callStructure)); + super.visitConstructorIncompatibleInvoke( + node, constructor, type, arguments, callStructure, arg); + } + + @override + visitFactoryConstructorInvoke( + NewExpression node, + ConstructorElement constructor, + InterfaceType type, + NodeList arguments, + CallStructure callStructure, + arg) { + visits.add(new Visit( + VisitKind.VISIT_FACTORY_CONSTRUCTOR_INVOKE, + element: constructor, + type: type, + arguments: arguments, + selector: callStructure)); + apply(arguments, arg); + } + + @override + visitGenerativeConstructorInvoke( + NewExpression node, + ConstructorElement constructor, + InterfaceType type, + NodeList arguments, + CallStructure callStructure, + arg) { + visits.add(new Visit( + VisitKind.VISIT_GENERATIVE_CONSTRUCTOR_INVOKE, + element: constructor, + type: type, + arguments: arguments, + selector: callStructure)); + apply(arguments, arg); + } + + @override + visitRedirectingFactoryConstructorInvoke( + NewExpression node, + ConstructorElement constructor, + InterfaceType type, + ConstructorElement effectiveTarget, + InterfaceType effectiveTargetType, + NodeList arguments, + CallStructure callStructure, + arg) { + visits.add(new Visit( + VisitKind.VISIT_REDIRECTING_FACTORY_CONSTRUCTOR_INVOKE, + element: constructor, + type: type, + target: effectiveTarget, + targetType: effectiveTargetType, + arguments: arguments, + selector: callStructure)); + apply(arguments, arg); + } + + @override + visitRedirectingGenerativeConstructorInvoke( + NewExpression node, + ConstructorElement constructor, + InterfaceType type, + NodeList arguments, + CallStructure callStructure, + arg) { + visits.add(new Visit( + VisitKind.VISIT_REDIRECTING_GENERATIVE_CONSTRUCTOR_INVOKE, + element: constructor, + type: type, + arguments: arguments, + selector: callStructure)); + apply(arguments, arg); + } + + @override + visitAbstractClassConstructorInvoke( + NewExpression node, + ConstructorElement constructor, + InterfaceType type, + NodeList arguments, + CallStructure callStructure, + arg) { + visits.add(new Visit( + VisitKind.VISIT_ABSTRACT_CLASS_CONSTRUCTOR_INVOKE, + element: constructor, + type: type, + arguments: arguments, + selector: callStructure)); + apply(arguments, arg); + } + + @override + visitUnresolvedRedirectingFactoryConstructorInvoke( + NewExpression node, + ConstructorElement constructor, + InterfaceType type, + NodeList arguments, + CallStructure callStructure, + arg) { + visits.add(new Visit( + VisitKind.VISIT_UNRESOLVED_REDIRECTING_FACTORY_CONSTRUCTOR_INVOKE, + element: constructor, + type: type, + arguments: arguments, + selector: callStructure)); + apply(arguments, arg); + } + + @override + visitUnresolvedStaticGetterCompound( + Send node, + Element element, + MethodElement setter, + AssignmentOperator operator, + Node rhs, + arg) { + visits.add(new Visit(VisitKind.VISIT_UNRESOLVED_STATIC_GETTER_COMPOUND, + setter: setter, operator: operator, rhs: rhs)); + apply(rhs, arg); + } + + @override + visitUnresolvedTopLevelGetterCompound( + Send node, + Element element, + MethodElement setter, + AssignmentOperator operator, + Node rhs, + arg) { + visits.add(new Visit(VisitKind.VISIT_UNRESOLVED_TOP_LEVEL_GETTER_COMPOUND, + setter: setter, operator: operator, rhs: rhs)); + apply(rhs, arg); + } + + @override + visitUnresolvedStaticSetterCompound( + Send node, + MethodElement getter, + Element element, + AssignmentOperator operator, + Node rhs, + arg) { + visits.add(new Visit(VisitKind.VISIT_UNRESOLVED_STATIC_SETTER_COMPOUND, + getter: getter, operator: operator, rhs: rhs)); + apply(rhs, arg); + } + + @override + visitUnresolvedTopLevelSetterCompound( + Send node, + MethodElement getter, + Element element, + AssignmentOperator operator, + Node rhs, + arg) { + visits.add(new Visit(VisitKind.VISIT_UNRESOLVED_TOP_LEVEL_SETTER_COMPOUND, + getter: getter, operator: operator, rhs: rhs)); + apply(rhs, arg); + } + + @override + visitStaticMethodCompound( + Send node, + MethodElement method, + AssignmentOperator operator, + Node rhs, + arg) { + visits.add(new Visit(VisitKind.VISIT_STATIC_METHOD_COMPOUND, + element: method, operator: operator, rhs: rhs)); + apply(rhs, arg); + } + + @override + visitTopLevelMethodCompound( + Send node, + MethodElement method, + AssignmentOperator operator, + Node rhs, + arg) { + visits.add(new Visit(VisitKind.VISIT_TOP_LEVEL_METHOD_COMPOUND, + element: method, operator: operator, rhs: rhs)); + apply(rhs, arg); + } + + @override + visitUnresolvedStaticGetterPrefix( + Send node, + Element element, + MethodElement setter, + IncDecOperator operator, + arg) { + visits.add(new Visit(VisitKind.VISIT_UNRESOLVED_STATIC_GETTER_PREFIX, + setter: setter, operator: operator)); + } + + @override + visitUnresolvedTopLevelGetterPrefix( + Send node, + Element element, + MethodElement setter, + IncDecOperator operator, + arg) { + visits.add(new Visit(VisitKind.VISIT_UNRESOLVED_TOP_LEVEL_GETTER_PREFIX, + setter: setter, operator: operator)); + } + + @override + visitUnresolvedStaticSetterPrefix( + Send node, + MethodElement getter, + Element element, + IncDecOperator operator, + arg) { + visits.add(new Visit(VisitKind.VISIT_UNRESOLVED_STATIC_SETTER_PREFIX, + getter: getter, operator: operator)); + } + + @override + visitUnresolvedTopLevelSetterPrefix( + Send node, + MethodElement getter, + Element element, + IncDecOperator operator, + arg) { + visits.add(new Visit(VisitKind.VISIT_UNRESOLVED_TOP_LEVEL_SETTER_PREFIX, + getter: getter, operator: operator)); + } + + @override + visitStaticMethodPrefix( + Send node, + MethodElement method, + IncDecOperator operator, + arg) { + visits.add(new Visit(VisitKind.VISIT_STATIC_METHOD_PREFIX, + element: method, operator: operator)); + } + + @override + visitTopLevelMethodPrefix( + Send node, + MethodElement method, + IncDecOperator operator, + arg) { + visits.add(new Visit(VisitKind.VISIT_TOP_LEVEL_METHOD_PREFIX, + element: method, operator: operator)); + } + + @override + visitUnresolvedStaticGetterPostfix( + Send node, + Element element, + MethodElement setter, + IncDecOperator operator, + arg) { + visits.add(new Visit(VisitKind.VISIT_UNRESOLVED_STATIC_GETTER_POSTFIX, + setter: setter, operator: operator)); + } + + @override + visitUnresolvedTopLevelGetterPostfix( + Send node, + Element element, + MethodElement setter, + IncDecOperator operator, + arg) { + visits.add(new Visit(VisitKind.VISIT_UNRESOLVED_TOP_LEVEL_GETTER_POSTFIX, + setter: setter, operator: operator)); + } + + @override + visitUnresolvedStaticSetterPostfix( + Send node, + MethodElement getter, + Element element, + IncDecOperator operator, + arg) { + visits.add(new Visit(VisitKind.VISIT_UNRESOLVED_STATIC_SETTER_POSTFIX, + getter: getter, operator: operator)); + } + + @override + visitUnresolvedTopLevelSetterPostfix( + Send node, + MethodElement getter, + Element element, + IncDecOperator operator, + arg) { + visits.add(new Visit(VisitKind.VISIT_UNRESOLVED_TOP_LEVEL_SETTER_POSTFIX, + getter: getter, operator: operator)); + } + + @override + visitStaticMethodPostfix( + Send node, + MethodElement method, + IncDecOperator operator, + arg) { + visits.add(new Visit(VisitKind.VISIT_STATIC_METHOD_POSTFIX, + element: method, operator: operator)); + } + + @override + visitTopLevelMethodPostfix( + Send node, + MethodElement method, + IncDecOperator operator, + arg) { + visits.add(new Visit(VisitKind.VISIT_TOP_LEVEL_METHOD_POSTFIX, + element: method, operator: operator)); + } + + @override + visitUnresolvedSuperGetterCompound( + Send node, Element element, + MethodElement setter, + AssignmentOperator operator, + Node rhs, + arg) { + visits.add(new Visit(VisitKind.VISIT_UNRESOLVED_SUPER_GETTER_COMPOUND, + setter: setter, operator: operator, rhs: rhs)); + apply(rhs, arg); + } + + @override + visitUnresolvedSuperGetterPostfix( + Send node, + Element element, + MethodElement setter, + IncDecOperator operator, + arg) { + visits.add(new Visit(VisitKind.VISIT_UNRESOLVED_SUPER_GETTER_POSTFIX, + setter: setter, operator: operator)); + } + + @override + visitUnresolvedSuperGetterPrefix( + Send node, + Element element, + MethodElement setter, + IncDecOperator operator, + arg) { + visits.add(new Visit(VisitKind.VISIT_UNRESOLVED_SUPER_GETTER_PREFIX, + setter: setter, operator: operator)); + } + + @override + visitUnresolvedSuperSetterCompound( + Send node, MethodElement getter, + Element element, + AssignmentOperator operator, + Node rhs, + arg) { + visits.add(new Visit(VisitKind.VISIT_UNRESOLVED_SUPER_SETTER_COMPOUND, + getter: getter, operator: operator, rhs: rhs)); + apply(rhs, arg); + } + + @override + visitUnresolvedSuperSetterPostfix( + Send node, + MethodElement getter, + Element element, + IncDecOperator operator, + arg) { + visits.add(new Visit(VisitKind.VISIT_UNRESOLVED_SUPER_SETTER_POSTFIX, + getter: getter, operator: operator)); + } + + @override + visitUnresolvedSuperSetterPrefix( + Send node, + MethodElement getter, + Element element, + IncDecOperator operator, + arg) { + visits.add(new Visit(VisitKind.VISIT_UNRESOLVED_SUPER_SETTER_PREFIX, + getter: getter, operator: operator)); + } + + @override + visitIfNotNullDynamicPropertyGet( + Send node, + Node receiver, + Selector selector, + arg) { + visits.add(new Visit(VisitKind.VISIT_IF_NOT_NULL_DYNAMIC_PROPERTY_GET, + receiver: receiver, name: selector.name)); + super.visitIfNotNullDynamicPropertyGet(node, receiver, selector, arg); + } + + @override + visitIfNotNullDynamicPropertySet( + Send node, + Node receiver, + Selector selector, + Node rhs, + arg) { + visits.add(new Visit(VisitKind.VISIT_IF_NOT_NULL_DYNAMIC_PROPERTY_SET, + receiver: receiver, name: selector.name, rhs: rhs)); + super.visitIfNotNullDynamicPropertySet(node, receiver, selector, rhs, arg); + } + + @override + visitIfNotNullDynamicPropertyInvoke( + Send node, + Node receiver, + NodeList arguments, + Selector selector, + arg) { + visits.add(new Visit(VisitKind.VISIT_IF_NOT_NULL_DYNAMIC_PROPERTY_INVOKE, + receiver: receiver, selector: selector, arguments: arguments)); + super.visitIfNotNullDynamicPropertyInvoke( + node, receiver, arguments, selector, arg); + } + + @override + visitIfNotNullDynamicPropertyPrefix( + Send node, + Node receiver, + IncDecOperator operator, + Selector getterSelector, + Selector setterSelector, + arg) { + visits.add(new Visit(VisitKind.VISIT_IF_NOT_NULL_DYNAMIC_PROPERTY_PREFIX, + receiver: receiver, operator: operator, + getter: getterSelector, setter: setterSelector)); + super.visitIfNotNullDynamicPropertyPrefix( + node, receiver, operator, getterSelector, setterSelector, arg); + } + + @override + visitIfNotNullDynamicPropertyPostfix( + Send node, + Node receiver, + IncDecOperator operator, + Selector getterSelector, + Selector setterSelector, + arg) { + visits.add(new Visit(VisitKind.VISIT_IF_NOT_NULL_DYNAMIC_PROPERTY_POSTFIX, + receiver: receiver, operator: operator, + getter: getterSelector, setter: setterSelector)); + super.visitIfNotNullDynamicPropertyPostfix( + node, receiver, operator, getterSelector, setterSelector, arg); + } + + @override + visitIfNotNullDynamicPropertyCompound( + Send node, + Node receiver, + AssignmentOperator operator, + Node rhs, + Selector getterSelector, + Selector setterSelector, + arg) { + visits.add(new Visit(VisitKind.VISIT_IF_NOT_NULL_DYNAMIC_PROPERTY_COMPOUND, + receiver: receiver, operator: operator, rhs: rhs, + getter: getterSelector, setter: setterSelector)); + super.visitIfNotNullDynamicPropertyCompound( + node, receiver, operator, rhs, getterSelector, setterSelector, arg); + } + + @override + visitIfNull( + Send node, + Node left, + Node right, + arg) { + visits.add(new Visit(VisitKind.VISIT_IF_NULL, left: left, right: right)); + super.visitIfNull(node, left, right, arg); + } + + @override + visitConstantGet( + Send node, + ConstantExpression constant, + arg) { + visits.add(new Visit(VisitKind.VISIT_CONSTANT_GET, + constant: constant.getText())); + super.visitConstantGet(node, constant, arg); + } + + @override + visitConstantInvoke( + Send node, + ConstantExpression constant, + NodeList arguments, + CallStructure callStructure, + arg) { + visits.add(new Visit(VisitKind.VISIT_CONSTANT_INVOKE, + constant: constant.getText())); + super.visitConstantInvoke(node, constant, arguments, callStructure, arg); + } +} diff --git a/tests/compiler/dart2js/type_order_test.dart b/tests/compiler/dart2js/type_order_test.dart index a3337f333c6..e4faa0113a4 100644 --- a/tests/compiler/dart2js/type_order_test.dart +++ b/tests/compiler/dart2js/type_order_test.dart @@ -1,72 +1,72 @@ -// Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file -// for details. All rights reserved. Use of this source code is governed by a -// BSD-style license that can be found in the LICENSE file. - -library subtype_test; - -import 'package:expect/expect.dart'; -import 'package:async_helper/async_helper.dart'; -import 'type_test_helper.dart'; -import 'package:compiler/src/dart_types.dart'; -import "package:compiler/src/elements/elements.dart" - show Element, ClassElement, TypedefElement; - -void main() { - asyncTest(() => TypeEnvironment.create(r""" - class A {} - typedef BS B(BT t); - class C extends A {} - class X {} - class Y {} - class Z {} - """).then((env) { - - List types = []; - DartType add(DartType type) { - types.add(type); - return type; - } - - DartType dynamic_ = add(env['dynamic']); - DartType void_ = add(env['void']); - - ClassElement A = env.getElement('A'); - TypedefElement B = env.getElement('B'); - ClassElement C = env.getElement('C'); - DartType X = add(env['X']); - DartType Y = add(env['Y']); - DartType Z = add(env['Z']); - - InterfaceType A_this = add(A.thisType); - InterfaceType A_raw = add(A.rawType); - TypeVariableType AT = add(A_this.typeArguments[0]); - TypeVariableType AS = add(A_this.typeArguments[1]); - InterfaceType A_X_Y = add(instantiate(A, [X, Y])); - InterfaceType A_Y_X = add(instantiate(A, [Y, X])); - - TypedefType B_this = add(B.computeType(env.compiler)); - TypedefType B_raw = add(B.rawType); - TypeVariableType BT = add(B_this.typeArguments[0]); - TypeVariableType BS = add(B_this.typeArguments[1]); - FunctionType B_this_alias = add(B.alias); - TypedefType B_X_Y = add(instantiate(B, [X, Y])); - FunctionType B_X_Y_alias = add(B_X_Y.unalias(env.compiler)); - TypedefType B_Y_X = add(instantiate(B, [Y, X])); - FunctionType B_Y_X_alias = add(B_Y_X.unalias(env.compiler)); - - InterfaceType C_this = add(C.thisType); - InterfaceType C_raw = add(C.rawType); - TypeVariableType CT = add(C_this.typeArguments[0]); - TypeVariableType CS = add(C_this.typeArguments[1]); - - Expect.listEquals( - [void_, dynamic_, - A_raw, A_this, A_X_Y, A_Y_X, AT, AS, - B_raw, B_this, B_X_Y, B_Y_X, BT, BS, - C_raw, C_this, CT, CS, - X, Y, Z, - B_this_alias, B_Y_X_alias, B_X_Y_alias, - ], - Types.sorted(types)); - })); +// Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +library subtype_test; + +import 'package:expect/expect.dart'; +import 'package:async_helper/async_helper.dart'; +import 'type_test_helper.dart'; +import 'package:compiler/src/dart_types.dart'; +import "package:compiler/src/elements/elements.dart" + show Element, ClassElement, TypedefElement; + +void main() { + asyncTest(() => TypeEnvironment.create(r""" + class A {} + typedef BS B(BT t); + class C extends A {} + class X {} + class Y {} + class Z {} + """).then((env) { + + List types = []; + DartType add(DartType type) { + types.add(type); + return type; + } + + DartType dynamic_ = add(env['dynamic']); + DartType void_ = add(env['void']); + + ClassElement A = env.getElement('A'); + TypedefElement B = env.getElement('B'); + ClassElement C = env.getElement('C'); + DartType X = add(env['X']); + DartType Y = add(env['Y']); + DartType Z = add(env['Z']); + + InterfaceType A_this = add(A.thisType); + InterfaceType A_raw = add(A.rawType); + TypeVariableType AT = add(A_this.typeArguments[0]); + TypeVariableType AS = add(A_this.typeArguments[1]); + InterfaceType A_X_Y = add(instantiate(A, [X, Y])); + InterfaceType A_Y_X = add(instantiate(A, [Y, X])); + + TypedefType B_this = add(B.computeType(env.compiler)); + TypedefType B_raw = add(B.rawType); + TypeVariableType BT = add(B_this.typeArguments[0]); + TypeVariableType BS = add(B_this.typeArguments[1]); + FunctionType B_this_alias = add(B.alias); + TypedefType B_X_Y = add(instantiate(B, [X, Y])); + FunctionType B_X_Y_alias = add(B_X_Y.unalias(env.compiler)); + TypedefType B_Y_X = add(instantiate(B, [Y, X])); + FunctionType B_Y_X_alias = add(B_Y_X.unalias(env.compiler)); + + InterfaceType C_this = add(C.thisType); + InterfaceType C_raw = add(C.rawType); + TypeVariableType CT = add(C_this.typeArguments[0]); + TypeVariableType CS = add(C_this.typeArguments[1]); + + Expect.listEquals( + [void_, dynamic_, + A_raw, A_this, A_X_Y, A_Y_X, AT, AS, + B_raw, B_this, B_X_Y, B_Y_X, BT, BS, + C_raw, C_this, CT, CS, + X, Y, Z, + B_this_alias, B_Y_X_alias, B_X_Y_alias, + ], + Types.sorted(types)); + })); } \ No newline at end of file diff --git a/tests/compiler/dart2js/type_promotion_test.dart b/tests/compiler/dart2js/type_promotion_test.dart index 8739394ef6a..b391cf92996 100644 --- a/tests/compiler/dart2js/type_promotion_test.dart +++ b/tests/compiler/dart2js/type_promotion_test.dart @@ -1,29 +1,29 @@ -// Copyright (c) 2013, 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. - -// Test that dart2js produces the expected static type warnings for type -// promotion language tests. This ensures that the analyzer and dart2js agrees -// on these tests. - -import 'warnings_checker.dart'; - -/// Map from test files to a map of their expected status. If the status map is -/// `null` no warnings must be missing or unexpected, otherwise the status map -/// can contain a list of line numbers for keys 'missing' and 'unexpected' for -/// the warnings of each category. -const Map TESTS = const { - 'language/type_promotion_assign_test.dart': null, - 'language/type_promotion_closure_test.dart': null, - 'language/type_promotion_functions_test.dart': - const {'missing': const [62, 63, 64]}, // Issue 14933. - 'language/type_promotion_local_test.dart': null, - 'language/type_promotion_logical_and_test.dart': null, - 'language/type_promotion_more_specific_test.dart': null, - 'language/type_promotion_multiple_test.dart': null, - 'language/type_promotion_parameter_test.dart': null, -}; - -void main() { - checkWarnings(TESTS); -} +// Copyright (c) 2013, 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. + +// Test that dart2js produces the expected static type warnings for type +// promotion language tests. This ensures that the analyzer and dart2js agrees +// on these tests. + +import 'warnings_checker.dart'; + +/// Map from test files to a map of their expected status. If the status map is +/// `null` no warnings must be missing or unexpected, otherwise the status map +/// can contain a list of line numbers for keys 'missing' and 'unexpected' for +/// the warnings of each category. +const Map TESTS = const { + 'language/type_promotion_assign_test.dart': null, + 'language/type_promotion_closure_test.dart': null, + 'language/type_promotion_functions_test.dart': + const {'missing': const [62, 63, 64]}, // Issue 14933. + 'language/type_promotion_local_test.dart': null, + 'language/type_promotion_logical_and_test.dart': null, + 'language/type_promotion_more_specific_test.dart': null, + 'language/type_promotion_multiple_test.dart': null, + 'language/type_promotion_parameter_test.dart': null, +}; + +void main() { + checkWarnings(TESTS); +} diff --git a/tests/compiler/dart2js/warnings_checker.dart b/tests/compiler/dart2js/warnings_checker.dart index e1dba07546f..daaa32d8ed0 100644 --- a/tests/compiler/dart2js/warnings_checker.dart +++ b/tests/compiler/dart2js/warnings_checker.dart @@ -1,83 +1,83 @@ -// Copyright (c) 2013, 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. - -// Test that dart2js produces the expected static type warnings to ensures that -// the analyzer and dart2js agrees on the tests. - -import 'dart:async'; -import 'dart:io'; -import 'package:expect/expect.dart'; -import 'package:async_helper/async_helper.dart'; -import 'memory_compiler.dart'; -import 'package:compiler/src/filenames.dart'; -import 'package:compiler/src/io/source_file.dart'; -import 'package:compiler/src/source_file_provider.dart'; -import 'package:compiler/src/util/uri_extras.dart'; -import 'dart:convert'; - -void checkWarnings(Map tests, [List arguments]) { - bool isWindows = Platform.isWindows; - Uri script = currentDirectory.resolveUri(Platform.script); - bool warningsMismatch = false; - bool verbose = arguments != null && arguments.contains('-v'); - asyncTest(() => Future.forEach(tests.keys, (String test) { - Uri uri = script.resolve('../../$test'); - String source = UTF8.decode(readAll(uriPathToNative(uri.path))); - SourceFile file = new StringSourceFile( - uri, relativize(currentDirectory, uri, isWindows), source); - Map expectedWarnings = {}; - int lineNo = 0; - for (String line in source.split('\n')) { - if (line.contains('///') && - (line.contains('static type warning') || - line.contains('static warning'))) { - expectedWarnings[lineNo] = line; - } - lineNo++; - } - Set unseenWarnings = new Set.from(expectedWarnings.keys); - DiagnosticCollector collector = new DiagnosticCollector(); - var compiler = compilerFor(const {}, - diagnosticHandler: collector, - options: ['--analyze-only'], - showDiagnostics: verbose); - return compiler.run(uri).then((_) { - Map> statusMap = tests[test]; - // Line numbers with known unexpected warnings. - List unexpectedStatus = []; - if (statusMap != null && statusMap.containsKey('unexpected')) { - unexpectedStatus = statusMap['unexpected']; - } - // Line numbers with known missing warnings. - List missingStatus = []; - if (statusMap != null && statusMap.containsKey('missing')) { - missingStatus = statusMap['missing']; - } - for (DiagnosticMessage message in collector.warnings) { - Expect.equals(uri, message.uri); - int lineNo = file.getLine(message.begin); - if (expectedWarnings.containsKey(lineNo)) { - unseenWarnings.remove(lineNo); - } else if (!unexpectedStatus.contains(lineNo+1)) { - warningsMismatch = true; - print(file.getLocationMessage( - 'Unexpected warning: ${message.message}', - message.begin, message.end)); - } - } - if (!unseenWarnings.isEmpty) { - for (int lineNo in unseenWarnings) { - if (!missingStatus.contains(lineNo+1)) { - warningsMismatch = true; - String line = expectedWarnings[lineNo]; - print('$uri [${lineNo+1}]: Missing static type warning.'); - print(line); - } - } - } - }); - }).then((_) { - Expect.isFalse(warningsMismatch); - })); -} +// Copyright (c) 2013, 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. + +// Test that dart2js produces the expected static type warnings to ensures that +// the analyzer and dart2js agrees on the tests. + +import 'dart:async'; +import 'dart:io'; +import 'package:expect/expect.dart'; +import 'package:async_helper/async_helper.dart'; +import 'memory_compiler.dart'; +import 'package:compiler/src/filenames.dart'; +import 'package:compiler/src/io/source_file.dart'; +import 'package:compiler/src/source_file_provider.dart'; +import 'package:compiler/src/util/uri_extras.dart'; +import 'dart:convert'; + +void checkWarnings(Map tests, [List arguments]) { + bool isWindows = Platform.isWindows; + Uri script = currentDirectory.resolveUri(Platform.script); + bool warningsMismatch = false; + bool verbose = arguments != null && arguments.contains('-v'); + asyncTest(() => Future.forEach(tests.keys, (String test) { + Uri uri = script.resolve('../../$test'); + String source = UTF8.decode(readAll(uriPathToNative(uri.path))); + SourceFile file = new StringSourceFile( + uri, relativize(currentDirectory, uri, isWindows), source); + Map expectedWarnings = {}; + int lineNo = 0; + for (String line in source.split('\n')) { + if (line.contains('///') && + (line.contains('static type warning') || + line.contains('static warning'))) { + expectedWarnings[lineNo] = line; + } + lineNo++; + } + Set unseenWarnings = new Set.from(expectedWarnings.keys); + DiagnosticCollector collector = new DiagnosticCollector(); + var compiler = compilerFor(const {}, + diagnosticHandler: collector, + options: ['--analyze-only'], + showDiagnostics: verbose); + return compiler.run(uri).then((_) { + Map> statusMap = tests[test]; + // Line numbers with known unexpected warnings. + List unexpectedStatus = []; + if (statusMap != null && statusMap.containsKey('unexpected')) { + unexpectedStatus = statusMap['unexpected']; + } + // Line numbers with known missing warnings. + List missingStatus = []; + if (statusMap != null && statusMap.containsKey('missing')) { + missingStatus = statusMap['missing']; + } + for (DiagnosticMessage message in collector.warnings) { + Expect.equals(uri, message.uri); + int lineNo = file.getLine(message.begin); + if (expectedWarnings.containsKey(lineNo)) { + unseenWarnings.remove(lineNo); + } else if (!unexpectedStatus.contains(lineNo+1)) { + warningsMismatch = true; + print(file.getLocationMessage( + 'Unexpected warning: ${message.message}', + message.begin, message.end)); + } + } + if (!unseenWarnings.isEmpty) { + for (int lineNo in unseenWarnings) { + if (!missingStatus.contains(lineNo+1)) { + warningsMismatch = true; + String line = expectedWarnings[lineNo]; + print('$uri [${lineNo+1}]: Missing static type warning.'); + print(line); + } + } + } + }); + }).then((_) { + Expect.isFalse(warningsMismatch); + })); +} diff --git a/tests/compiler/dart2js_extra/string_interpolation_dynamic_test.dart b/tests/compiler/dart2js_extra/string_interpolation_dynamic_test.dart index 14ff9a5370d..f4604c79662 100644 --- a/tests/compiler/dart2js_extra/string_interpolation_dynamic_test.dart +++ b/tests/compiler/dart2js_extra/string_interpolation_dynamic_test.dart @@ -60,7 +60,7 @@ void testMultiLine() { Expect.equals("\n", """${''} """); Expect.equals("\r", """${''} """); - Expect.equals("\r\n", """${''} + Expect.equals("\r\n", """${''} """); Expect.equals("\n", """${'\n'}"""); Expect.equals("\r", """${'\r'}"""); diff --git a/tests/compiler/dart2js_extra/string_interpolation_test.dart b/tests/compiler/dart2js_extra/string_interpolation_test.dart index 7552214ab21..123702148dc 100644 --- a/tests/compiler/dart2js_extra/string_interpolation_test.dart +++ b/tests/compiler/dart2js_extra/string_interpolation_test.dart @@ -56,7 +56,7 @@ void testMultiLine() { Expect.equals("\n", """${''} """); Expect.equals("\r", """${''} """); - Expect.equals("\r\n", """${''} + Expect.equals("\r\n", """${''} """); Expect.equals("\n", """${'\n'}"""); Expect.equals("\r", """${'\r'}""");