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 const self::Bar::•<core::Null>();
  get v2() → self::Bar<core::List<self::Foo::T>>
    return const self::Bar::•<core::List<core::Null>>();
  get v3() → self::Bar<(self::Foo::T) → self::Foo::T>
    return const self::Bar::•<(core::Object) → core::Null>();
  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>[];
  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>{};
  get v8() → core::Map<(self::Foo::T) → self::Foo::T, self::Foo::T>
    return const <(core::Object) → core::Null, core::Null>{};
  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 = dynamic> extends core::Object {
  const constructor •() → self::Bar<self::Bar::T>
    : super core::Object::•()
    ;
}
static method main() → dynamic {}
