blob: 9812038e212000158ff15f2cae821213a2fa9f30 [file] [log] [blame]
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}})";
}
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}})";
}
extension Extension1 on self::Class1* {
method method = self::Extension1|method;
tearoff method = self::Extension1|get#method;
method genericMethod = self::Extension1|genericMethod;
tearoff genericMethod = self::Extension1|get#genericMethod;
get property = self::Extension1|get#property;
set property = self::Extension1|set#property;
}
extension Extension2 on self::Class2* {
method method = self::Extension2|method;
tearoff method = self::Extension2|get#method;
method genericMethod = self::Extension2|genericMethod;
tearoff genericMethod = self::Extension2|get#genericMethod;
get property = self::Extension2|get#property;
set property = self::Extension2|set#property;
}
static method Extension1|method(final self::Class1* #this) → core::int* {
core::print("Extension1.method on ${#this}");
return #this.{self::Class1::field};
}
static method Extension1|get#method(final self::Class1* #this) → () →* core::int*
return () core::int* => self::Extension1|method(#this);
static method Extension1|genericMethod<T extends core::num* = dynamic>(final self::Class1* #this, self::Extension1|genericMethod::T* t) → core::int* {
core::print("Extension1.genericMethod<${self::Extension1|genericMethod::T*}>(${t}) on ${#this}");
return #this.{self::Class1::field}.{core::num::+}(t) as{TypeError} core::int*;
}
static method Extension1|get#genericMethod(final self::Class1* #this) → <T extends core::num* = dynamic>(T*) →* core::int*
return <T extends core::num* = dynamic>(T* t) core::int* => self::Extension1|genericMethod<T*>(#this, t);
static method Extension1|get#property(final self::Class1* #this) → core::int* {
core::print("Extension1.property get on ${#this}");
return #this.{self::Class1::field};
}
static method Extension1|set#property(final self::Class1* #this, core::int* value) → core::int* {
final core::int* #t1 = value;
#this.{self::Class1::field} = value;
core::print("Extension1.property set(${value}) on ${#this}");
value = value.{core::num::+}(1);
return #t1;
}
static method Extension2|method(final self::Class2* #this) → core::int* {
core::print("Extension2.method on ${#this}");
return #this.{self::Class2::field}.{core::num::+}(3);
}
static method Extension2|get#method(final self::Class2* #this) → () →* core::int*
return () core::int* => self::Extension2|method(#this);
static method Extension2|genericMethod<T extends core::num* = dynamic>(final self::Class2* #this, self::Extension2|genericMethod::T* t) → core::int* {
core::print("Extension2.genericMethod<${self::Extension2|genericMethod::T*}>(${t}) on ${#this}");
return #this.{self::Class2::field}.{core::num::+}(t).{core::num::+}(4) as{TypeError} core::int*;
}
static method Extension2|get#genericMethod(final self::Class2* #this) → <T extends core::num* = dynamic>(T*) →* core::int*
return <T extends core::num* = dynamic>(T* t) core::int* => self::Extension2|genericMethod<T*>(#this, t);
static method Extension2|get#property(final self::Class2* #this) → core::int* {
core::print("Extension2.property get on ${#this}");
return #this.{self::Class2::field}.{core::num::+}(5);
}
static method Extension2|set#property(final self::Class2* #this, core::int* value) → core::int* {
final core::int* #t2 = value;
core::print("Extension2.property set(${value}) on ${#this}");
value = value.{core::num::+}(1);
#this.{self::Class2::field} = value;
return #t2;
}
static method main() dynamic {
self::testExtension1();
self::testExtension2();
}
static method testExtension1() dynamic {
self::Class1* c0 = new self::Class1::•(0);
self::Class1* c1 = new self::Class1::•(1);
self::expect(0, self::Extension1|method(c0));
self::expect(1, self::Extension1|method(c1));
self::expect(1, let final self::Class1* #t3 = c1 in #t3.{core::Object::==}(null) ?{core::int*} null : self::Extension1|method(#t3));
self::expect(42, self::Extension1|genericMethod<core::int*>(c0, 42));
self::expect(43, self::Extension1|genericMethod<core::num*>(c0, 43));
self::expect(88, self::Extension1|genericMethod<core::int*>(c1, 87));
self::expect(89, self::Extension1|genericMethod<core::num*>(c1, 88));
self::expect(0, self::Extension1|get#property(c0));
self::expect(0, let final self::Class1* #t4 = c0 in #t4.{core::Object::==}(null) ?{core::int*} null : self::Extension1|get#property(#t4));
self::expect(42, self::Extension1|set#property(c0, 42));
self::expect(1, self::Extension1|get#property(c1));
self::expect(87, self::Extension1|set#property(c0, 87));
self::expect(27, self::Extension1|set#property(c0, self::Extension1|set#property(c1, 27)));
self::expect(37, self::Extension1|set#property(c1, self::Extension1|set#property(c0, 37)));
self::expect(77, self::Extension1|set#property(c1, self::Extension1|set#property(c0, self::Extension1|set#property(c1, 77))));
self::expect(67, self::Extension1|set#property(c0, self::Extension1|set#property(c1, self::Extension1|set#property(c0, 67))));
}
static method testExtension2() dynamic {
self::Class2* c0 = new self::Class2::•(0);
self::Class2* c1 = new self::Class2::•(1);
self::expect(3, self::Extension2|method(c0));
self::expect(3, let final self::Class2* #t5 = c0 in #t5.{core::Object::==}(null) ?{core::int*} null : self::Extension2|method(#t5));
self::expect(4, self::Extension2|method(c1));
self::expect(46, self::Extension2|genericMethod<core::int*>(c0, 42));
self::expect(47, self::Extension2|genericMethod<core::num*>(c0, 43));
self::expect(92, self::Extension2|genericMethod<core::int*>(c1, 87));
self::expect(93, self::Extension2|genericMethod<core::num*>(c1, 88));
self::expect(5, self::Extension2|get#property(c0));
self::expect(5, let final self::Class2* #t6 = c0 in #t6.{core::Object::==}(null) ?{core::int*} null : self::Extension2|get#property(#t6));
self::expect(42, self::Extension2|set#property(c0, 42));
self::expect(48, self::Extension2|get#property(c0));
self::expect(6, self::Extension2|get#property(c1));
self::expect(43, self::Extension2|set#property(c1, 43));
self::expect(49, self::Extension2|get#property(c1));
self::expect(49, self::Extension2|set#property(c0, self::Extension2|get#property(c1)));
self::expect(55, self::Extension2|set#property(c1, self::Extension2|get#property(c0)));
self::expect(61, self::Extension2|set#property(c1, self::Extension2|set#property(c0, self::Extension2|get#property(c1))));
self::expect(67, self::Extension2|set#property(c0, self::Extension2|set#property(c1, self::Extension2|get#property(c0))));
}
static method expect(dynamic expected, dynamic actual) dynamic {
if(!expected.{core::Object::==}(actual)) {
throw "Mismatch: expected=${expected}, actual=${actual}";
}
}