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 #C1;
  get v2() → self::Bar<core::List<self::Foo::T*>*>*
    return #C2;
  get v3() → self::Bar<(self::Foo::T*) →* self::Foo::T*>*
    return #C3;
  get v4() → self::Bar<((self::Foo::T*) →* self::Foo::T*) →* self::Foo::T*>*
    return #C4;
  get v5() → core::List<self::Foo::T*>*
    return #C5;
  get v6() → core::List<(self::Foo::T*) →* self::Foo::T*>*
    return #C6;
  get v7() → core::Map<self::Foo::T*, self::Foo::T*>*
    return #C8;
  get v8() → core::Map<(self::Foo::T*) →* self::Foo::T*, self::Foo::T*>*
    return #C9;
  get v9() → core::Map<self::Foo::T*, (self::Foo::T*) →* self::Foo::T*>*
    return #C10;
}
class Bar<T extends core::Object* = dynamic> extends core::Object {
  const constructor •() → self::Bar<self::Bar::T*>*
    : super core::Object::•()
    ;
}
static method main() → dynamic {}

constants  {
  #C1 = self::Bar<core::Null*> {}
  #C2 = self::Bar<core::List<core::Null*>*> {}
  #C3 = self::Bar<(core::Object*) →* core::Null*> {}
  #C4 = self::Bar<((core::Null*) →* core::Object*) →* core::Null*> {}
  #C5 = <core::Null*>[]
  #C6 = <(core::Object*) →* core::Null*>[]
  #C7 = <dynamic>[]
  #C8 = core::_ImmutableMap<core::Null*, core::Null*> {_kvPairs:#C7}
  #C9 = core::_ImmutableMap<(core::Object*) →* core::Null*, core::Null*> {_kvPairs:#C7}
  #C10 = core::_ImmutableMap<core::Null*, (core::Object*) →* core::Null*> {_kvPairs:#C7}
}
