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

class E1 extends core::_Enum /*isEnum*/  {
  final field core::int foo;
  static const field core::List<self::E1> values = const <self::E1>[self::E1::one, self::E1::two];
  enum-element static const field self::E1 one = const self::E1::•(0, "one", 1);
  enum-element static const field self::E1 two = const self::E1::named(1, "two", 2);
  const constructor •(core::int #index, core::String #name, core::int foo) → self::E1
    : self::E1::foo = foo, super core::_Enum::•(#index, #name)
    ;
  const constructor named(core::int #index, core::String #name, core::int value) → self::E1
    : self::E1::foo = value, super core::_Enum::•(#index, #name)
    ;
  method _enumToString() → core::String
    return "E1.${this.{core::_Enum::_name}{core::String}}";
}
class E2<X extends core::Object? = dynamic, Y extends core::Object? = dynamic> extends core::_Enum /*isEnum*/  {
  final field self::E2::X% foo;
  final field self::E2::Y% bar;
  static const field core::List<self::E2<dynamic, dynamic>> values = const <self::E2<dynamic, dynamic>>[self::E2::one, self::E2::two, self::E2::three];
  enum-element static const field self::E2<core::int, core::String> one = const self::E2::•<core::int, core::String>(0, "one", 1, "one");
  enum-element static const field self::E2<core::int, core::String> two = const self::E2::named<core::int, core::String>(1, "two", "two", 2);
  enum-element static const field self::E2<core::String, core::String> three = const self::E2::named<core::String, core::String>(2, "three", "three", "three");
  const constructor •(core::int #index, core::String #name, self::E2::X% foo, self::E2::Y% bar) → self::E2<self::E2::X%, self::E2::Y%>
    : self::E2::foo = foo, self::E2::bar = bar, super core::_Enum::•(#index, #name)
    ;
  const constructor named(core::int #index, core::String #name, self::E2::Y% bar, self::E2::X% foo) → self::E2<self::E2::X%, self::E2::Y%>
    : self::E2::bar = bar, self::E2::foo = foo, super core::_Enum::•(#index, #name)
    ;
  method _enumToString() → core::String
    return "E2.${this.{core::_Enum::_name}{core::String}}";
}
static method main() → dynamic
  ;


Extra constant evaluation status:
Evaluated: ListLiteral @ org-dartlang-testcase:///simple_fields.dart:5:6 -> ListConstant(const <E1>[const E1{E1.foo: 1, _Enum.index: 0, _Enum._name: "one"}, const E1{E1.foo: 2, _Enum.index: 1, _Enum._name: "two"}])
Evaluated: ConstructorInvocation @ org-dartlang-testcase:///simple_fields.dart:6:3 -> InstanceConstant(const E1{E1.foo: 1, _Enum.index: 0, _Enum._name: "one"})
Evaluated: ConstructorInvocation @ org-dartlang-testcase:///simple_fields.dart:7:3 -> InstanceConstant(const E1{E1.foo: 2, _Enum.index: 1, _Enum._name: "two"})
Evaluated: ListLiteral @ org-dartlang-testcase:///simple_fields.dart:16:6 -> ListConstant(const <E2<dynamic, dynamic>>[const E2<int, String>{E2.foo: 1, E2.bar: "one", _Enum.index: 0, _Enum._name: "one"}, const E2<int, String>{E2.foo: 2, E2.bar: "two", _Enum.index: 1, _Enum._name: "two"}, const E2<String, String>{E2.foo: "three", E2.bar: "three", _Enum.index: 2, _Enum._name: "three"}])
Evaluated: ConstructorInvocation @ org-dartlang-testcase:///simple_fields.dart:17:3 -> InstanceConstant(const E2<int, String>{E2.foo: 1, E2.bar: "one", _Enum.index: 0, _Enum._name: "one"})
Evaluated: ConstructorInvocation @ org-dartlang-testcase:///simple_fields.dart:18:3 -> InstanceConstant(const E2<int, String>{E2.foo: 2, E2.bar: "two", _Enum.index: 1, _Enum._name: "two"})
Evaluated: ConstructorInvocation @ org-dartlang-testcase:///simple_fields.dart:19:3 -> InstanceConstant(const E2<String, String>{E2.foo: "three", E2.bar: "three", _Enum.index: 2, _Enum._name: "three"})
Extra constant evaluation: evaluated: 27, effectively constant: 7
