library;
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 = core::_Enum with self::M1 /*isAnonymousMixin,hasConstConstructor*/  {
  const synthetic constructor •(core::int index, core::String _name) → self::_E&_Enum&M1
    : super core::_Enum::•(index, _name)
    ;
  mixin-super-stub method mixedInMethod1(core::int v) → core::int
    return super.{self::M1::mixedInMethod1}(v);
}
class E extends self::_E&_Enum&M1 /*isEnum*/  {
  static const field core::List<self::E> values = #C10;
  enum-element static const field self::E e1 = #C3;
  enum-element static const field self::E e2 = #C6;
  enum-element static const field self::E e3 = #C9;
  const synthetic constructor •(core::int #index, core::String #name) → self::E
    : super self::_E&_Enum&M1::•(#index, #name)
    ;
  method _enumToString() → 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.{core::_Enum::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)
- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart)
