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>
    : self::Foo::quux = quux, self::Foo::t = t, super core::Object::•()
    ;
  method call() → asy::Future<self::Foo::T>
    return this.{self::Foo::quux}().{asy::Future::then}<self::Foo::T>((dynamic _) → self::Foo::T => this.{self::Foo::t});
}
class Bar extends core::Object {
  field self::Foo<self::Baz> qux = null;
  synthetic constructor •() → self::Bar
    : super core::Object::•()
    ;
  method quuz() → asy::Future<void>
    return this.{self::Bar::qux}().{asy::Future::then}<self::Grault>((self::Baz baz) → self::Grault => this.{self::Bar::corge}(baz)).{asy::Future::then}<void>((self::Grault grault) → void => this.{self::Bar::garply}(grault));
  method corge(self::Baz baz) → self::Grault
    return null;
  method garply(self::Grault grault) → void {}
}
class Baz extends core::Object {
  synthetic constructor •() → self::Baz
    : super core::Object::•()
    ;
}
class Grault extends core::Object {
  synthetic constructor •() → self::Grault
    : super core::Object::•()
    ;
}
static method main() → dynamic {}
