library;
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;
  enum-element static const field self::E1 one = #C4;
  enum-element 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 _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*/  {
  static const field core::List<self::E2<dynamic, dynamic>> values = #C13;
  final field self::E2::X% foo;
  final field self::E2::Y% bar;
  enum-element static const field self::E2<core::int, core::String> one = #C9;
  enum-element static const field self::E2<core::int, core::String> two = #C10;
  enum-element 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 _enumToString() → 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)
- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart)
- 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)
