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

static method nullAwareListSpread(core::List<core::String*>* list) → dynamic {
  list = block {
    final core::List<core::String*>* #t1 = <core::String*>[];
    #t1.{core::List::add}{Invariant}("foo");
    final core::Iterable<core::String*>* #t2 = list;
    if(!#t2.{core::Object::==}(null)) {
      core::Iterator<core::String*>* :sync-for-iterator = #t2.{core::Iterable::iterator};
      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
        final core::String* #t3 = :sync-for-iterator.{core::Iterator::current};
        #t1.{core::List::add}{Invariant}(#t3);
      }
    }
  } =>#t1;
}
static method nullAwareSetSpread(core::Set<core::String*>* set) → dynamic {
  set = block {
    final core::Set<core::String*>* #t4 = new col::_CompactLinkedHashSet::•<core::String*>();
    #t4.{core::Set::add}{Invariant}("foo");
    final core::Iterable<core::String*>* #t5 = set;
    if(!#t5.{core::Object::==}(null)) {
      core::Iterator<core::String*>* :sync-for-iterator = #t5.{core::Iterable::iterator};
      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
        final core::String* #t6 = :sync-for-iterator.{core::Iterator::current};
        #t4.{core::Set::add}{Invariant}(#t6);
      }
    }
  } =>#t4;
}
static method nullAwareMapSpread(core::Map<core::int*, core::String*>* map) → dynamic {
  map = block {
    final core::Map<core::int*, core::String*>* #t7 = <core::int*, core::String*>{};
    #t7.{core::Map::[]=}{Invariant}(0, "foo");
    final core::Map<core::int*, core::String*>* #t8 = map;
    if(!#t8.{core::Object::==}(null)) {
      core::Iterator<core::MapEntry<core::int*, core::String*>>* :sync-for-iterator = #t8.{core::Map::entries}.{core::Iterable::iterator};
      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
        final core::MapEntry<core::int*, core::String*>* #t9 = :sync-for-iterator.{core::Iterator::current};
        #t7.{core::Map::[]=}{Invariant}(#t9.{core::MapEntry::key}, #t9.{core::MapEntry::value});
      }
    }
  } =>#t7;
}
static method main() → dynamic {
  self::nullAwareListSpread(null);
  self::nullAwareSetSpread(null);
  self::nullAwareMapSpread(null);
}
