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

class Class extends core::Object {
  synthetic constructor •() → self::Class
    : super core::Object::•()
    ;
}
extension Extension on self::Class {
  method method0 = self::Extension|method0;
  method tearoff method0 = self::Extension|get#method0;
  method method1 = self::Extension|method1;
  method tearoff method1 = self::Extension|get#method1;
  method method2 = self::Extension|method2;
  method tearoff method2 = self::Extension|get#method2;
  method method3 = self::Extension|method3;
  method tearoff method3 = self::Extension|get#method3;
  static method staticMethod = self::Extension|staticMethod;
}
static extension-member method Extension|method0(lowered final self::Class #this, [dynamic a = #C1]) → dynamic
  return a;
static extension-member method Extension|get#method0(lowered final self::Class #this) → ([dynamic]) → dynamic
  return ([dynamic a = #C1]) → dynamic => self::Extension|method0(#this, a);
static extension-member method Extension|method1(lowered final self::Class #this, [dynamic a = #C2]) → dynamic
  return a;
static extension-member method Extension|get#method1(lowered final self::Class #this) → ([dynamic]) → dynamic
  return ([dynamic a = #C2]) → dynamic => self::Extension|method1(#this, a);
static extension-member method Extension|method2(lowered final self::Class #this, {dynamic b = #C3}) → dynamic
  return b;
static extension-member method Extension|get#method2(lowered final self::Class #this) → ({b: dynamic}) → dynamic
  return ({dynamic b = #C3}) → dynamic => self::Extension|method2(#this, b: b);
static extension-member method Extension|method3(lowered final self::Class #this, {dynamic c = #C4}) → dynamic
  return c{dynamic}();
static extension-member method Extension|get#method3(lowered final self::Class #this) → ({c: dynamic}) → dynamic
  return ({dynamic c = #C4}) → dynamic => self::Extension|method3(#this, c: c);
static extension-member method Extension|staticMethod() → dynamic
  return 123;
static method main() → dynamic {
  self::Class c = new self::Class::•();
  ([dynamic]) → dynamic tearOff0 = self::Extension|get#method0(c);
  self::expect(0, tearOff0(0){([dynamic]) → dynamic});
  self::expect(null, tearOff0(){([dynamic]) → dynamic});
  ([dynamic]) → dynamic tearOff1 = self::Extension|get#method1(c);
  self::expect(0, tearOff1(0){([dynamic]) → dynamic});
  self::expect(42, tearOff1(){([dynamic]) → dynamic});
  ({b: dynamic}) → dynamic tearOff2 = self::Extension|get#method2(c);
  self::expect(0, tearOff2(b: 0){({b: dynamic}) → dynamic});
  self::expect(87, tearOff2(){({b: dynamic}) → dynamic});
  ({c: dynamic}) → dynamic tearOff3 = self::Extension|get#method3(c);
  self::expect(0, tearOff3(c: () → core::int => 0){({c: dynamic}) → dynamic});
  self::expect(123, tearOff3(){({c: dynamic}) → dynamic});
}
static method expect(dynamic expected, dynamic actual) → dynamic {
  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual)) {
    throw "Mismatch: expected=${expected}, actual=${actual}";
  }
}

constants  {
  #C1 = null
  #C2 = 42
  #C3 = 87
  #C4 = static-tearoff self::Extension|staticMethod
}
