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

static method test1(dynamic x) → dynamic
  return block {
    final core::List<core::int> #t1 = core::_GrowableList::_literal1<core::int>(1);
    {
      final synthesized dynamic #0#0 = x;
      synthesized dynamic #0#6;
      synthesized core::bool #0#6#isSet = false;
      {
        hoisted core::int y;
        if(#0#0 is core::List<dynamic> && #0#0{core::List<dynamic>}.{core::List::length}{core::int}.{core::num::>=}(#C1){(core::num) → core::bool} && (#0#6#isSet ?{dynamic} #0#6{dynamic} : let final core::bool #t2 = #0#6#isSet = true in #0#6 = #0#0{core::List<dynamic>}.{core::List::[]}(0){(core::int) → dynamic}) is core::int) {
          y = (#0#6#isSet ?{dynamic} #0#6{dynamic} : let final core::bool #t3 = #0#6#isSet = true in #0#6 = #0#0{core::List<dynamic>}.{core::List::[]}(0){(core::int) → dynamic}) as{Unchecked} core::int;
          #t1.{core::List::add}{Invariant}(y){(core::int) → void};
        }
      }
    }
    #t1.{core::List::add}{Invariant}(1){(core::int) → void};
  } =>#t1;
static method test2(dynamic x) → dynamic
  return block {
    final core::List<core::Object?> #t4 = core::_GrowableList::_literal1<core::Object?>(2);
    {
      final synthesized dynamic #0#0 = x;
      {
        hoisted core::String y;
        if(#0#0 is core::String) {
          y = #0#0{core::String};
          #t4.{core::List::add}{Invariant}(y){(core::Object?) → void};
        }
        else
          #t4.{core::List::add}{Invariant}(null){(core::Object?) → void};
      }
    }
    #t4.{core::List::add}{Invariant}(2){(core::Object?) → void};
  } =>#t4;
static method test3(dynamic x) → dynamic
  return block {
    final core::List<core::Object> #t5 = core::_GrowableList::_literal1<core::Object>(3);
    {
      final synthesized dynamic #0#0 = x;
      {
        hoisted core::bool b;
        if(#0#0 is core::bool && (let final core::bool #t6 = b = #0#0{core::bool} in true) && b)
          #t5.{core::List::add}{Invariant}(b){(core::Object) → void};
      }
    }
    #t5.{core::List::add}{Invariant}(3){(core::Object) → void};
  } =>#t5;
static method main() → dynamic {
  self::expectEquals(self::listToString(self::test1(core::_GrowableList::_literal3<core::int>(0, 1, 2)) as{TypeError,ForDynamic} core::List<dynamic>), self::listToString(core::_GrowableList::_literal3<dynamic>(1, 0, 1)));
  self::expectEquals(self::listToString(self::test1(core::_GrowableList::•<dynamic>(0)) as{TypeError,ForDynamic} core::List<dynamic>), self::listToString(core::_GrowableList::_literal2<dynamic>(1, 1)));
  self::expectEquals(self::listToString(self::test1(core::_GrowableList::_literal1<Null>(null)) as{TypeError,ForDynamic} core::List<dynamic>), self::listToString(core::_GrowableList::_literal2<dynamic>(1, 1)));
  self::expectEquals(self::listToString(self::test2("foo") as{TypeError,ForDynamic} core::List<dynamic>), self::listToString(core::_GrowableList::_literal3<dynamic>(2, "foo", 2)));
  self::expectEquals(self::listToString(self::test2(0) as{TypeError,ForDynamic} core::List<dynamic>), self::listToString(core::_GrowableList::_literal3<dynamic>(2, null, 2)));
  self::expectEquals(self::listToString(self::test3(true) as{TypeError,ForDynamic} core::List<dynamic>), self::listToString(core::_GrowableList::_literal3<dynamic>(3, true, 3)));
  self::expectEquals(self::listToString(self::test3(false) as{TypeError,ForDynamic} core::List<dynamic>), self::listToString(core::_GrowableList::_literal2<dynamic>(3, 3)));
  self::expectEquals(self::listToString(self::test3(null) as{TypeError,ForDynamic} core::List<dynamic>), self::listToString(core::_GrowableList::_literal2<dynamic>(3, 3)));
}
static method expectEquals(dynamic x, dynamic y) → dynamic {
  if(!(x =={core::Object::==}{(core::Object) → core::bool} y)) {
    throw "Expected '${x} (${x.{core::Object::runtimeType}{<object>}.{core::Type}})' to be equal to '${y}' (${y.{core::Object::runtimeType}{<object>}.{core::Type}}).";
  }
}
static method listToString(core::List<dynamic> list) → dynamic {
  return "[${list.{core::Iterable::map}<core::String>((dynamic e) → core::String => e.{core::Object::toString}{<object>}.(){() → core::String}){((dynamic) → core::String) → core::Iterable<core::String>}.{core::Iterable::join}(","){([core::String]) → core::String}}]";
}

constants  {
  #C1 = 1
}
