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

class A extends core::Object {
  synthetic constructor •() → self::A
    : super core::Object::•()
    ;
  get foo() → core::String
    return "foo";
}
class B extends core::Object {
  synthetic constructor •() → self::B
    : super core::Object::•()
    ;
  method bar() → core::int
    return 42;
}
abstract class M extends core::Object /*isMixinDeclaration*/  {
  set callOnAssignment(() → void f) → 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 = #C7;
  static const field self::E1 one = #C3;
  static const field self::E1 two = #C6;
  const constructor •(core::int index, core::String name) → self::E1
    : super self::_E1&_Enum&A::•(index, name)
    ;
  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 = #C10;
  static const field self::E2 one = #C8;
  static const field self::E2 two = #C9;
  const constructor •(core::int index, core::String name) → self::E2
    : super self::_E2&_Enum&A&B::•(index, name)
    ;
  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 = #C13;
  static const field self::E3 one = #C11;
  static const field self::E3 two = #C12;
  const constructor •(core::int index, core::String name) → self::E3
    : super self::_E3&_Enum&M::•(index, name)
    ;
  method toString() → core::String
    return "E3.${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}' and '${y}' to be equal.";
  }
}
static method expectThrows(() → void f) → dynamic {
  try {
    f(){() → void};
    throw "Expected function to throw.";
  }
  on core::Object catch(final core::Object e) {
  }
}
static method throwOnCall() → void {
  throw 42;
}
static method main() → dynamic {
  self::expectEquals(#C3.{self::_E1&_Enum&A::foo}{core::String}, "foo");
  self::expectEquals(#C6.{self::_E1&_Enum&A::foo}{core::String}, "foo");
  self::expectEquals(#C8.{self::_E2&_Enum&A::foo}{core::String}, "foo");
  self::expectEquals(#C9.{self::_E2&_Enum&A::foo}{core::String}, "foo");
  self::expectEquals(#C8.{self::_E2&_Enum&A&B::bar}(){() → core::int}, "bar");
  self::expectEquals(#C9.{self::_E2&_Enum&A&B::bar}(){() → core::int}, "bar");
  self::expectThrows(#C11.{self::_E3&_Enum&M::callOnAssignment} = #C14);
  self::expectThrows(#C12.{self::_E3&_Enum&M::callOnAssignment} = #C14);
}

constants  {
  #C1 = 0
  #C2 = "one"
  #C3 = self::E1 {index:#C1, _name:#C2}
  #C4 = 1
  #C5 = "two"
  #C6 = self::E1 {index:#C4, _name:#C5}
  #C7 = <self::E1*>[#C3, #C6]
  #C8 = self::E2 {index:#C1, _name:#C2}
  #C9 = self::E2 {index:#C4, _name:#C5}
  #C10 = <self::E2*>[#C8, #C9]
  #C11 = self::E3 {index:#C1, _name:#C2}
  #C12 = self::E3 {index:#C4, _name:#C5}
  #C13 = <self::E3*>[#C11, #C12]
  #C14 = static-tearoff self::throwOnCall
}


Constructor coverage from constants:
org-dartlang-testcase:///simple_mixins.dart:
- E1. (from org-dartlang-testcase:///simple_mixins.dart:19:6)
- _E1&_Enum&A. (from org-dartlang-testcase:///simple_mixins.dart:19: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)
- E2. (from org-dartlang-testcase:///simple_mixins.dart:21:6)
- _E2&_Enum&A&B. (from org-dartlang-testcase:///simple_mixins.dart:21:6)
- _E2&_Enum&A. (from org-dartlang-testcase:///simple_mixins.dart:21:6)
- E3. (from org-dartlang-testcase:///simple_mixins.dart:23:6)
- _E3&_Enum&M. (from org-dartlang-testcase:///simple_mixins.dart:23:6)
