library test;
import self as self;
import "dart:core" as core;

typedef Asserter<T extends core::Object* = dynamic> = (T*) →* void;
typedef AsserterBuilder<S extends core::Object* = dynamic, 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 {
    this.{self::C::assertAOf}(<(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]);
    this.{self::C::assertDOf}(<(self::DartType*) →* void>[self::_isInt, self::_isString]);
    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 {
    this.{self::G::assertAOf}(<(self::DartType*) →* void>[self::_isInt, self::_isString]);
    this.{self::G::assertAOf}(<(self::DartType*) →* void>[self::_isInt, self::_isString]);
    this.{self::G::assertDOf}(<(self::DartType*) →* void>[self::_isInt, self::_isString]);
    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;
  c.{self::C::assertAOf}(<(self::DartType*) →* void>[self::_isInt, self::_isString]);
  c.{self::C::assertDOf}(<(self::DartType*) →* void>[self::_isInt, self::_isString]);
  self::G<core::int*>* g;
  g.{self::G::assertAOf}(<(self::DartType*) →* void>[self::_isInt, self::_isString]);
  g.{self::G::assertDOf}(<(self::DartType*) →* void>[self::_isInt, self::_isString]);
}
static method main() → dynamic {}
