library;
import self as self;
import "dart:core" as core;
import "dart:collection" as col;
import "package:expect/expect.dart" as exp;

import "package:expect/expect.dart";

static method test1(dynamic stringList) → dynamic {
  core::Set<core::int*>* intSet = block {
    final core::Set<core::int*>* #t1 = new col::_CompactLinkedHashSet::•<core::int*>();
    final core::Iterable<dynamic>* #t2 = stringList as{TypeError,ForDynamic} core::Iterable<dynamic>*;
    if(!(#t2 == null)) {
      core::Iterator<dynamic>* :sync-for-iterator = #t2.{core::Iterable::iterator};
      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
        final dynamic #t3 = :sync-for-iterator.{core::Iterator::current};
        {
          final core::int* #t4 = #t3 as{TypeError} core::int*;
          #t1.{core::Set::add}(#t4){(core::int*) →* core::bool*};
        }
      }
    }
  } =>#t1;
}
static method test2(dynamic stringList) → dynamic {
  core::List<core::int*>* intList = block {
    final core::List<core::int*>* #t5 = core::_GrowableList::•<core::int*>(0);
    final core::Iterable<dynamic>* #t6 = stringList as{TypeError,ForDynamic} core::Iterable<dynamic>*;
    if(!(#t6 == null)) {
      core::Iterator<dynamic>* :sync-for-iterator = #t6.{core::Iterable::iterator};
      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
        final dynamic #t7 = :sync-for-iterator.{core::Iterator::current};
        {
          final core::int* #t8 = #t7 as{TypeError} core::int*;
          #t5.{core::List::add}(#t8){(core::int*) →* void};
        }
      }
    }
  } =>#t5;
}
static method test3(dynamic stringMap) → dynamic {
  core::Map<core::int*, core::int*>* intMap = block {
    final core::Map<core::int*, core::int*>* #t9 = <core::int*, core::int*>{};
    final core::Map<dynamic, dynamic>* #t10 = stringMap as{TypeError,ForDynamic} core::Map<dynamic, dynamic>*;
    if(!(#t10 == null)) {
      core::Iterator<core::MapEntry<core::int*, core::int*>>* :sync-for-iterator = #t10.{core::Map::entries}{core::Iterable<core::MapEntry<core::int*, core::int*>>}.{core::Iterable::iterator};
      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
        final core::MapEntry<dynamic, dynamic>* #t11 = :sync-for-iterator.{core::Iterator::current};
        {
          final core::int* #t12 = #t11.{core::MapEntry::key}{dynamic} as{TypeError} core::int*;
          final core::int* #t13 = #t11.{core::MapEntry::value}{dynamic} as{TypeError} core::int*;
          #t9.{core::Map::[]=}(#t12, #t13){(core::int*, core::int*) →* void};
        }
      }
    }
  } =>#t9;
}
static method main() → dynamic {
  dynamic stringList = core::_GrowableList::_literal1<core::String*>("string");
  exp::Expect::throwsTypeError(() → Null {
    self::test1(stringList);
  });
  exp::Expect::throwsTypeError(() → Null {
    self::test2(stringList);
  });
  dynamic stringMap = <core::String*, core::String*>{"a": "b"};
  exp::Expect::throwsTypeError(() → Null {
    self::test3(stringMap);
  });
}
