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

abstract class GM<T extends core::Object? = dynamic> extends core::Enum /*isMixinDeclaration*/  {
}
abstract class M extends core::Object /*isMixinDeclaration*/  {
}
abstract class I extends core::Object {
  synthetic constructor •() → self::I
    : super core::Object::•()
    ;
}
abstract class GI<T extends core::Object? = dynamic> extends core::Object {
  synthetic constructor •() → self::GI<self::GI::T%>
    : super core::Object::•()
    ;
}
abstract class _E&_Enum&GM<S extends core::num, T extends core::num> extends core::_Enum implements self::GM<self::_E&_Enum&GM::T> /*isAnonymousMixin,isEliminatedMixin,hasConstConstructor*/  {
  const synthetic constructor •(core::int index, core::String _name) → self::_E&_Enum&GM<self::_E&_Enum&GM::S, self::_E&_Enum&GM::T>
    : super core::_Enum::•(index, _name)
    ;
}
abstract class _E&_Enum&GM&M<S extends core::num, T extends core::num> extends self::_E&_Enum&GM<self::_E&_Enum&GM&M::S, self::_E&_Enum&GM&M::T> implements self::M /*isAnonymousMixin,isEliminatedMixin,hasConstConstructor*/  {
  const synthetic constructor •(core::int index, core::String _name) → self::_E&_Enum&GM&M<self::_E&_Enum&GM&M::S, self::_E&_Enum&GM&M::T>
    : super self::_E&_Enum&GM::•(index, _name)
    ;
}
class E<S extends core::num, T extends core::num> extends self::_E&_Enum&GM&M<self::E::S, self::E::T> implements self::I, self::GI<self::E::S> /*isEnum*/  {
  static const field core::List<self::E<core::num, core::num>> values = #C4;
  static const field self::E<core::num, core::num> element = #C3;
  const constructor •(core::int index, core::String name) → self::E<self::E::S, self::E::T>
    : super self::_E&_Enum&GM&M::•(index, name)
    ;
  method toString() → core::String
    return "E.${this.{core::_Enum::_name}{core::String}}";
}
static method main() → dynamic {}

constants  {
  #C1 = 0
  #C2 = "element"
  #C3 = self::E<core::num*, core::num*> {index:#C1, _name:#C2}
  #C4 = <self::E<dynamic, dynamic>*>[#C3]
}


Constructor coverage from constants:
org-dartlang-testcase:///supertype_resolved_before_checking.dart:
- E. (from org-dartlang-testcase:///supertype_resolved_before_checking.dart:16:6)
- _E&_Enum&GM&M. (from org-dartlang-testcase:///supertype_resolved_before_checking.dart:16:6)
- _E&_Enum&GM. (from org-dartlang-testcase:///supertype_resolved_before_checking.dart:16: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)
