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 •() → void
    : 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 •() → void
    : 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 •() → void
    : 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 {}
