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

class Class<T extends core::Object* = dynamic> extends core::Object {
  synthetic constructor •() → self::Class<self::Class::T*>*
    : super core::Object::•()
    ;
  method method(generic-covariant-impl self::Class::T* a) → self::Class::T*
    return a;
  abstract member-signature get _identityHashCode() → core::int*;
  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*;
  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*;
  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*;
  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*;
  abstract member-signature operator ==(dynamic other) → core::bool*;
  abstract member-signature get hashCode() → core::int*;
  abstract member-signature method toString() → core::String*;
  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic;
  abstract member-signature get runtimeType() → core::Type*;
}
extension Extension<T extends core::Object* = dynamic> on self::Class<T*>* {
  method call = self::Extension|call;
  tearoff call = self::Extension|get#call;
}
static method Extension|call<T extends core::Object* = dynamic>(final self::Class<self::Extension|call::T*>* #this, self::Extension|call::T* a) → self::Extension|call::T*
  return #this.{self::Class::method}(a);
static method Extension|get#call<T extends core::Object* = dynamic>(final self::Class<self::Extension|get#call::T*>* #this) → (self::Extension|get#call::T*) →* self::Extension|get#call::T*
  return (self::Extension|get#call::T* a) → self::Extension|get#call::T* => self::Extension|call<self::Extension|get#call::T*>(#this, a);
static method main() → dynamic {
  self::Class<core::int*>* c = new self::Class::•<core::int*>();
  self::expect(42, self::Extension|call<core::int*>(c, 42));
  self::expect(87, self::Extension|call<core::int*>(c, 87));
  self::expect(123, self::Extension|call<core::int*>(c, 123));
  self::expect(42, self::Extension|call<core::int*>(c, 42));
  self::expect(87, self::Extension|call<core::int*>(c, 87));
  self::expect(123, self::Extension|call<core::int*>(c, 123));
}
static method expect(dynamic expected, dynamic actual) → dynamic {
  if(!expected.{core::Object::==}(actual)) {
    throw "Mismatch: expected=${expected}, actual=${actual}";
  }
}
