| library; |
| 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::•() |
| ; |
| abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode |
| abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf |
| abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf |
| abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue |
| abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse |
| abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::== |
| abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode |
| abstract member-signature method toString() → core::String*; -> core::Object::toString |
| abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod |
| abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType |
| } |
| 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{TypeError} 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{TypeError} 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}"; |
| } |
| } |