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> = core::_Enum with self::GM<self::_E&_Enum&GM::T> /*isAnonymousMixin,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> = self::_E&_Enum&GM<self::_E&_Enum&GM&M::S, self::_E&_Enum&GM&M::T> with self::M /*isAnonymousMixin,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
    ;
}
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)
