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

typedef F<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 {}
