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

class A extends core::Object {
  synthetic constructor •() → self::A
    ;
  get foo() → core::String
    ;
}
class B extends core::Object {
  synthetic constructor •() → self::B
    ;
  method bar() → core::int
    ;
}
abstract class M extends core::Object /*isMixinDeclaration*/  {
  set callOnAssignment(() → void f) → void
    ;
}
abstract class _E1&_Enum&A = core::_Enum with self::A /*isAnonymousMixin,hasConstConstructor*/  {
  const synthetic constructor •(core::int index, core::String _name) → self::_E1&_Enum&A
    : super core::_Enum::•(index, _name)
    ;
  mixin-super-stub get foo() → core::String
    return super.{self::A::foo};
}
class E1 extends self::_E1&_Enum&A /*isEnum*/  {
  static const field core::List<self::E1> values = const <self::E1>[self::E1::one, self::E1::two];
  static const field self::E1 one = const self::E1::•(0, "one");
  static const field self::E1 two = const self::E1::•(1, "two");
  const constructor •(core::int #index, core::String #name) → self::E1
    ;
  method toString() → core::String
    return "E1.${this.{core::_Enum::_name}{core::String}}";
}
abstract class _E2&_Enum&A = core::_Enum with self::A /*isAnonymousMixin,hasConstConstructor*/  {
  const synthetic constructor •(core::int index, core::String _name) → self::_E2&_Enum&A
    : super core::_Enum::•(index, _name)
    ;
  mixin-super-stub get foo() → core::String
    return super.{self::A::foo};
}
abstract class _E2&_Enum&A&B = self::_E2&_Enum&A with self::B /*isAnonymousMixin,hasConstConstructor*/  {
  const synthetic constructor •(core::int index, core::String _name) → self::_E2&_Enum&A&B
    : super self::_E2&_Enum&A::•(index, _name)
    ;
  mixin-super-stub method bar() → core::int
    return super.{self::B::bar}();
}
class E2 extends self::_E2&_Enum&A&B /*isEnum*/  {
  static const field core::List<self::E2> values = const <self::E2>[self::E2::one, self::E2::two];
  static const field self::E2 one = const self::E2::•(0, "one");
  static const field self::E2 two = const self::E2::•(1, "two");
  const constructor •(core::int #index, core::String #name) → self::E2
    ;
  method toString() → core::String
    return "E2.${this.{core::_Enum::_name}{core::String}}";
}
abstract class _E3&_Enum&M = core::_Enum with self::M /*isAnonymousMixin,hasConstConstructor*/  {
  const synthetic constructor •(core::int index, core::String _name) → self::_E3&_Enum&M
    : super core::_Enum::•(index, _name)
    ;
  mixin-super-stub set callOnAssignment(() → void f) → void
    return super.{self::M::callOnAssignment} = f;
}
class E3 extends self::_E3&_Enum&M /*isEnum*/  {
  static const field core::List<self::E3> values = const <self::E3>[self::E3::one, self::E3::two];
  static const field self::E3 one = const self::E3::•(0, "one");
  static const field self::E3 two = const self::E3::•(1, "two");
  const constructor •(core::int #index, core::String #name) → self::E3
    ;
  method toString() → core::String
    return "E3.${this.{core::_Enum::_name}{core::String}}";
}
static method expectEquals(dynamic x, dynamic y) → dynamic
  ;
static method expectThrows(() → void f) → dynamic
  ;
static method throwOnCall() → void
  ;
static method main() → dynamic
  ;


Extra constant evaluation status:
Evaluated: ListLiteral @ org-dartlang-testcase:///simple_mixins.dart:19:6 -> ListConstant(const <E1*>[const E1{}, const E1{}])
Evaluated: ConstructorInvocation @ org-dartlang-testcase:///simple_mixins.dart:19:18 -> InstanceConstant(const E1{})
Evaluated: ConstructorInvocation @ org-dartlang-testcase:///simple_mixins.dart:19:23 -> InstanceConstant(const E1{})
Evaluated: ListLiteral @ org-dartlang-testcase:///simple_mixins.dart:21:6 -> ListConstant(const <E2*>[const E2{}, const E2{}])
Evaluated: ConstructorInvocation @ org-dartlang-testcase:///simple_mixins.dart:21:21 -> InstanceConstant(const E2{})
Evaluated: ConstructorInvocation @ org-dartlang-testcase:///simple_mixins.dart:21:26 -> InstanceConstant(const E2{})
Evaluated: ListLiteral @ org-dartlang-testcase:///simple_mixins.dart:23:6 -> ListConstant(const <E3*>[const E3{}, const E3{}])
Evaluated: ConstructorInvocation @ org-dartlang-testcase:///simple_mixins.dart:23:18 -> InstanceConstant(const E3{})
Evaluated: ConstructorInvocation @ org-dartlang-testcase:///simple_mixins.dart:23:23 -> InstanceConstant(const E3{})
Extra constant evaluation: evaluated: 31, effectively constant: 9
