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

class TypeExpecter<X extends core::Object? = dynamic> extends core::Object {
  synthetic constructor •() → self::TypeExpecter<self::TypeExpecter::X%>
    : super core::Object::•()
    ;
  method checkType<Y extends core::Object? = dynamic>(dynamic value) → self::TypeExpecter::checkType::Y% {
    if(!(self::TypeExpecter::X% =={core::Type::==}{(core::Object) → core::bool} self::TypeExpecter::checkType::Y%)) {
      throw "Expected the captured type (${self::TypeExpecter::checkType::Y%}) to be the same as the passed type (${self::TypeExpecter::X%}).";
    }
    return value as self::TypeExpecter::checkType::Y%;
  }
}
static method test1(core::int? x) → dynamic {
  core::List<core::int> y1 = block {
    final core::List<core::int> #t1 = <core::int>[];
    final core::int? #t2 = x;
    if(!(#t2 == null))
      #t1.{core::List::add}{Invariant}(#t2{core::int}){(core::int) → void};
  } =>#t1;
  self::expectType<core::List<core::int>>(y1);
  core::List<core::int> y2 = block {
    final core::List<core::int> #t3 = <core::int>[1];
    final core::int? #t4 = x;
    if(!(#t4 == null))
      #t3.{core::List::add}{Invariant}(#t4{core::int}){(core::int) → void};
  } =>#t3;
  self::expectType<core::List<core::int>>(y2);
  core::List<core::num> y3 = block {
    final core::List<core::num> #t5 = <core::num>[1.0];
    final core::num? #t6 = x;
    if(!(#t6 == null))
      #t5.{core::List::add}{Invariant}(#t6{core::num}){(core::num) → void};
  } =>#t5;
  self::expectType<core::List<core::num>>(y3);
}
static method test2(dynamic x) → dynamic {
  core::List<core::String> y1 = block {
    final core::List<core::String> #t7 = <core::String>[];
    final core::String? #t8 = new self::TypeExpecter::•<core::String?>().{self::TypeExpecter::checkType}<core::String?>(x){(dynamic) → core::String?};
    if(!(#t8 == null))
      #t7.{core::List::add}{Invariant}(#t8{core::String}){(core::String) → void};
  } =>#t7;
  core::List<core::String> y2 = block {
    final core::List<core::String> #t9 = <core::String>[""];
    final core::String? #t10 = new self::TypeExpecter::•<core::String?>().{self::TypeExpecter::checkType}<core::String?>(x){(dynamic) → core::String?};
    if(!(#t10 == null))
      #t9.{core::List::add}{Invariant}(#t10{core::String}){(core::String) → void};
  } =>#t9;
  core::List<dynamic> y3 = block {
    final core::List<dynamic> #t11 = <dynamic>[""];
    final dynamic #t12 = new self::TypeExpecter::•<dynamic>().{self::TypeExpecter::checkType}<dynamic>(x){(dynamic) → dynamic};
    if(!(#t12 == null))
      #t11.{core::List::add}{Invariant}(#t12){(dynamic) → void};
  } =>#t11;
}
static method test3(core::String? key) → dynamic {
  core::Map<core::String, core::bool> y1 = block {
    final core::Map<core::String, core::bool> #t13 = <core::String, core::bool>{};
    final core::String? #t14 = key;
    if(!(#t14 == null))
      #t13.{core::Map::[]=}{Invariant}(#t14{core::String}, false){(core::String, core::bool) → void};
  } =>#t13;
  self::expectType<core::Map<core::String, core::bool>>(y1);
  core::Map<core::String, core::bool> y2 = block {
    final core::Map<core::String, core::bool> #t15 = <core::String, core::bool>{};
    #t15.{core::Map::[]=}{Invariant}("", false){(core::String, core::bool) → void};
    final core::String? #t16 = key;
    if(!(#t16 == null))
      #t15.{core::Map::[]=}{Invariant}(#t16{core::String}, false){(core::String, core::bool) → void};
  } =>#t15;
  self::expectType<core::Map<core::String, core::bool>>(y2);
  core::Map<core::Object, core::bool> y3 = block {
    final core::Map<core::Object, core::bool> #t17 = <core::Object, core::bool>{};
    #t17.{core::Map::[]=}{Invariant}(0, false){(core::Object, core::bool) → void};
    final core::Object? #t18 = key;
    if(!(#t18 == null))
      #t17.{core::Map::[]=}{Invariant}(#t18{core::Object}, false){(core::Object, core::bool) → void};
  } =>#t17;
  self::expectType<core::Map<core::Object?, core::bool>>(y3);
}
static method test4(dynamic key) → dynamic {
  core::Map<core::Symbol, core::num> y1 = block {
    final core::Map<core::Symbol, core::num> #t19 = <core::Symbol, core::num>{};
    final core::Symbol? #t20 = new self::TypeExpecter::•<core::Symbol?>().{self::TypeExpecter::checkType}<core::Symbol?>(key){(dynamic) → core::Symbol?};
    if(!(#t20 == null))
      #t19.{core::Map::[]=}{Invariant}(#t20{core::Symbol}, 1.0){(core::Symbol, core::num) → void};
  } =>#t19;
  core::Map<core::Symbol, core::num> y2 = block {
    final core::Map<core::Symbol, core::num> #t21 = <core::Symbol, core::num>{};
    #t21.{core::Map::[]=}{Invariant}(#C1, 1.0){(core::Symbol, core::num) → void};
    final core::Symbol? #t22 = new self::TypeExpecter::•<core::Symbol?>().{self::TypeExpecter::checkType}<core::Symbol?>(key){(dynamic) → core::Symbol?};
    if(!(#t22 == null))
      #t21.{core::Map::[]=}{Invariant}(#t22{core::Symbol}, 1.0){(core::Symbol, core::num) → void};
  } =>#t21;
  core::Map<dynamic, core::double> y3 = block {
    final core::Map<dynamic, core::double> #t23 = <dynamic, core::double>{};
    #t23.{core::Map::[]=}{Invariant}(#C1, 1.0){(dynamic, core::double) → void};
    final dynamic #t24 = new self::TypeExpecter::•<dynamic>().{self::TypeExpecter::checkType}<dynamic>(key){(dynamic) → dynamic};
    if(!(#t24 == null))
      #t23.{core::Map::[]=}{Invariant}(#t24, 1.0){(dynamic, core::double) → void};
  } =>#t23;
}
static method test5(core::String? value) → dynamic {
  core::Map<core::bool, core::String> y1 = block {
    final core::Map<core::bool, core::String> #t25 = <core::bool, core::String>{};
    final core::bool #t26 = false;
    final core::String? #t27 = value;
    if(!(#t27 == null))
      #t25.{core::Map::[]=}{Invariant}(#t26, #t27{core::String}){(core::bool, core::String) → void};
  } =>#t25;
  self::expectType<core::Map<core::bool, core::String>>(y1);
  core::Map<core::bool, core::String> y2 = block {
    final core::Map<core::bool, core::String> #t28 = <core::bool, core::String>{};
    #t28.{core::Map::[]=}{Invariant}(false, ""){(core::bool, core::String) → void};
    final core::bool #t29 = true;
    final core::String? #t30 = value;
    if(!(#t30 == null))
      #t28.{core::Map::[]=}{Invariant}(#t29, #t30{core::String}){(core::bool, core::String) → void};
  } =>#t28;
  self::expectType<core::Map<core::bool, core::String>>(y2);
  core::Map<core::bool, core::Object> y3 = block {
    final core::Map<core::bool, core::Object> #t31 = <core::bool, core::Object>{};
    #t31.{core::Map::[]=}{Invariant}(false, 0){(core::bool, core::Object) → void};
    final core::bool #t32 = true;
    final core::Object? #t33 = value;
    if(!(#t33 == null))
      #t31.{core::Map::[]=}{Invariant}(#t32, #t33{core::Object}){(core::bool, core::Object) → void};
  } =>#t31;
  self::expectType<core::Map<core::bool, core::Object?>>(y3);
}
static method test6(dynamic value) → dynamic {
  core::Map<core::int, core::Symbol> y1 = block {
    final core::Map<core::int, core::Symbol> #t34 = <core::int, core::Symbol>{};
    final core::int #t35 = 0;
    final core::Symbol? #t36 = new self::TypeExpecter::•<core::Symbol?>().{self::TypeExpecter::checkType}<core::Symbol?>(value){(dynamic) → core::Symbol?};
    if(!(#t36 == null))
      #t34.{core::Map::[]=}{Invariant}(#t35, #t36{core::Symbol}){(core::int, core::Symbol) → void};
  } =>#t34;
  core::Map<core::int, core::Symbol> y2 = block {
    final core::Map<core::int, core::Symbol> #t37 = <core::int, core::Symbol>{};
    #t37.{core::Map::[]=}{Invariant}(0, #C1){(core::int, core::Symbol) → void};
    final core::int #t38 = 1;
    final core::Symbol? #t39 = new self::TypeExpecter::•<core::Symbol?>().{self::TypeExpecter::checkType}<core::Symbol?>(value){(dynamic) → core::Symbol?};
    if(!(#t39 == null))
      #t37.{core::Map::[]=}{Invariant}(#t38, #t39{core::Symbol}){(core::int, core::Symbol) → void};
  } =>#t37;
  core::Map<core::int, dynamic> y3 = block {
    final core::Map<core::int, dynamic> #t40 = <core::int, dynamic>{};
    #t40.{core::Map::[]=}{Invariant}(0, #C1){(core::int, dynamic) → void};
    final core::int #t41 = 1;
    final dynamic #t42 = new self::TypeExpecter::•<dynamic>().{self::TypeExpecter::checkType}<dynamic>(value){(dynamic) → dynamic};
    if(!(#t42 == null))
      #t40.{core::Map::[]=}{Invariant}(#t41, #t42){(core::int, dynamic) → void};
  } =>#t40;
}
static method test7(core::int? key, core::Symbol? value) → dynamic {
  core::Map<core::int, core::Symbol> y1 = block {
    final core::Map<core::int, core::Symbol> #t43 = <core::int, core::Symbol>{};
    final core::int? #t44 = key;
    if(!(#t44 == null)) {
      final core::Symbol? #t45 = value;
      if(!(#t45 == null))
        #t43.{core::Map::[]=}{Invariant}(#t44{core::int}, #t45{core::Symbol}){(core::int, core::Symbol) → void};
    }
  } =>#t43;
  self::expectType<core::Map<core::int, core::Symbol>>(y1);
  core::Map<core::int, core::Symbol> y2 = block {
    final core::Map<core::int, core::Symbol> #t46 = <core::int, core::Symbol>{};
    #t46.{core::Map::[]=}{Invariant}(0, #C2){(core::int, core::Symbol) → void};
    final core::int? #t47 = key;
    if(!(#t47 == null)) {
      final core::Symbol? #t48 = value;
      if(!(#t48 == null))
        #t46.{core::Map::[]=}{Invariant}(#t47{core::int}, #t48{core::Symbol}){(core::int, core::Symbol) → void};
    }
  } =>#t46;
  self::expectType<core::Map<core::int, core::Symbol>>(y2);
  core::Map<core::int, core::Object> y3 = block {
    final core::Map<core::int, core::Object> #t49 = <core::int, core::Object>{};
    #t49.{core::Map::[]=}{Invariant}(0, 1.0){(core::int, core::Object) → void};
    final core::int? #t50 = key;
    if(!(#t50 == null)) {
      final core::Object? #t51 = value;
      if(!(#t51 == null))
        #t49.{core::Map::[]=}{Invariant}(#t50{core::int}, #t51{core::Object}){(core::int, core::Object) → void};
    }
  } =>#t49;
  self::expectType<core::Map<core::int, core::Object?>>(y3);
  core::Map<core::Object, core::Symbol> y4 = block {
    final core::Map<core::Object, core::Symbol> #t52 = <core::Object, core::Symbol>{};
    #t52.{core::Map::[]=}{Invariant}(false, #C2){(core::Object, core::Symbol) → void};
    final core::Object? #t53 = key;
    if(!(#t53 == null)) {
      final core::Symbol? #t54 = value;
      if(!(#t54 == null))
        #t52.{core::Map::[]=}{Invariant}(#t53{core::Object}, #t54{core::Symbol}){(core::Object, core::Symbol) → void};
    }
  } =>#t52;
  self::expectType<core::Map<core::Object?, core::Symbol>>(y4);
}
static method test8(dynamic key, dynamic value) → dynamic {
  core::Map<core::String, core::double> y1 = block {
    final core::Map<core::String, core::double> #t55 = <core::String, core::double>{};
    final core::String? #t56 = new self::TypeExpecter::•<core::String?>().{self::TypeExpecter::checkType}<core::String?>(key){(dynamic) → core::String?};
    if(!(#t56 == null)) {
      final core::double? #t57 = new self::TypeExpecter::•<core::double?>().{self::TypeExpecter::checkType}<core::double?>(value){(dynamic) → core::double?};
      if(!(#t57 == null))
        #t55.{core::Map::[]=}{Invariant}(#t56{core::String}, #t57{core::double}){(core::String, core::double) → void};
    }
  } =>#t55;
  core::Map<core::String, core::double> y2 = block {
    final core::Map<core::String, core::double> #t58 = <core::String, core::double>{};
    #t58.{core::Map::[]=}{Invariant}("", 1.0){(core::String, core::double) → void};
    final core::String? #t59 = new self::TypeExpecter::•<core::String?>().{self::TypeExpecter::checkType}<core::String?>(key){(dynamic) → core::String?};
    if(!(#t59 == null)) {
      final core::double? #t60 = new self::TypeExpecter::•<core::double?>().{self::TypeExpecter::checkType}<core::double?>(value){(dynamic) → core::double?};
      if(!(#t60 == null))
        #t58.{core::Map::[]=}{Invariant}(#t59{core::String}, #t60{core::double}){(core::String, core::double) → void};
    }
  } =>#t58;
  core::Map<dynamic, dynamic> y3 = block {
    final core::Map<dynamic, dynamic> #t61 = <dynamic, dynamic>{};
    #t61.{core::Map::[]=}{Invariant}("", 1.0){(dynamic, dynamic) → void};
    final dynamic #t62 = new self::TypeExpecter::•<dynamic>().{self::TypeExpecter::checkType}<dynamic>(key){(dynamic) → dynamic};
    if(!(#t62 == null)) {
      final dynamic #t63 = new self::TypeExpecter::•<dynamic>().{self::TypeExpecter::checkType}<dynamic>(value){(dynamic) → dynamic};
      if(!(#t63 == null))
        #t61.{core::Map::[]=}{Invariant}(#t62, #t63){(dynamic, dynamic) → void};
    }
  } =>#t61;
}
static method main() → dynamic {
  self::test1(0);
  self::test1(null);
  self::test2("element");
  self::test2(null);
  self::expectThrows<core::TypeError>(() → void {
    self::test2(0);
  });
  self::test3("key");
  self::test3(null);
  self::test4(#C3);
  self::test4(null);
  self::expectThrows<core::TypeError>(() → void {
    self::test4("foo");
  });
  self::test5("value");
  self::test5(null);
  self::test6(#C3);
  self::test6(null);
  self::expectThrows<core::TypeError>(() → void {
    self::test6("foo");
  });
  self::test7(0, #C2);
  self::test7(0, null);
  self::test7(null, #C2);
  self::test7(null, null);
  self::test8("key", 1.0);
  self::test8("key", null);
  self::test8(null, 1.0);
  self::test8(null, null);
  self::expectThrows<core::TypeError>(() → void {
    self::test8(#C1, 1.0);
  });
  self::expectThrows<core::TypeError>(() → void {
    self::test8("key", "value");
  });
  self::expectThrows<core::TypeError>(() → void {
    self::test8(#C1, "value");
  });
}
static method expectType<T extends core::Object? = dynamic>(dynamic x) → dynamic {
  if(!(x is self::expectType::T%)) {
    throw "Expected the passed value to be of type 'T', got '${x.{core::Object::runtimeType}{<object>}.{core::Type}}'.";
  }
}
static method expectThrows<T extends core::Object? = dynamic>(() → void f) → dynamic {
  core::bool hasThrownT = true;
  try {
    f(){() → void};
    hasThrownT = false;
  }
  on self::expectThrows::T% catch(no-exception-var) {
    hasThrownT = true;
  }
  on dynamic catch(no-exception-var) {
    hasThrownT = false;
  }
  if(!hasThrownT) {
    throw "Expected the passed function to throw.";
  }
}

constants  {
  #C1 = #key
  #C2 = #value
  #C3 = #foo
}
