library test;
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 = null;
  field (core::List<(self::DartType*) →* void>*) →* (self::DartType*) →* void assertAOf = null;
  synthetic constructor •() → self::C*
    : super core::Object::•()
    ;
  static get assertCOf() → (core::List<(self::DartType*) →* void>*) →* (self::DartType*) →* void
    return null;
  abstract get assertDOf() → (core::List<(self::DartType*) →* void>*) →* (self::DartType*) →* void;
  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}.call(#t1);
    self::C::assertBOf.call(<(self::DartType*) →* void>[self::_isInt, self::_isString]);
    self::C::assertCOf.call(<(self::DartType*) →* void>[self::_isInt, self::_isString]);
    let final core::List<(self::DartType*) →* void>* #t2 = <(self::DartType*) →* void>[self::_isInt, self::_isString] in this.{self::C::assertDOf}.call(#t2);
    assertEOf.call(<(self::DartType*) →* void>[self::_isInt, self::_isString]);
  }
}
abstract class G<T extends core::Object* = dynamic> extends core::Object {
  field (core::List<(self::DartType*) →* void>*) →* (self::DartType*) →* void assertAOf = null;
  synthetic constructor •() → self::G<self::G::T*>*
    : super core::Object::•()
    ;
  abstract get assertDOf() → (core::List<(self::DartType*) →* void>*) →* (self::DartType*) →* void;
  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}.call(#t3);
    let final core::List<(self::DartType*) →* void>* #t4 = <(self::DartType*) →* void>[self::_isInt, self::_isString] in this.{self::G::assertAOf}.call(#t4);
    let final core::List<(self::DartType*) →* void>* #t5 = <(self::DartType*) →* void>[self::_isInt, self::_isString] in this.{self::G::assertDOf}.call(#t5);
    assertEOf.call(<(self::DartType*) →* void>[self::_isInt, self::_isString]);
  }
}
static field (self::DartType*) →* void _isInt;
static field (self::DartType*) →* void _isString;
static field (core::List<(self::DartType*) →* void>*) →* (self::DartType*) →* void assertBOf;
static get assertCOf() → (core::List<(self::DartType*) →* void>*) →* (self::DartType*) →* void
  return null;
static method test() → dynamic {
  (core::List<(self::DartType*) →* void>*) →* (self::DartType*) →* void assertAOf;
  assertAOf.call(<(self::DartType*) →* void>[self::_isInt, self::_isString]);
  self::assertBOf.call(<(self::DartType*) →* void>[self::_isInt, self::_isString]);
  self::assertCOf.call(<(self::DartType*) →* void>[self::_isInt, self::_isString]);
  self::C::assertBOf.call(<(self::DartType*) →* void>[self::_isInt, self::_isString]);
  self::C::assertCOf.call(<(self::DartType*) →* void>[self::_isInt, self::_isString]);
  self::C* c;
  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}.call(#t7);
  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}.call(#t9);
  self::G<core::int*>* g;
  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}.call(#t11);
  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}.call(#t13);
}
static method main() → dynamic {}
