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

class Class1 extends core::Object {
  field core::int field;
  constructor •(core::int field) → self::Class1
    : self::Class1::field = field, super core::Object::•()
    ;
  method toString() → core::String
    return "Class1(${this.{self::Class1::field}{core::int}})";
}
class Class2 extends core::Object {
  field core::int field;
  constructor •(core::int field) → self::Class2
    : self::Class2::field = field, super core::Object::•()
    ;
  method toString() → core::String
    return "Class2(${this.{self::Class2::field}{core::int}})";
}
extension /* unnamed */ _extension#0 on self::Class1 {
  method method = self::_extension#0|method;
  method tearoff method = self::_extension#0|get#method;
  method genericMethod = self::_extension#0|genericMethod;
  method tearoff genericMethod = self::_extension#0|get#genericMethod;
  get property = self::_extension#0|get#property;
  set property = self::_extension#0|set#property;
}
extension /* unnamed */ _extension#1 on self::Class2 {
  method method = self::_extension#1|method;
  method tearoff method = self::_extension#1|get#method;
  method genericMethod = self::_extension#1|genericMethod;
  method tearoff genericMethod = self::_extension#1|get#genericMethod;
  get property = self::_extension#1|get#property;
  set property = self::_extension#1|set#property;
}
static extension-member method _extension#0|method(lowered final self::Class1 #this) → core::int {
  core::print("Extension1.method on ${#this}");
  return #this.{self::Class1::field}{core::int};
}
static extension-member method _extension#0|get#method(lowered final self::Class1 #this) → () → core::int
  return () → core::int => self::_extension#0|method(#this);
static extension-member method _extension#0|genericMethod<T extends core::num>(lowered final self::Class1 #this, self::_extension#0|genericMethod::T t) → core::num {
  core::print("Extension1.genericMethod<${self::_extension#0|genericMethod::T}>(${t}) on ${#this}");
  return #this.{self::Class1::field}{core::int}.{core::num::+}(t){(core::num) → core::num};
}
static extension-member method _extension#0|get#genericMethod(lowered final self::Class1 #this) → <T extends core::num>(T) → core::num
  return <T extends core::num>(T t) → core::num => self::_extension#0|genericMethod<T>(#this, t);
static extension-member method _extension#0|get#property(lowered final self::Class1 #this) → core::int {
  core::print("Extension1.property get on ${#this}");
  return #this.{self::Class1::field}{core::int};
}
static extension-member method _extension#0|set#property(lowered final self::Class1 #this, core::int value) → void {
  #this.{self::Class1::field} = value;
  core::print("Extension1.property set(${value}) on ${#this}");
  value = value.{core::num::+}(1){(core::num) → core::int};
}
static extension-member method _extension#1|method(lowered final self::Class2 #this) → core::int {
  core::print("Extension2.method on ${#this}");
  return #this.{self::Class2::field}{core::int}.{core::num::+}(3){(core::num) → core::int};
}
static extension-member method _extension#1|get#method(lowered final self::Class2 #this) → () → core::int
  return () → core::int => self::_extension#1|method(#this);
static extension-member method _extension#1|genericMethod<T extends core::num>(lowered final self::Class2 #this, self::_extension#1|genericMethod::T t) → core::num {
  core::print("Extension2.genericMethod<${self::_extension#1|genericMethod::T}>(${t}) on ${#this}");
  return #this.{self::Class2::field}{core::int}.{core::num::+}(t){(core::num) → core::num}.{core::num::+}(4){(core::num) → core::num};
}
static extension-member method _extension#1|get#genericMethod(lowered final self::Class2 #this) → <T extends core::num>(T) → core::num
  return <T extends core::num>(T t) → core::num => self::_extension#1|genericMethod<T>(#this, t);
