| // 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. |
| |
| // Regression test for issue 21666 - problems with method that has super calls. |
| // |
| // Use a method and getter with super calls in various ways. |
| |
| import 'package:expect/expect.dart'; |
| |
| @MirrorsUsed(targets: const [A, B, Object]) |
| import 'dart:mirrors'; |
| |
| class X { |
| const X(); |
| } |
| |
| class Y { |
| const Y(); |
| } |
| |
| typedef fInt(int x); |
| typedef fString(String x); |
| |
| class A { |
| @X() |
| foo(int x) => x + 1; |
| int get bar => A.g; |
| |
| static int g = 0; |
| } |
| |
| class B extends A { |
| @Y() |
| foo(int x) => 100 * super.foo(x); |
| int get bar => 1000 * super.bar; |
| } |
| |
| String dump(ClassMirror cm) { |
| var sb = new StringBuffer(); |
| sb.write('$cm\n'); |
| for (var mm in cm.declarations.values) { |
| sb.write(' $mm\n'); |
| // Walking declaration metadata triggers issue 21666. |
| for (var a in mm.metadata) { |
| sb.write(' $a\n'); |
| } |
| } |
| print(sb); |
| return '$sb'; |
| } |
| |
| main() { |
| var cmB = reflectClass(B); |
| var cmBdump = dump(cmB); |
| var cmAdump = dump(cmB.superclass); |
| |
| Expect.equals(dump(reflectClass(A)), cmAdump); |
| Expect.isTrue(cmAdump.contains("'foo'")); |
| Expect.isTrue(cmAdump.contains("'bar'")); |
| Expect.isTrue(cmBdump.contains("'foo'")); |
| Expect.isTrue(cmBdump.contains("'bar'")); |
| |
| A.g = 123; |
| var a = new A(); |
| var am = reflect(a); |
| var agfoo = am.getField(#foo); |
| var agbar = am.getField(#bar); |
| |
| Expect.equals(3, agfoo.reflectee(2)); |
| Expect.equals(4, am.invoke(#foo, [3]).reflectee); |
| Expect.equals(123, agbar.reflectee); |
| Expect.isTrue(a.foo is fInt); |
| Expect.isTrue(a.foo is! fString); |
| Expect.isTrue(agfoo.reflectee is fInt); |
| Expect.isTrue(agfoo.reflectee is! fString); |
| |
| var b = new B(); |
| var bm = reflect(b); |
| var bgfoo = bm.getField(#foo); |
| var bgbar = bm.getField(#bar); |
| |
| Expect.equals(300, bgfoo.reflectee(2)); |
| Expect.equals(400, bm.invoke(#foo, [3]).reflectee); |
| Expect.equals(123000, bgbar.reflectee); |
| Expect.isTrue(b.foo is fInt); |
| Expect.isTrue(b.foo is! fString); |
| Expect.isTrue(bgfoo.reflectee is fInt); |
| Expect.isTrue(bgfoo.reflectee is! fString); |
| } |