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;
  final field core::int foo;
  final field core::int bar = 42;
  static field self::E staticFoo = self::E::f();
  static const field self::E one = #C5;
  static const field self::E two = #C8;
  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;
  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>();
  static const field self::E2<core::num> one = #C11;
  static const field self::E2<core::String> two = #C13;
  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:103:9)
- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
- E2. (from org-dartlang-testcase:///members.dart:32:9)
