library;
import self as self;
import "dart:core" as core;

abstract class B extends core::Object {
  synthetic constructor •() → self::B
    : super core::Object::•()
    ;
  abstract method call<T extends core::Object? = dynamic>() → dynamic;
}
class C extends core::Object implements self::B {
  synthetic constructor •() → self::C
    : super core::Object::•()
    ;
  method call<T extends core::Object? = dynamic>() → dynamic
    return core::print(self::C::call::T%);
  static synthetic method _#new#tearOff() → self::C
    return new self::C::•();
}
abstract class A extends core::Object {
  synthetic constructor •() → self::A
    : super core::Object::•()
    ;
}
class Wrapper extends core::Object {
  final field self::B b;
  final field self::B call;
  constructor •(self::B b, self::B call) → self::Wrapper
    : self::Wrapper::b = b, self::Wrapper::call = call, super core::Object::•()
    ;
  static synthetic method _#new#tearOff(self::B b, self::B call) → self::Wrapper
    return new self::Wrapper::•(b, call);
}
static method main() → void {
  self::B b = new self::C::•();
  b.{self::B::call}<self::A>(){() → dynamic};
  new self::Wrapper::•(b, b).{self::Wrapper::b}<self::A>(){() → dynamic};
  new self::Wrapper::•(b, b).{self::Wrapper::b}{self::B}.{self::B::call}<self::A>(){() → dynamic};
  new self::Wrapper::•(b, b).{self::Wrapper::call}<self::A>(){() → dynamic};
  new self::Wrapper::•(b, b).{self::Wrapper::call}{self::B}.{self::B::call}<self::A>(){() → dynamic};
}
