library;
import self as self;
import "dart:core" as core;

class E0 extends core::_Enum /*isEnum*/  {
  static const field core::List<self::E0> values = #C8;
  final field core::int foo;
  final field core::int bar;
  enum-element static const field self::E0 one = #C4;
  enum-element static const field self::E0 two = #C7;
  const constructor •(core::int #index, core::String #name, core::int foo, {required core::int bar = #C9}) → self::E0
    : self::E0::foo = foo, self::E0::bar = bar, super core::_Enum::•(#index, #name)
    ;
  method _enumToString() → core::String
    return "E0.${this.{core::_Enum::_name}{core::String}}";
}
class E1<X extends core::Object? = dynamic> extends core::_Enum /*isEnum*/  {
  static const field core::List<self::E1<dynamic>> values = #C13;
  final field self::E1::X% foo;
  enum-element static const field self::E1<core::String> one = #C11;
  enum-element static const field self::E1<core::int> two = #C12;
  const constructor •(core::int #index, core::String #name, {required self::E1::X% foo = #C9}) → self::E1<self::E1::X%>
    : self::E1::foo = foo, super core::_Enum::•(#index, #name)
    ;
  method _enumToString() → core::String
    return "E1.${this.{core::_Enum::_name}{core::String}}";
}
class E2<X extends core::Object? = dynamic, Y extends core::Object? = dynamic, Z extends core::Object? = dynamic> extends core::_Enum /*isEnum*/  {
  static const field core::List<self::E2<dynamic, dynamic, dynamic>> values = #C22;
  final field self::E2::X% foo;
  final field self::E2::Y% bar;
  final field self::E2::Z? baz;
  enum-element static const field self::E2<core::int, core::String, core::double> one = #C15;
  enum-element static const field self::E2<core::String, core::int, core::double> two = #C17;
  enum-element static const field self::E2<core::double, core::bool, dynamic> three = #C21;
  const constructor •(core::int #index, core::String #name, self::E2::X% foo, {required self::E2::Y% bar = #C9, has-declared-initializer self::E2::Z? baz = #C9}) → self::E2<self::E2::X%, self::E2::Y%, self::E2::Z%>
    : self::E2::foo = foo, self::E2::bar = bar, self::E2::baz = baz, super core::_Enum::•(#index, #name)
    ;
  method _enumToString() → core::String
    return "E2.${this.{core::_Enum::_name}{core::String}}";
}
static method main() → dynamic {}

constants  {
  #C1 = 1
  #C2 = 0
  #C3 = "one"
  #C4 = self::E0 {foo:#C1, bar:#C1, index:#C2, _name:#C3}
  #C5 = 2
  #C6 = "two"
  #C7 = self::E0 {foo:#C5, bar:#C5, index:#C1, _name:#C6}
  #C8 = <self::E0*>[#C4, #C7]
  #C9 = null
  #C10 = "1"
  #C11 = self::E1<core::String*> {foo:#C10, index:#C2, _name:#C3}
  #C12 = self::E1<core::int*> {foo:#C5, index:#C1, _name:#C6}
  #C13 = <self::E1<dynamic>*>[#C11, #C12]
  #C14 = 3.14
  #C15 = self::E2<core::int*, core::String*, core::double*> {foo:#C1, bar:#C10, baz:#C14, index:#C2, _name:#C3}
  #C16 = "2"
  #C17 = self::E2<core::String*, core::int*, core::double*> {foo:#C16, bar:#C5, baz:#C14, index:#C1, _name:#C6}
  #C18 = 3.0
  #C19 = false
  #C20 = "three"
  #C21 = self::E2<core::double*, core::bool*, dynamic> {foo:#C18, bar:#C19, baz:#C9, index:#C5, _name:#C20}
  #C22 = <self::E2<dynamic, dynamic, dynamic>*>[#C15, #C17, #C21]
}


Constructor coverage from constants:
org-dartlang-testcase:///named_arguments.dart:
- E0. (from org-dartlang-testcase:///named_arguments.dart:12:9)
- _Enum. (from org-dartlang-sdk:///sdk/lib/core/enum.dart)
- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart)
- E1. (from org-dartlang-testcase:///named_arguments.dart:21:9)
- E2. (from org-dartlang-testcase:///named_arguments.dart:33:9)
