library;
import self as self;
import "dart:core" as core;
import "dart:async" as asy;

class Foo<T extends core::Object* = dynamic> extends core::Object {
  final field () →* asy::Future<dynamic>* quux;
  generic-covariant-impl field self::Foo::T* t;
  constructor •(() →* asy::Future<dynamic>* quux, self::Foo::T* t) → self::Foo<self::Foo::T*>*
    ;
  method call() → asy::Future<self::Foo::T*>*
    ;
}
class Bar extends core::Object {
  field self::Foo<self::Baz*>* qux;
  synthetic constructor •() → self::Bar*
    ;
  method quuz() → asy::Future<void>*
    ;
  method corge(self::Baz* baz) → self::Grault*
    ;
  method garply(self::Grault* grault) → void
    ;
}
class Baz extends core::Object {
  synthetic constructor •() → self::Baz*
    ;
}
class Grault extends core::Object {
  synthetic constructor •() → self::Grault*
    ;
}
static method main() → dynamic
  ;
