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 extends core::_Enum implements self::A /*isAnonymousMixin,isEliminatedMixin,hasConstConstructor*/  {
  const synthetic constructor •(core::int index, core::String _name) → self::_E1&_Enum&A
    : super core::_Enum::•(index, _name)
    ;
  get foo() → core::String
    return "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
    ;
}
abstract class _E2&_Enum&A extends core::_Enum implements self::A /*isAnonymousMixin,isEliminatedMixin,hasConstConstructor*/  {
  const synthetic constructor •(core::int index, core::String _name) → self::_E2&_Enum&A
    : super core::_Enum::•(index, _name)
    ;
  get foo() → core::String
    return "foo";
}
abstract class _E2&_Enum&A&B extends self::_E2&_Enum&A implements self::B /*isAnonymousMixin,isEliminatedMixin,hasConstConstructor*/  {
  const synthetic constructor •(core::int index, core::String _name) → self::_E2&_Enum&A&B
    : super self::_E2&_Enum&A::•(index, _name)
    ;
  method bar() → core::int
    return 42;
}
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
    ;
}
abstract class _E3&_Enum&M extends core::_Enum implements self::M /*isAnonymousMixin,isEliminatedMixin,hasConstConstructor*/  {
  const synthetic constructor •(core::int index, core::String _name) → self::_E3&_Enum&M
    : super core::_Enum::•(index, _name)
    ;
  set callOnAssignment(() → void f) → void {
    f(){() → void};
  }
}
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
    ;
}
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)
