library #lib;
import self as self;
import "dart:core" as core;
import "dart:_interceptors" as _in;

static field core::List<core::int*>* list1 = block {
  final _in::JSArray<core::int*> _list = _in::JSArray::allocateGrowable<core::int*>(10);
  for (core::int i = 0; i.{core::num::<}(10){(core::num) → core::bool}; i = i.{core::num::+}(1){(core::int) →* core::int}) {
    core::int* i = i;
    _list.{_in::JSArray::[]=}{Invariant,BoundsSafe}(i, i){(core::int, core::int*) → void};
  }
} =>_list;
static field core::List<core::int*>* list2 = block {
  final _in::JSArray<core::int*> _list = _in::JSArray::allocateGrowable<core::int*>(10);
  for (core::int i = 0; i.{core::num::<}(10){(core::num) → core::bool}; i = i.{core::num::+}(1){(core::int) →* core::int}) {
    core::int* i = i;
    _list.{_in::JSArray::[]=}{Invariant,BoundsSafe}(i, i){(core::int, core::int*) → void};
  }
} =>_list;
static field core::List<core::int*>* list3 = block {
  final _in::JSArray<core::int*> _list = _in::JSArray::allocateFixed<core::int*>(10);
  for (core::int i = 0; i.{core::num::<}(10){(core::num) → core::bool}; i = i.{core::num::+}(1){(core::int) →* core::int}) {
    core::int* i = i;
    _list.{_in::JSArray::[]=}{Invariant,BoundsSafe}(i, i){(core::int, core::int*) → void};
  }
} =>_list;
static field core::List<core::int*>* list4 = core::List::generate<core::int*>(10, (core::int* i) → core::int* => i, growable: self::someGrowable);
static field core::bool* someGrowable = true;
static method main() → void {
  self::someGrowable = !self::someGrowable;
  core::print(<core::List<core::int*>*>[self::list1, self::list2, self::list3, self::list4]);
}