static extension-member method _extension#1|get#property(lowered final self::Class2 #this) → core::int {
  core::print("Extension2.property get on ${#this}");
  return #this.{self::Class2::field}{core::int}.{core::num::+}(5){(core::num) → core::int};
}
static extension-member method _extension#1|set#property(lowered final self::Class2 #this, core::int value) → void {
  core::print("Extension2.property set(${value}) on ${#this}");
  value = value.{core::num::+}(1){(core::num) → core::int};
  #this.{self::Class2::field} = value;
}
static method main() → dynamic {
  self::Class1 c10 = new self::Class1::•(0);
  self::Class1 c11 = new self::Class1::•(1);
  self::testExtension1(c10, c11, c10, c11);
  self::Class2 c20 = new self::Class2::•(0);
  self::Class2 c21 = new self::Class2::•(1);
  self::testExtension2(c20, c21, c20);
}
static method testExtension1(self::Class1 c0, self::Class1 c1, self::Class1? c0n, self::Class1? c1n) → dynamic {
  self::expect(0, self::_extension#0|method(c0));
  self::expect(1, self::_extension#0|method(c1));
  self::expect(1, let final self::Class1? #t1 = c1n in #t1 == null ?{core::int?} null : self::_extension#0|method(#t1{self::Class1}));
  self::expect(42, self::_extension#0|genericMethod<core::int>(c0, 42));
  self::expect(43, self::_extension#0|genericMethod<core::num>(c0, 43));
  self::expect(88, self::_extension#0|genericMethod<core::int>(c1, 87));
  self::expect(89, self::_extension#0|genericMethod<core::num>(c1, 88));
  self::expect(0, self::_extension#0|get#property(c0));
  self::expect(0, let final self::Class1? #t2 = c0n in #t2 == null ?{core::int?} null : self::_extension#0|get#property(#t2{self::Class1}));
  self::expect(42, let final core::int #t3 = 42 in let final void #t4 = self::_extension#0|set#property(c0, #t3) in #t3);
  self::expect(1, self::_extension#0|get#property(c1));
  self::expect(87, let final core::int #t5 = 87 in let final void #t6 = self::_extension#0|set#property(c0, #t5) in #t5);
  self::expect(27, let final core::int #t7 = let final core::int #t8 = 27 in let final void #t9 = self::_extension#0|set#property(c1, #t8) in #t8 in let final void #t10 = self::_extension#0|set#property(c0, #t7) in #t7);
  self::expect(37, let final core::int #t11 = let final core::int #t12 = 37 in let final void #t13 = self::_extension#0|set#property(c0, #t12) in #t12 in let final void #t14 = self::_extension#0|set#property(c1, #t11) in #t11);
  self::expect(77, let final core::int #t15 = let final core::int #t16 = let final core::int #t17 = 77 in let final void #t18 = self::_extension#0|set#property(c1, #t17) in #t17 in let final void #t19 = self::_extension#0|set#property(c0, #t16) in #t16 in let final void #t20 = self::_extension#0|set#property(c1, #t15) in #t15);
  self::expect(67, let final core::int #t21 = let final core::int #t22 = let final core::int #t23 = 67 in let final void #t24 = self::_extension#0|set#property(c0, #t23) in #t23 in let final void #t25 = self::_extension#0|set#property(c1, #t22) in #t22 in let final void #t26 = self::_extension#0|set#property(c0, #t21) in #t21);
}
static method testExtension2(self::Class2 c0, self::Class2 c1, self::Class2? c0n) → dynamic {
  self::expect(3, self::_extension#1|method(c0));
  self::expect(3, let final self::Class2? #t27 = c0n in #t27 == null ?{core::int?} null : self::_extension#1|method(#t27{self::Class2}));
  self::expect(4, self::_extension#1|method(c1));
  self::expect(46, self::_extension#1|genericMethod<core::int>(c0, 42));
  self::expect(47, self::_extension#1|genericMethod<core::num>(c0, 43));
  self::expect(92, self::_extension#1|genericMethod<core::int>(c1, 87));
  self::expect(93, self::_extension#1|genericMethod<core::num>(c1, 88));
  self::expect(5, self::_extension#1|get#property(c0));
  self::expect(5, let final self::Class2? #t28 = c0n in #t28 == null ?{core::int?} null : self::_extension#1|get#property(#t28{self::Class2}));
  self::expect(42, let final core::int #t29 = 42 in let final void #t30 = self::_extension#1|set#property(c0, #t29) in #t29);
  self::expect(48, self::_extension#1|get#property(c0));
  self::expect(6, self::_extension#1|get#property(c1));
  self::expect(43, let final core::int #t31 = 43 in let final void #t32 = self::_extension#1|set#property(c1, #t31) in #t31);
  self::expect(49, self::_extension#1|get#property(c1));
  self::expect(49, let final core::int #t33 = self::_extension#1|get#property(c1) in let final void #t34 = self::_extension#1|set#property(c0, #t33) in #t33);
  self::expect(55, let final core::int #t35 = self::_extension#1|get#property(c0) in let final void #t36 = self::_extension#1|set#property(c1, #t35) in #t35);
  self::expect(61, let final core::int #t37 = let final core::int #t38 = self::_extension#1|get#property(c1) in let final void #t39 = self::_extension#1|set#property(c0, #t38) in #t38 in let final void #t40 = self::_extension#1|set#property(c1, #t37) in #t37);
  self::expect(67, let final core::int #t41 = let final core::int #t42 = self::_extension#1|get#property(c0) in let final void #t43 = self::_extension#1|set#property(c1, #t42) in #t42 in let final void #t44 = self::_extension#1|set#property(c0, #t41) in #t41);
}
static method expect(dynamic expected, dynamic actual) → dynamic {
  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual)) {
    throw "Mismatch: expected=${expected}, actual=${actual}";
  }
}
