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

class int extends core::Object {
  synthetic constructor •() → self::int
    : super core::Object::•()
    ;
}
class Object extends core::Object {
  synthetic constructor •() → self::Object
    : super core::Object::•()
    ;
}
class String extends core::Object {
  synthetic constructor •() → self::String
    : super core::Object::•()
    ;
}
class _Enum extends core::Object {
  synthetic constructor •() → self::_Enum
    : super core::Object::•()
    ;
}
class List extends core::Object {
  synthetic constructor •() → self::List
    : super core::Object::•()
    ;
}
class E extends core::_Enum /*isEnum*/  {
  static const field core::List<self::E> values = #C16;
  static const field self::E int = #C3;
  static const field self::E Object = #C6;
  static const field self::E String = #C9;
  static const field self::E _Enum = #C12;
  static const field self::E List = #C15;
  const constructor •(core::int #index, core::String #name) → self::E
    : super core::_Enum::•(#index, #name)
    ;
  method toString() → core::String
    return "E.${this.{core::_Enum::_name}{core::String}}";
}
static method main() → dynamic {}

constants  {
  #C1 = 0
  #C2 = "int"
  #C3 = self::E {index:#C1, _name:#C2}
  #C4 = 1
  #C5 = "Object"
  #C6 = self::E {index:#C4, _name:#C5}
  #C7 = 2
  #C8 = "String"
  #C9 = self::E {index:#C7, _name:#C8}
  #C10 = 3
  #C11 = "_Enum"
  #C12 = self::E {index:#C10, _name:#C11}
  #C13 = 4
  #C14 = "List"
  #C15 = self::E {index:#C13, _name:#C14}
  #C16 = <self::E*>[#C3, #C6, #C9, #C12, #C15]
}


Constructor coverage from constants:
org-dartlang-testcase:///enum_names_from_core.dart:
- E. (from org-dartlang-testcase:///enum_names_from_core.dart:15:6)
- _Enum. (from org-dartlang-sdk:///sdk/lib/core/enum.dart:103:9)
- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
