library;
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();
  enum-element static const field self::E one = #C5;
  enum-element 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 _enumToString() → 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>();
  enum-element static const field self::E2<core::num> one = #C11;
  enum-element 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 _enumToString() → 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)
- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart)
- E2. (from org-dartlang-testcase:///members.dart:32:9)
