library;
//
// Problems in library:
//
// pkg/front_end/testcases/rasta/unresolved_for_in.dart:12:13: Warning: Getter not found: 'key'.
//       print(key);
//             ^^^
//
// pkg/front_end/testcases/rasta/unresolved_for_in.dart:11:10: Warning: Setter not found: 'key'.
//     for (key in x) {
//          ^^^
//
// pkg/front_end/testcases/rasta/unresolved_for_in.dart:14:10: Warning: Setter not found: 'Fisk'.
//     for (Fisk in x) {
//          ^^^^
//
// pkg/front_end/testcases/rasta/unresolved_for_in.dart:18:13: Error: A prefix can't be used as an expression.
//       print(collection);
//             ^^^^^^^^^^
//
// pkg/front_end/testcases/rasta/unresolved_for_in.dart:17:10: Error: A prefix can't be used as an expression.
//     for (collection in x) {
//          ^^^^^^^^^^
//
// pkg/front_end/testcases/rasta/unresolved_for_in.dart:20:10: Warning: Setter not found: 'VoidFunction'.
//     for (VoidFunction in x) {
//          ^^^^^^^^^^^^
//
// pkg/front_end/testcases/rasta/unresolved_for_in.dart:23:10: Error: Expected an identifier, but got '1'.
//     for (1 in x) {
//          ^
//
// pkg/front_end/testcases/rasta/unresolved_for_in.dart:24:13: Warning: Getter not found: 'key'.
//       print(key);
//             ^^^
//
// pkg/front_end/testcases/rasta/unresolved_for_in.dart:23:10: Error: Can't assign to this, so it can't be used in a for-in loop.
//     for (1 in x) {
//          ^
//
// pkg/front_end/testcases/rasta/unresolved_for_in.dart:32:11: Warning: Getter not found: 'key'.
//     print(key);
//           ^^^
//
// pkg/front_end/testcases/rasta/unresolved_for_in.dart:31:8: Warning: Setter not found: 'key'.
//   for (key in arguments) {
//        ^^^
//
// pkg/front_end/testcases/rasta/unresolved_for_in.dart:34:8: Warning: Setter not found: 'Fisk'.
//   for (Fisk in arguments) {
//        ^^^^
//
// pkg/front_end/testcases/rasta/unresolved_for_in.dart:38:11: Error: A prefix can't be used as an expression.
//     print(collection);
//           ^^^^^^^^^^
//
// pkg/front_end/testcases/rasta/unresolved_for_in.dart:37:8: Error: A prefix can't be used as an expression.
//   for (collection in arguments) {
//        ^^^^^^^^^^
//
// pkg/front_end/testcases/rasta/unresolved_for_in.dart:40:8: Warning: Setter not found: 'VoidFunction'.
//   for (VoidFunction in arguments) {
//        ^^^^^^^^^^^^
//
// pkg/front_end/testcases/rasta/unresolved_for_in.dart:43:8: Error: Expected an identifier, but got '1'.
//   for (1 in arguments) {
//        ^
//
// pkg/front_end/testcases/rasta/unresolved_for_in.dart:44:11: Warning: Getter not found: 'key'.
//     print(key);
//           ^^^
//
// pkg/front_end/testcases/rasta/unresolved_for_in.dart:43:8: Error: Can't assign to this, so it can't be used in a for-in loop.
//   for (1 in arguments) {
//        ^
//
import self as self;
import "dart:core" as core;

typedef VoidFunction = () → void;
class Fisk extends core::Object {
  synthetic constructor •() → self::Fisk
    : super core::Object::•()
    ;
  method it1(dynamic x) → dynamic {
    for (final dynamic #t1 in x) {
      this.key = #t1;
      core::print(this.key);
    }
    for (final dynamic #t2 in x) {
      throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#Fisk, 34, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[#t2]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
      core::print(self::Fisk);
    }
    for (final dynamic #t3 in x) {
      invalid-expression "pkg/front_end/testcases/rasta/unresolved_for_in.dart:17:10: Error: A prefix can't be used as an expression.
    for (collection in x) {
         ^^^^^^^^^^";
      core::print(invalid-expression "pkg/front_end/testcases/rasta/unresolved_for_in.dart:18:13: Error: A prefix can't be used as an expression.
      print(collection);
            ^^^^^^^^^^");
    }
    for (final dynamic #t4 in x) {
      throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#VoidFunction, 34, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[#t4]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
      core::print(() → void);
    }
    {
      invalid-expression "pkg/front_end/testcases/rasta/unresolved_for_in.dart:23:10: Error: Can't assign to this, so it can't be used in a for-in loop.
    for (1 in x) {
         ^";
      for (final dynamic #t5 in x) {
        invalid-expression "pkg/front_end/testcases/rasta/unresolved_for_in.dart:23:10: Error: Can't assign to this, so it can't be used in a for-in loop.
    for (1 in x) {
         ^";
        1;
        core::print(this.key);
      }
    }
  }
}
static method main(dynamic arguments) → dynamic {
  new self::Fisk::•();
  for (final dynamic #t6 in arguments) {
    throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#key, 34, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[#t6]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
    core::print(throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#key, 33, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))));
  }
  for (final dynamic #t7 in arguments) {
    throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#Fisk, 34, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[#t7]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
    core::print(self::Fisk);
  }
  for (final dynamic #t8 in arguments) {
    invalid-expression "pkg/front_end/testcases/rasta/unresolved_for_in.dart:37:8: Error: A prefix can't be used as an expression.
  for (collection in arguments) {
       ^^^^^^^^^^";
    core::print(invalid-expression "pkg/front_end/testcases/rasta/unresolved_for_in.dart:38:11: Error: A prefix can't be used as an expression.
    print(collection);
          ^^^^^^^^^^");
  }
  for (final dynamic #t9 in arguments) {
    throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#VoidFunction, 34, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[#t9]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
    core::print(() → void);
  }
  {
    invalid-expression "pkg/front_end/testcases/rasta/unresolved_for_in.dart:43:8: Error: Can't assign to this, so it can't be used in a for-in loop.
  for (1 in arguments) {
       ^";
    for (final dynamic #t10 in arguments) {
      invalid-expression "pkg/front_end/testcases/rasta/unresolved_for_in.dart:43:8: Error: Can't assign to this, so it can't be used in a for-in loop.
  for (1 in arguments) {
       ^";
      1;
      core::print(throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#key, 33, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))));
    }
  }
}
