blob: 0c751d4bb3734066bde898b34245fb1489fbd0bc [file] [log] [blame]
library;
import self as self;
import "dart:core" as core;
typedef ContraFunction<contravariant T extends core::Object* = dynamic> = (T*) →* void;
typedef InvFunction<invariant T extends core::Object* = dynamic> = (T*) →* T*;
class Contravariant<contravariant T extends core::Object* = dynamic> extends core::Object {
synthetic constructor •() self::Contravariant<self::Contravariant::T*>*
: super core::Object::•()
;
}
class Invariant<invariant T extends core::Object* = dynamic> extends core::Object {
synthetic constructor •() self::Invariant<self::Invariant::T*>*
: super core::Object::•()
;
}
class A<contravariant T extends core::Object* = dynamic, U extends core::Object* = dynamic, V extends core::Object* = dynamic> extends core::Object {
final field (self::A::T*) →* void field = null;
synthetic constructor •() self::A<self::A::T*, self::A::U*, self::A::V*>*
: super core::Object::•()
;
method method(self::A::T* t, (self::A::U*) →* void u, generic-covariant-impl self::A::V* v) void {}
method method2(self::A::T* x, [self::A::T* y = #C1]) → void {}
set x(self::A::T* t) void {}
get mapContra() core::Map<self::A::U*, self::Contravariant<self::A::V*>*>*
return core::Map::•<self::A::U*, self::Contravariant<self::A::V*>*>();
get mapContraFn() core::Map<self::A::U*, (self::A::V*) →* void>*
return core::Map::•<self::A::U*, (self::A::V*) →* void>();
get mapInv() core::Map<self::A::U*, self::Invariant<self::A::V*>*>*
return core::Map::•<self::A::U*, self::Invariant<self::A::V*>*>();
get mapInvFn() core::Map<self::A::U*, (self::A::V*) →* self::A::V*>*
return core::Map::•<self::A::U*, (self::A::V*) →* self::A::V*>();
}
class B<invariant T extends core::Object* = dynamic> extends core::Object {
field self::B::T* x = null;
synthetic constructor •() self::B<self::B::T*>*
: super core::Object::•()
;
method method(self::B::T* x) self::B::T*
return null;
set y(self::B::T* x) void {}
}
class C<contravariant T extends core::Object* = dynamic> extends core::Object {
final field (self::C::T*) →* void field = null;
synthetic constructor •() self::C<self::C::T*>*
: super core::Object::•()
;
method method(self::C::T* x, [self::C::T* y = #C1]) → void {}
set x(self::C::T* t) void {}
}
abstract class D<T extends core::Object* = dynamic> extends core::Object {
synthetic constructor •() self::D<self::D::T*>*
: super core::Object::•()
;
abstract method method(generic-covariant-impl self::D::T* x) core::int*;
}
class E<invariant T extends core::Object* = dynamic> extends core::Object {
final field (self::E::T*) →* void f;
constructor •((self::E::T*) →* void f) self::E<self::E::T*>*
: self::E::f = f, super core::Object::•()
;
method method(self::E::T* x) core::int* {
this.{self::E::f}(x);
}
}
class F<invariant T extends core::Object* = dynamic> extends self::E<self::F::T*> implements self::D<self::F::T*> {
constructor •((self::F::T*) →* void f) self::F<self::F::T*>*
: super self::E::•(f)
;
forwarding-stub method method(generic-covariant-impl self::F::T* x) core::int*
return super.{self::E::method}(x);
}
static method main() dynamic {
self::A<core::int*, core::num*, core::String*>* a = new self::A::•<core::int*, core::num*, core::String*>();
self::expect(null, a.{self::A::field});
a.{self::A::method}(3, (core::num* num) core::Null? {}, "test");
a.{self::A::method2}(3);
a.{self::A::x} = 3;
core::Map<core::num*, self::Contravariant<core::String*>*>* mapContra = a.{self::A::mapContra} as{TypeError} core::Map<core::num*, self::Contravariant<core::String*>*>*;
core::Map<core::num*, (core::String*) →* void>* mapContraFn = a.{self::A::mapContraFn} as{TypeError} core::Map<core::num*, (core::String*) →* void>*;
core::Map<core::num*, self::Invariant<core::String*>*>* mapInv = a.{self::A::mapInv} as{TypeError} core::Map<core::num*, self::Invariant<core::String*>*>*;
core::Map<core::num*, (core::String*) →* core::String*>* mapInvFn = a.{self::A::mapInvFn} as{TypeError} core::Map<core::num*, (core::String*) →* core::String*>*;
self::B<core::int*>* b = new self::B::•<core::int*>();
b.{self::B::x} = 3;
self::expect(3, b.{self::B::x});
self::expect(null, b.{self::B::method}(3));
b.{self::B::y} = 3;
self::C<core::int*>* c = new self::C::•<core::int*>();
self::expect(null, c.{self::C::field});
c.{self::C::method}(3, 2);
c.{self::C::x} = 3;
self::D<core::Object*>* d = new self::F::•<core::String*>((core::String* s) core::Null? {});
d.{self::D::method}("test");
}
static method expect(dynamic expected, dynamic actual) dynamic {
if(!expected.{core::Object::==}(actual)) {
throw "Mismatch: expected=${expected}, actual=${actual}";
}
}
constants {
#C1 = null
}