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)
