| Index: tests/compiler/dart2js/kernel/class_hierarchy_test.dart
|
| diff --git a/tests/compiler/dart2js/kernel/class_hierarchy_test.dart b/tests/compiler/dart2js/kernel/class_hierarchy_test.dart
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..9b6aa08451375e0931ab3a33992c930097fe1ea9
|
| --- /dev/null
|
| +++ b/tests/compiler/dart2js/kernel/class_hierarchy_test.dart
|
| @@ -0,0 +1,76 @@
|
| +// Copyright (c) 2016, 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 dart2js copy of [KernelVisitor] generates the expected class
|
| +/// hierarchy.
|
| +
|
| +import 'package:compiler/src/compiler.dart' show Compiler;
|
| +import 'package:compiler/src/elements/elements.dart';
|
| +import 'package:compiler/src/js_backend/backend.dart' show JavaScriptBackend;
|
| +import 'package:compiler/src/commandline_options.dart' show Flags;
|
| +import 'package:kernel/ast.dart' as ir;
|
| +import 'package:kernel/class_hierarchy.dart';
|
| +import 'package:test/test.dart';
|
| +
|
| +import '../memory_compiler.dart';
|
| +
|
| +main(List<String> arguments) {
|
| + Compiler compiler = compilerFor(memorySourceFiles: {
|
| + 'main.dart': '''
|
| + class S {
|
| + sMethod() {}
|
| + }
|
| + class M {
|
| + mMethod() {}
|
| + }
|
| + class C extends S with M {
|
| + cMethod() {}
|
| + }
|
| + main() {}
|
| + '''
|
| + }, options: [
|
| + Flags.analyzeOnly,
|
| + Flags.analyzeMain,
|
| + Flags.useKernel
|
| + ]);
|
| + test('mixin', () async {
|
| + Uri mainUri = Uri.parse('memory:main.dart');
|
| + LibraryElement library = await compiler.analyzeUri(mainUri);
|
| + JavaScriptBackend backend = compiler.backend;
|
| + ir.Program program = backend.kernelTask.buildProgram(library);
|
| + ClassHierarchy hierarchy = new ClassHierarchy(program);
|
| +
|
| + ir.Class getClass(String name) {
|
| + for (ir.Class cls in hierarchy.classes) {
|
| + if (cls.enclosingLibrary.importUri == mainUri && cls.name == name) {
|
| + if (arguments.contains('-v')) {
|
| + print('$cls');
|
| + print(' dispatch targets:');
|
| + hierarchy
|
| + .getDispatchTargets(cls)
|
| + .forEach((member) => print(' $member'));
|
| + }
|
| + return cls;
|
| + }
|
| + }
|
| + fail('Class $name not found.');
|
| + }
|
| +
|
| + ir.Class classS = getClass('S');
|
| + ir.Class classM = getClass('M');
|
| + ir.Class classC = getClass('C');
|
| +
|
| + void checkInheritance(ir.Class superClass, ir.Class subClass) {
|
| + for (ir.Member member in hierarchy.getDispatchTargets(superClass)) {
|
| + expect(
|
| + hierarchy.getDispatchTarget(subClass, member.name), equals(member),
|
| + reason: 'Unexpected dispatch target for ${member.name} '
|
| + 'in $subClass');
|
| + }
|
| + }
|
| +
|
| + checkInheritance(classS, classC);
|
| + checkInheritance(classM, classC);
|
| + });
|
| +}
|
|
|