library /*isNonNullableByDefault*/;
import self as self;
import "dart:core" as core;
import "dart:async" as asy;

import "dart:async";

class B<Y extends core::Object? = dynamic> extends core::Object {
  synthetic constructor •() → self::B<self::B::Y%>
    : super core::Object::•()
    ;
  method bar(generic-covariant-impl asy::FutureOr<self::B::Y%> y) → dynamic {}
}
class A<X extends core::Object? = dynamic> extends core::Object {
  generic-covariant-impl final field self::B<self::A::X%> b = new self::B::•<self::A::X%>();
  synthetic constructor •() → self::A<self::A::X%>
    : super core::Object::•()
    ;
  method foo([generic-covariant-impl asy::FutureOr<self::A::X%>? x = #C1]) → dynamic {
    if(x is{ForNonNullableByDefault} asy::Future<self::A::X%>) {
      this.{self::A::b}.{self::B::bar}(x{asy::Future<self::A::X%>} as{ForNonNullableByDefault} asy::FutureOr<self::A::X%>);
    }
  }
}
class C<T extends core::Object? = dynamic> extends core::Object {
  synthetic constructor •() → self::C<self::C::T%>
    : super core::Object::•()
    ;
  method baz<generic-covariant-impl X extends asy::FutureOr<self::C::T%> = asy::FutureOr<self::C::T%>>(generic-covariant-impl asy::FutureOr<self::C::T%> x) → asy::FutureOr<self::C::T%>
    return x;
}
class D<T extends core::Object? = dynamic> extends self::C<self::D::T%> {
  synthetic constructor •() → self::D<self::D::T%>
    : super self::C::•()
    ;
  method baz<generic-covariant-impl X extends asy::FutureOr<self::D::T%> = asy::FutureOr<self::D::T%>>(generic-covariant-impl asy::FutureOr<self::D::T%> x) → asy::FutureOr<self::D::T%>
    return x;
}
static method main() → dynamic {}

constants  {
  #C1 = null
}
