library test;
import self as self;
import "dart:core" as core;

typedef F<contravariant U extends core::Object* = dynamic, V extends core::Object* = dynamic> = (U*) →* V*;
class Foo<T extends core::Object* = dynamic> extends core::Object {
  synthetic constructor •() → self::Foo<self::Foo::T*>*
    : super core::Object::•()
    ;
  get v1() → self::Bar<self::Foo::T*>*
    return new self::Bar::•<self::Foo::T*>();
  get v2() → self::Bar<core::List<self::Foo::T*>*>*
    return new self::Bar::•<core::List<self::Foo::T*>*>();
  get v3() → self::Bar<(self::Foo::T*) →* self::Foo::T*>*
    return new self::Bar::•<(self::Foo::T*) →* self::Foo::T*>();
  get v4() → self::Bar<((self::Foo::T*) →* self::Foo::T*) →* self::Foo::T*>*
    return new self::Bar::•<((self::Foo::T*) →* self::Foo::T*) →* self::Foo::T*>();
  get v5() → core::List<self::Foo::T*>*
    return <self::Foo::T*>[];
  get v6() → core::List<(self::Foo::T*) →* self::Foo::T*>*
    return <(self::Foo::T*) →* self::Foo::T*>[];
  get v7() → core::Map<self::Foo::T*, self::Foo::T*>*
    return <self::Foo::T*, self::Foo::T*>{};
  get v8() → core::Map<(self::Foo::T*) →* self::Foo::T*, self::Foo::T*>*
    return <(self::Foo::T*) →* self::Foo::T*, self::Foo::T*>{};
  get v9() → core::Map<self::Foo::T*, (self::Foo::T*) →* self::Foo::T*>*
    return <self::Foo::T*, (self::Foo::T*) →* self::Foo::T*>{};
}
class Bar<T extends core::Object* = dynamic> extends core::Object {
  const constructor •() → self::Bar<self::Bar::T*>*
    : super core::Object::•()
    ;
}
static method main() → dynamic {}
