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

class E extends core::_Enum /*isEnum*/  {
  static const field core::List<self::E> values = #C9;
  static const field self::E one = #C5;
  static const field self::E two = #C8;
  final field core::int foo;
  final field core::int bar = 42;
  static field self::E staticFoo = self::E::f();
  const constructor •(core::int index, core::String name, core::int foo) → self::E
    : self::E::foo = foo, super core::_Enum::•(index, name)
    ;
  method toString() → core::String
    return "E.${this.{core::_Enum::_name}{core::String}}";
  static factory f() → self::E
    return #C5;
  method method(core::int value) → core::int
    return value.{core::num::+}(10){(core::num) → core::int};
  method staticMethod(core::double d, core::bool b) → core::String
    return "${d}${b}";
}
class E2<X extends core::Object? = dynamic> extends core::_Enum /*isEnum*/  {
  static const field core::List<self::E2<dynamic>> values = #C14;
  static const field self::E2<core::num> one = #C11;
  static const field self::E2<core::String> two = #C13;
  final field self::E2::X% foo;
  final field self::E2::X? bar = null;
  static field () → self::E2<dynamic> staticFoo = () → self::E2<dynamic> => self::E2::f<dynamic>();
  const constructor •(core::int index, core::String name, self::E2::X% foo) → self::E2<self::E2::X%>
    : self::E2::foo = foo, super core::_Enum::•(index, name)
    ;
  method toString() → core::String
    return "E2.${this.{core::_Enum::_name}{core::String}}";
  static factory f<X extends core::Object? = dynamic>() → self::E2<self::E2::f::X%>
    return throw 42;
  method method(core::int value) → core::int
    return value.{core::num::+}(10){(core::num) → core::int};
  method staticMethod(core::double d, covariant-by-class self::E2::X% x) → core::String
    return "${d}${x}";
}
static method main() → dynamic {}

constants  {
  #C1 = 1
  #C2 = 42
  #C3 = 0
  #C4 = "one"
  #C5 = self::E {foo:#C1, bar:#C2, index:#C3, _name:#C4}
  #C6 = 2
  #C7 = "two"
  #C8 = self::E {foo:#C6, bar:#C2, index:#C1, _name:#C7}
  #C9 = <self::E*>[#C5, #C8]
  #C10 = null
  #C11 = self::E2<core::num*> {foo:#C1, bar:#C10, index:#C3, _name:#C4}
  #C12 = "2"
  #C13 = self::E2<core::String*> {foo:#C12, bar:#C10, index:#C1, _name:#C7}
  #C14 = <self::E2<dynamic>*>[#C11, #C13]
}


Constructor coverage from constants:
org-dartlang-testcase:///members.dart:
- E. (from org-dartlang-testcase:///members.dart:14:9)
- _Enum. (from org-dartlang-sdk:///sdk/lib/core/enum.dart:76:9)
- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
- E2. (from org-dartlang-testcase:///members.dart:32:9)
