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

abstract class A extends core::Enum {
  synthetic constructor •() → self::A
    : super core::Enum::•()
    ;
  get foo() → core::int
    return this.{core::Enum::index}{core::int};
}
abstract class _EA&_Enum&A = core::_Enum with self::A /*isAnonymousMixin,hasConstConstructor*/  {
  const synthetic constructor •(core::int index, core::String _name) → self::_EA&_Enum&A
    : super core::_Enum::•(index, _name)
    ;
  mixin-super-stub get foo() → core::int
    return super.{self::A::foo};
}
class EA extends self::_EA&_Enum&A /*isEnum*/  {
  static const field core::List<self::EA> values = #C4;
  static const field self::EA element = #C3;
  const constructor •(core::int #index, core::String #name) → self::EA
    : super self::_EA&_Enum&A::•(#index, #name)
    ;
  method toString() → core::String
    return "EA.${this.{core::_Enum::_name}{core::String}}";
}
abstract class B extends core::Object implements core::Enum {
  synthetic constructor •() → self::B
    : super core::Object::•()
    ;
  get foo() → core::int
    return this.{core::Enum::index}{core::int};
}
abstract class _EB&_Enum&B = core::_Enum with self::B /*isAnonymousMixin,hasConstConstructor*/  {
  const synthetic constructor •(core::int index, core::String _name) → self::_EB&_Enum&B
    : super core::_Enum::•(index, _name)
    ;
  mixin-super-stub get foo() → core::int
    return super.{self::B::foo};
}
class EB extends self::_EB&_Enum&B /*isEnum*/  {
  static const field core::List<self::EB> values = #C6;
  static const field self::EB element = #C5;
  const constructor •(core::int #index, core::String #name) → self::EB
    : super self::_EB&_Enum&B::•(#index, #name)
    ;
  method toString() → core::String
    return "EB.${this.{core::_Enum::_name}{core::String}}";
}
abstract class M extends core::Enum /*isMixinDeclaration*/  {
  get foo() → core::int
    return this.{core::Enum::index}{core::int};
}
abstract class _EM&_Enum&M = core::_Enum with self::M /*isAnonymousMixin,hasConstConstructor*/  {
  const synthetic constructor •(core::int index, core::String _name) → self::_EM&_Enum&M
    : super core::_Enum::•(index, _name)
    ;
  mixin-super-stub get foo() → core::int
    return super.{self::M::foo};
}
class EM extends self::_EM&_Enum&M /*isEnum*/  {
  static const field core::List<self::EM> values = #C8;
  static const field self::EM element = #C7;
  const constructor •(core::int #index, core::String #name) → self::EM
    : super self::_EM&_Enum&M::•(#index, #name)
    ;
  method toString() → core::String
    return "EM.${this.{core::_Enum::_name}{core::String}}";
}
abstract class N extends core::Object implements core::Enum /*isMixinDeclaration*/  {
  get foo() → core::int
    return this.{core::Enum::index}{core::int};
}
abstract class _EN&_Enum&N = core::_Enum with self::N /*isAnonymousMixin,hasConstConstructor*/  {
  const synthetic constructor •(core::int index, core::String _name) → self::_EN&_Enum&N
    : super core::_Enum::•(index, _name)
    ;
  mixin-super-stub get foo() → core::int
    return super.{self::N::foo};
}
class EN extends self::_EN&_Enum&N /*isEnum*/  {
  static const field core::List<self::EN> values = #C10;
  static const field self::EN element = #C9;
  const constructor •(core::int #index, core::String #name) → self::EN
    : super self::_EN&_Enum&N::•(#index, #name)
    ;
  method toString() → core::String
    return "EN.${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}' to be equal to '${y}'.";
  }
}
static method main() → dynamic {
  self::expectEquals(#C3.{self::_EA&_Enum&A::foo}{core::int}, #C3.{core::_Enum::index}{core::int});
  self::expectEquals(#C5.{self::_EB&_Enum&B::foo}{core::int}, #C5.{core::_Enum::index}{core::int});
  self::expectEquals(#C7.{self::_EM&_Enum&M::foo}{core::int}, #C7.{core::_Enum::index}{core::int});
  self::expectEquals(#C9.{self::_EN&_Enum&N::foo}{core::int}, #C9.{core::_Enum::index}{core::int});
}

constants  {
  #C1 = 0
  #C2 = "element"
  #C3 = self::EA {index:#C1, _name:#C2}
  #C4 = <self::EA*>[#C3]
  #C5 = self::EB {index:#C1, _name:#C2}
  #C6 = <self::EB*>[#C5]
  #C7 = self::EM {index:#C1, _name:#C2}
  #C8 = <self::EM*>[#C7]
  #C9 = self::EN {index:#C1, _name:#C2}
  #C10 = <self::EN*>[#C9]
}


Constructor coverage from constants:
org-dartlang-testcase:///enum_as_supertype.dart:
- EA. (from org-dartlang-testcase:///enum_as_supertype.dart:9:6)
- _EA&_Enum&A. (from org-dartlang-testcase:///enum_as_supertype.dart:9: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)
- EB. (from org-dartlang-testcase:///enum_as_supertype.dart:15:6)
- _EB&_Enum&B. (from org-dartlang-testcase:///enum_as_supertype.dart:15:6)
- EM. (from org-dartlang-testcase:///enum_as_supertype.dart:21:6)
- _EM&_Enum&M. (from org-dartlang-testcase:///enum_as_supertype.dart:21:6)
- EN. (from org-dartlang-testcase:///enum_as_supertype.dart:27:6)
- _EN&_Enum&N. (from org-dartlang-testcase:///enum_as_supertype.dart:27:6)
