| library /*isNonNullableByDefault*/; |
| import self as self; |
| import "dart:core" as core; |
| |
| class Class<T extends core::num> extends core::Object { |
| covariant-by-class field self::Class::T field1; |
| covariant-by-class field self::Class::T field2; |
| constructor •(self::Class::T field1, self::Class::T field2) → self::Class<self::Class::T> |
| : self::Class::field1 = field1, self::Class::field2 = field2, super core::Object::•() |
| ; |
| } |
| extension Extension1<T extends core::num> on self::Class<T> { |
| static field latestType = self::Extension1|latestType; |
| get field = self::Extension1|get#field; |
| method method = self::Extension1|method; |
| tearoff method = self::Extension1|get#method; |
| method genericMethod = self::Extension1|genericMethod; |
| tearoff genericMethod = self::Extension1|get#genericMethod; |
| set field = self::Extension1|set#field; |
| } |
| extension Extension2<T extends core::num> on self::Class<T> { |
| get field = self::Extension2|get#field; |
| method method = self::Extension2|method; |
| tearoff method = self::Extension2|get#method; |
| method genericMethod = self::Extension2|genericMethod; |
| tearoff genericMethod = self::Extension2|get#genericMethod; |
| set field = self::Extension2|set#field; |
| } |
| static field core::String? Extension1|latestType; |
| static method Extension1|get#field<T extends core::num>(lowered final self::Class<self::Extension1|get#field::T> #this) → self::Extension1|get#field::T { |
| self::Extension1|latestType = "${self::Extension1|get#field::T}"; |
| return #this.{self::Class::field1}{self::Extension1|get#field::T}; |
| } |
| static method Extension1|set#field<T extends core::num>(lowered final self::Class<self::Extension1|set#field::T> #this, self::Extension1|set#field::T value) → void { |
| self::Extension1|latestType = "${self::Extension1|set#field::T}"; |
| #this.{self::Class::field1} = value; |
| } |
| static method Extension1|method<T extends core::num>(lowered final self::Class<self::Extension1|method::T> #this) → self::Extension1|method::T { |
| self::Extension1|latestType = "${self::Extension1|method::T}"; |
| return #this.{self::Class::field1}{self::Extension1|method::T}; |
| } |
| static method Extension1|get#method<T extends core::num>(lowered final self::Class<self::Extension1|get#method::T> #this) → () → self::Extension1|get#method::T |
| return () → self::Extension1|get#method::T => self::Extension1|method<self::Extension1|get#method::T>(#this); |
| static method Extension1|genericMethod<T extends core::num, S extends core::num>(lowered final self::Class<self::Extension1|genericMethod::T> #this, self::Extension1|genericMethod::S t) → self::Extension1|genericMethod::T { |
| self::Extension1|latestType = "${self::Extension1|genericMethod::T}:${self::Extension1|genericMethod::S}"; |
| return #this.{self::Class::field1}{self::Extension1|genericMethod::T}.{core::num::+}(t){(core::num) → core::num} as{ForNonNullableByDefault} self::Extension1|genericMethod::T; |
| } |
| static method Extension1|get#genericMethod<T extends core::num>(lowered final self::Class<self::Extension1|get#genericMethod::T> #this) → <S extends core::num>(S) → self::Extension1|get#genericMethod::T |
| return <S extends core::num>(S t) → self::Extension1|get#genericMethod::T => self::Extension1|genericMethod<self::Extension1|get#genericMethod::T, S>(#this, t); |
| static method Extension2|get#field<T extends core::num>(lowered final self::Class<self::Extension2|get#field::T> #this) → self::Extension2|get#field::T |
| return #this.{self::Class::field2}{self::Extension2|get#field::T}; |
| static method Extension2|set#field<T extends core::num>(lowered final self::Class<self::Extension2|set#field::T> #this, self::Extension2|set#field::T value) → void { |
| #this.{self::Class::field2} = value; |
| } |
| static method Extension2|method<T extends core::num>(lowered final self::Class<self::Extension2|method::T> #this) → self::Extension2|method::T |
| return #this.{self::Class::field2}{self::Extension2|method::T}; |
| static method Extension2|get#method<T extends core::num>(lowered final self::Class<self::Extension2|get#method::T> #this) → () → self::Extension2|get#method::T |
| return () → self::Extension2|get#method::T => self::Extension2|method<self::Extension2|get#method::T>(#this); |
| static method Extension2|genericMethod<T extends core::num, S extends core::num>(lowered final self::Class<self::Extension2|genericMethod::T> #this, self::Extension2|genericMethod::S t) → self::Extension2|genericMethod::T |
| return #this.{self::Class::field2}{self::Extension2|genericMethod::T}.{core::num::+}(t){(core::num) → core::num} as{ForNonNullableByDefault} self::Extension2|genericMethod::T; |
| static method Extension2|get#genericMethod<T extends core::num>(lowered final self::Class<self::Extension2|get#genericMethod::T> #this) → <S extends core::num>(S) → self::Extension2|get#genericMethod::T |
| return <S extends core::num>(S t) → self::Extension2|get#genericMethod::T => self::Extension2|genericMethod<self::Extension2|get#genericMethod::T, S>(#this, t); |
| static method main() → dynamic { |
| self::Class<core::int> c = new self::Class::•<core::int>(42, 87); |
| self::expect(42, self::Extension1|get#field<core::num>(c)); |
| self::expect("num", self::Extension1|latestType); |
| self::expect(42, self::Extension1|get#field<core::int>(c)); |
| self::expect("int", self::Extension1|latestType); |
| self::expect(87, self::Extension2|get#field<core::num>(c)); |
| self::expect(42, self::Extension1|method<core::num>(c)); |
| self::expect("num", self::Extension1|latestType); |
| self::expect(42, self::Extension1|method<core::int>(c)); |
| self::expect("int", self::Extension1|latestType); |
| self::expect(87, self::Extension2|method<core::num>(c)); |
| () → core::num tearOffNumber1 = self::Extension1|get#method<core::num>(c); |
| () → core::int tearOffInteger1 = self::Extension1|get#method<core::int>(c); |
| () → core::num tearOff2 = self::Extension2|get#method<core::num>(c); |
| self::expect(42, tearOffNumber1(){() → core::num}); |
| self::expect("num", self::Extension1|latestType); |
| self::expect(42, tearOffInteger1(){() → core::int}); |
| self::expect("int", self::Extension1|latestType); |
| self::expect(87, tearOff2(){() → core::num}); |
| self::expect(52, self::Extension1|genericMethod<core::num, core::int>(c, 10)); |
| self::expect("num:int", self::Extension1|latestType); |
| self::expect(52, self::Extension1|genericMethod<core::int, core::int>(c, 10)); |
| self::expect("int:int", self::Extension1|latestType); |
| self::expect(97, self::Extension2|genericMethod<core::num, core::int>(c, 10)); |
| self::expect(52, self::Extension1|genericMethod<core::num, core::num>(c, 10)); |
| self::expect("num:num", self::Extension1|latestType); |
| self::expect(52, self::Extension1|genericMethod<core::int, core::num>(c, 10)); |
| self::expect("int:num", self::Extension1|latestType); |
| self::expect(97, self::Extension2|genericMethod<core::num, core::num>(c, 10)); |
| self::expect(52, self::Extension1|genericMethod<core::int, core::int>(c, 10)); |
| self::expect("int:int", self::Extension1|latestType); |
| self::expect(52, self::Extension1|genericMethod<core::int, core::num>(c, 10)); |
| self::expect("int:num", self::Extension1|latestType); |
| self::expect(52, self::Extension1|genericMethod<core::int, core::int>(c, 10)); |
| self::expect("int:int", self::Extension1|latestType); |
| <S extends core::num>(S) → core::num genericTearOffNumber1 = self::Extension1|get#genericMethod<core::num>(c); |
| <S extends core::num>(S) → core::int genericTearOffInteger1 = self::Extension1|get#genericMethod<core::int>(c); |
| <S extends core::num>(S) → core::num genericTearOff2 = self::Extension2|get#genericMethod<core::num>(c); |
| self::expect(52, genericTearOffNumber1<core::int>(10){(core::int) → core::num}); |
| self::expect("num:int", self::Extension1|latestType); |
| self::expect(52, genericTearOffInteger1<core::int>(10){(core::int) → core::int}); |
| self::expect("int:int", self::Extension1|latestType); |
| self::expect(97, genericTearOff2<core::int>(10){(core::int) → core::num}); |
| self::expect(52, genericTearOffNumber1<core::num>(10){(core::num) → core::num}); |
| self::expect("num:num", self::Extension1|latestType); |
| self::expect(52, genericTearOffInteger1<core::num>(10){(core::num) → core::int}); |
| self::expect("int:num", self::Extension1|latestType); |
| self::expect(97, genericTearOff2<core::num>(10){(core::num) → core::num}); |
| self::expect(23, let final self::Class<core::int> #t1 = c in let final core::int #t2 = 23 in let final void #t3 = self::Extension1|set#field<core::num>(#t1, #t2) in #t2); |
| self::expect("num", self::Extension1|latestType); |
| self::expect(23, let final self::Class<core::int> #t4 = c in let final core::int #t5 = 23 in let final void #t6 = self::Extension1|set#field<core::int>(#t4, #t5) in #t5); |
| self::expect("int", self::Extension1|latestType); |
| self::expect(67, let final self::Class<core::int> #t7 = c in let final core::int #t8 = 67 in let final void #t9 = self::Extension2|set#field<core::num>(#t7, #t8) in #t8); |
| self::expect(23, self::Extension1|get#field<core::num>(c)); |
| self::expect(67, self::Extension2|get#field<core::num>(c)); |
| } |
| static method expect(dynamic expected, dynamic actual) → dynamic { |
| if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual)) { |
| throw "Mismatch: expected=${expected}, actual=${actual}"; |
| } |
| } |