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
    ;
}
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 = const <self::E>[self::E::e1, self::E::e2, self::E::e3];
  static const field self::E e1 = const self::E::•(0, "e1");
  static const field self::E e2 = const self::E::•(1, "e2");
  static const field self::E e3 = const self::E::•(2, "e3");
  const constructor •(core::int #index, core::String #name) → self::E
    ;
  method toString() → core::String
    return "E.${this.{core::_Enum::_name}{core::String}}";
}
static method expectEquals(dynamic x, dynamic y) → dynamic
  ;
static method main() → dynamic
  ;


Extra constant evaluation status:
Evaluated: ListLiteral @ org-dartlang-testcase:///issue48303.dart:9:6 -> ListConstant(const <E*>[const E{}, const E{}, const E{}])
Evaluated: ConstructorInvocation @ org-dartlang-testcase:///issue48303.dart:10:3 -> InstanceConstant(const E{})
Evaluated: ConstructorInvocation @ org-dartlang-testcase:///issue48303.dart:11:3 -> InstanceConstant(const E{})
Evaluated: ConstructorInvocation @ org-dartlang-testcase:///issue48303.dart:12:3 -> InstanceConstant(const E{})
Extra constant evaluation: evaluated: 11, effectively constant: 4
