library /*isNonNullableByDefault*/;
import self as self;
import "dart:core" as core;

class E1 extends core::_Enum /*isEnum*/  {
  static const field core::List<self::E1> values = #C8;
  final field core::int foo;
  static const field self::E1 one = #C4;
  static const field self::E1 two = #C7;
  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 toString() → 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*/  {
  static const field core::List<self::E2<dynamic, dynamic>> values = #C13;
  final field self::E2::X% foo;
  final field self::E2::Y% bar;
  static const field self::E2<core::int, core::String> one = #C9;
  static const field self::E2<core::int, core::String> two = #C10;
  static const field self::E2<core::String, core::String> three = #C12;
  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 toString() → core::String
    return "E2.${this.{core::_Enum::_name}{core::String}}";
}
static method main() → dynamic {}

constants  {
  #C1 = 1
  #C2 = 0
  #C3 = "one"
  #C4 = self::E1 {foo:#C1, index:#C2, _name:#C3}
  #C5 = 2
  #C6 = "two"
  #C7 = self::E1 {foo:#C5, index:#C1, _name:#C6}
  #C8 = <self::E1>[#C4, #C7]
  #C9 = self::E2<core::int, core::String> {foo:#C1, bar:#C3, index:#C2, _name:#C3}
  #C10 = self::E2<core::int, core::String> {foo:#C5, bar:#C6, index:#C1, _name:#C6}
  #C11 = "three"
  #C12 = self::E2<core::String, core::String> {foo:#C11, bar:#C11, index:#C5, _name:#C11}
  #C13 = <self::E2<dynamic, dynamic>>[#C9, #C10, #C12]
}


Constructor coverage from constants:
org-dartlang-testcase:///simple_fields.dart:
- E1. (from org-dartlang-testcase:///simple_fields.dart:11:9)
- _Enum. (from org-dartlang-sdk:///sdk/lib/core/enum.dart:103:9)
- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
- E1.named (from org-dartlang-testcase:///simple_fields.dart:13:9)
- E2. (from org-dartlang-testcase:///simple_fields.dart:24:9)
- E2.named (from org-dartlang-testcase:///simple_fields.dart:25:9)
