library;
import self as self;
import "dart:core" as core;
import "dart:collection" as col;

class C<X extends core::Object?, Y extends core::Object> extends core::Object {
  synthetic constructor •() → self::C<self::C::X%, self::C::Y>
    : super core::Object::•()
    ;
  method test(covariant-by-class self::C::X% x, covariant-by-class self::C::Y? y) → dynamic {
    core::Set<core::Object?> v = block {
      final core::Set<core::Object?> #t1 = col::LinkedHashSet::•<core::Object?>();
      #t1.{core::Set::add}{Invariant}(x){(core::Object?) → core::bool};
      #t1.{core::Set::add}{Invariant}(42){(core::Object?) → core::bool};
    } =>#t1;
    core::Set<core::Object?> w = block {
      final core::Set<core::Object?> #t2 = col::LinkedHashSet::•<core::Object?>();
      #t2.{core::Set::add}{Invariant}(42){(core::Object?) → core::bool};
      #t2.{core::Set::add}{Invariant}(x){(core::Object?) → core::bool};
    } =>#t2;
    core::Set<core::Object?> p = block {
      final core::Set<core::Object?> #t3 = col::LinkedHashSet::•<core::Object?>();
      #t3.{core::Set::add}{Invariant}(y){(core::Object?) → core::bool};
      #t3.{core::Set::add}{Invariant}(42){(core::Object?) → core::bool};
    } =>#t3;
    core::Set<core::Object?> q = block {
      final core::Set<core::Object?> #t4 = col::LinkedHashSet::•<core::Object?>();
      #t4.{core::Set::add}{Invariant}(42){(core::Object?) → core::bool};
      #t4.{core::Set::add}{Invariant}(y){(core::Object?) → core::bool};
    } =>#t4;
    self::assertRightSubtype(v);
    self::assertLeftSubtype<core::Set<core::Object?>>(v);
    self::assertRightSubtype(w);
    self::assertLeftSubtype<core::Set<core::Object?>>(w);
    self::assertRightSubtype(p);
    self::assertLeftSubtype<core::Set<core::Object?>>(p);
    self::assertRightSubtype(q);
    self::assertLeftSubtype<core::Set<core::Object?>>(q);
    if(x is core::Object?) {
      core::Set<core::Object?> v = block {
        final core::Set<core::Object?> #t5 = col::LinkedHashSet::•<core::Object?>();
        #t5.{core::Set::add}{Invariant}(x{self::C::X% & core::Object? /* '%' & '?' = '%' */}){(core::Object?) → core::bool};
        #t5.{core::Set::add}{Invariant}(42){(core::Object?) → core::bool};
      } =>#t5;
      core::Set<core::Object?> w = block {
        final core::Set<core::Object?> #t6 = col::LinkedHashSet::•<core::Object?>();
        #t6.{core::Set::add}{Invariant}(42){(core::Object?) → core::bool};
        #t6.{core::Set::add}{Invariant}(x{self::C::X% & core::Object? /* '%' & '?' = '%' */}){(core::Object?) → core::bool};
      } =>#t6;
      self::assertRightSubtype(v);
      self::assertLeftSubtype<core::Set<core::Object?>>(v);
      self::assertRightSubtype(w);
      self::assertLeftSubtype<core::Set<core::Object?>>(w);
    }
  }
}
static method assertRightSubtype(dynamic x) → dynamic {
  x as core::Set<core::Object?>;
}
static method assertLeftSubtype<X extends core::Object? = dynamic>(self::assertLeftSubtype::X% x) → dynamic {
  col::LinkedHashSet::•<core::Object?>() as self::assertLeftSubtype::X%;
}
static method main() → dynamic {
  new self::C::•<core::int?, core::int>().{self::C::test}(42, null){(core::int?, core::int?) → dynamic};
  new self::C::•<core::int?, core::int>().{self::C::test}(null, null){(core::int?, core::int?) → dynamic};
}
