text: // 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);
  }
  