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)
