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 {
  default constructor •() → void
    : super core::Object::•()
    ;
  get v1() → self::Bar<self::Foo::T>
    return const self::Bar::•<core::Null>();
  get v2() → self::Bar<core::List<self::Foo::T>>
    return const self::Bar::•<core::List<core::Null>>();
  generic-contravariant get v3() → self::Bar<(self::Foo::T) → self::Foo::T>
    return const self::Bar::•<(core::Object) → core::Null>();
  generic-contravariant get v4() → self::Bar<((self::Foo::T) → self::Foo::T) → self::Foo::T>
    return const self::Bar::•<((core::Null) → core::Object) → core::Null>();
  get v5() → core::List<self::Foo::T>
    return const <core::Null>[];
  generic-contravariant get v6() → core::List<(self::Foo::T) → self::Foo::T>
    return const <(core::Object) → core::Null>[];
  get v7() → core::Map<self::Foo::T, self::Foo::T>
    return const <core::Null, core::Null>{};
  generic-contravariant get v8() → core::Map<(self::Foo::T) → self::Foo::T, self::Foo::T>
    return const <(core::Object) → core::Null, core::Null>{};
  generic-contravariant get v9() → core::Map<self::Foo::T, (self::Foo::T) → self::Foo::T>
    return const <core::Null, (core::Object) → core::Null>{};
}
class Bar<T extends core::Object> extends core::Object {
  const constructor •() → void
    : super core::Object::•()
    ;
}
static method main() → dynamic {}
