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

abstract class M1 extends core::Enum /*isMixinDeclaration*/  {
  method mixedInMethod1(core::int v) → core::int
    return v;
}
abstract class _E&_Enum&M1 extends core::_Enum implements self::M1 /*isAnonymousMixin,isEliminatedMixin,hasConstConstructor*/  {
  const synthetic constructor •(core::int index, core::String _name) → self::_E&_Enum&M1
    : super core::_Enum::•(index, _name)
    ;
  method mixedInMethod1(core::int v) → core::int
    return v;
}
class E extends self::_E&_Enum&M1 /*isEnum*/  {
  static const field core::List<self::E> values = #C10;
  static const field self::E e1 = #C3;
  static const field self::E e2 = #C6;
  static const field self::E e3 = #C9;
  const constructor •(core::int #index, core::String #name) → self::E
    : super self::_E&_Enum&M1::•(#index, #name)
    ;
  method toString() → core::String
    return "E.${this.{core::_Enum::_name}{core::String}}";
}
static method expectEquals(dynamic x, dynamic y) → dynamic {
  if(!(x =={core::Object::==}{(core::Object) → core::bool} y)) {
    throw "Expected ${x} to be equal to ${y}.";
  }
}
static method main() → dynamic {
  self::expectEquals(#C3.{self::E::toString}(){() → core::String}, "E.e1");
}

constants  {
  #C1 = 0
  #C2 = "e1"
  #C3 = self::E {index:#C1, _name:#C2}
  #C4 = 1
  #C5 = "e2"
  #C6 = self::E {index:#C4, _name:#C5}
  #C7 = 2
  #C8 = "e3"
  #C9 = self::E {index:#C7, _name:#C8}
  #C10 = <self::E>[#C3, #C6, #C9]
}


Constructor coverage from constants:
org-dartlang-testcase:///issue48303.dart:
- E. (from org-dartlang-testcase:///issue48303.dart:9:6)
- _E&_Enum&M1. (from org-dartlang-testcase:///issue48303.dart:9: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)
