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

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