|  | 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}"; | 
|  | } | 
|  | } |