library test /*isNonNullableByDefault*/;
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 /*hasConstConstructor*/  {
  const constructor •() → self::Bar<self::Bar::T%>
    : super core::Object::•()
    ;
}
static method main() → dynamic {}
