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

typedef Asserter<contravariant T extends core::Object? = dynamic> = (T%) → void;
typedef AsserterBuilder<contravariant S extends core::Object? = dynamic, contravariant T extends core::Object? = dynamic> = (S%) → (T%) → void;
class DartType extends core::Object {
  synthetic constructor •() → self::DartType
    : super core::Object::•()
    ;
}
abstract class C extends core::Object {
  static field (core::List<(self::DartType) → void>) → (self::DartType) → void assertBOf = throw "";
  field (core::List<(self::DartType) → void>) → (self::DartType) → void assertAOf = throw "";
  synthetic constructor •() → self::C
    : super core::Object::•()
    ;
  static get assertCOf() → (core::List<(self::DartType) → void>) → (self::DartType) → void
    return throw "";
  get assertDOf() → (core::List<(self::DartType) → void>) → (self::DartType) → void
    return throw "";
  method method((core::List<(self::DartType) → void>) → (self::DartType) → void assertEOf) → dynamic {
    let final core::List<(self::DartType) → void> #t1 = <(self::DartType) → void>[self::_isInt, self::_isString] in this.{self::C::assertAOf}{(core::List<(self::DartType) → void>) → (self::DartType) → void}(#t1){(core::List<(self::DartType) → void>) → (self::DartType) → void};
    self::C::assertBOf(<(self::DartType) → void>[self::_isInt, self::_isString]){(core::List<(self::DartType) → void>) → (self::DartType) → void};
    self::C::assertCOf(<(self::DartType) → void>[self::_isInt, self::_isString]){(core::List<(self::DartType) → void>) → (self::DartType) → void};
    let final core::List<(self::DartType) → void> #t2 = <(self::DartType) → void>[self::_isInt, self::_isString] in this.{self::C::assertDOf}{(core::List<(self::DartType) → void>) → (self::DartType) → void}(#t2){(core::List<(self::DartType) → void>) → (self::DartType) → void};
    assertEOf(<(self::DartType) → void>[self::_isInt, self::_isString]){(core::List<(self::DartType) → void>) → (self::DartType) → void};
  }
}
abstract class G<T extends core::Object? = dynamic> extends core::Object {
  field (core::List<(self::DartType) → void>) → (self::DartType) → void assertAOf = throw "";
  synthetic constructor •() → self::G<self::G::T%>
    : super core::Object::•()
    ;
  get assertDOf() → (core::List<(self::DartType) → void>) → (self::DartType) → void
    return throw "";
  method method((core::List<(self::DartType) → void>) → (self::DartType) → void assertEOf) → dynamic {
    let final core::List<(self::DartType) → void> #t3 = <(self::DartType) → void>[self::_isInt, self::_isString] in this.{self::G::assertAOf}{(core::List<(self::DartType) → void>) → (self::DartType) → void}(#t3){(core::List<(self::DartType) → void>) → (self::DartType) → void};
    let final core::List<(self::DartType) → void> #t4 = <(self::DartType) → void>[self::_isInt, self::_isString] in this.{self::G::assertAOf}{(core::List<(self::DartType) → void>) → (self::DartType) → void}(#t4){(core::List<(self::DartType) → void>) → (self::DartType) → void};
    let final core::List<(self::DartType) → void> #t5 = <(self::DartType) → void>[self::_isInt, self::_isString] in this.{self::G::assertDOf}{(core::List<(self::DartType) → void>) → (self::DartType) → void}(#t5){(core::List<(self::DartType) → void>) → (self::DartType) → void};
    assertEOf(<(self::DartType) → void>[self::_isInt, self::_isString]){(core::List<(self::DartType) → void>) → (self::DartType) → void};
  }
}
static field (self::DartType) → void _isInt = throw "";
static field (self::DartType) → void _isString = throw "";
static field (core::List<(self::DartType) → void>) → (self::DartType) → void assertBOf = throw "";
static get assertCOf() → (core::List<(self::DartType) → void>) → (self::DartType) → void
  return throw "";
static method test() → dynamic {
  (core::List<(self::DartType) → void>) → (self::DartType) → void assertAOf = throw "";
  assertAOf(<(self::DartType) → void>[self::_isInt, self::_isString]){(core::List<(self::DartType) → void>) → (self::DartType) → void};
  self::assertBOf(<(self::DartType) → void>[self::_isInt, self::_isString]){(core::List<(self::DartType) → void>) → (self::DartType) → void};
  self::assertCOf(<(self::DartType) → void>[self::_isInt, self::_isString]){(core::List<(self::DartType) → void>) → (self::DartType) → void};
  self::C::assertBOf(<(self::DartType) → void>[self::_isInt, self::_isString]){(core::List<(self::DartType) → void>) → (self::DartType) → void};
  self::C::assertCOf(<(self::DartType) → void>[self::_isInt, self::_isString]){(core::List<(self::DartType) → void>) → (self::DartType) → void};
  self::C c = throw "";
  let final self::C #t6 = c in let final core::List<(self::DartType) → void> #t7 = <(self::DartType) → void>[self::_isInt, self::_isString] in #t6.{self::C::assertAOf}{(core::List<(self::DartType) → void>) → (self::DartType) → void}(#t7){(core::List<(self::DartType) → void>) → (self::DartType) → void};
  let final self::C #t8 = c in let final core::List<(self::DartType) → void> #t9 = <(self::DartType) → void>[self::_isInt, self::_isString] in #t8.{self::C::assertDOf}{(core::List<(self::DartType) → void>) → (self::DartType) → void}(#t9){(core::List<(self::DartType) → void>) → (self::DartType) → void};
  self::G<core::int> g = throw "";
  let final self::G<core::int> #t10 = g in let final core::List<(self::DartType) → void> #t11 = <(self::DartType) → void>[self::_isInt, self::_isString] in #t10.{self::G::assertAOf}{(core::List<(self::DartType) → void>) → (self::DartType) → void}(#t11){(core::List<(self::DartType) → void>) → (self::DartType) → void};
  let final self::G<core::int> #t12 = g in let final core::List<(self::DartType) → void> #t13 = <(self::DartType) → void>[self::_isInt, self::_isString] in #t12.{self::G::assertDOf}{(core::List<(self::DartType) → void>) → (self::DartType) → void}(#t13){(core::List<(self::DartType) → void>) → (self::DartType) → void};
}
static method main() → dynamic {}
