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

class E0 extends core::_Enum /*isEnum*/  {
  final field core::int foo;
  final field core::int bar;
  static const field core::List<self::E0> values = #C8;
  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}) → 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*/  {
  final field self::E1::X% foo;
  static const field core::List<self::E1<dynamic>> values = #C12;
  enum-element static const field self::E1<core::String> one = #C10;
  enum-element static const field self::E1<core::int> two = #C11;
  const constructor •(core::int #index, core::String #name, {required self::E1::X% foo}) → 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*/  {
  final field self::E2::X% foo;
  final field self::E2::Y% bar;
  final field self::E2::Z? baz;
  static const field core::List<self::E2<dynamic, dynamic, dynamic>> values = #C22;
  enum-element static const field self::E2<core::int, core::String, core::double> one = #C14;
  enum-element static const field self::E2<core::String, core::int, core::double> two = #C16;
  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, has-declared-initializer self::E2::Z? baz = #C19}) → 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 = "1"
  #C10 = self::E1<core::String> {foo:#C9, index:#C2, _name:#C3}
  #C11 = self::E1<core::int> {foo:#C5, index:#C1, _name:#C6}
  #C12 = <self::E1<dynamic>>[#C10, #C11]
  #C13 = 3.14
  #C14 = self::E2<core::int, core::String, core::double> {foo:#C1, bar:#C9, baz:#C13, index:#C2, _name:#C3}
  #C15 = "2"
  #C16 = self::E2<core::String, core::int, core::double> {foo:#C15, bar:#C5, baz:#C13, index:#C1, _name:#C6}
  #C17 = 3.0
  #C18 = false
  #C19 = null
  #C20 = "three"
  #C21 = self::E2<core::double, core::bool, dynamic> {foo:#C17, bar:#C18, baz:#C19, index:#C5, _name:#C20}
  #C22 = <self::E2<dynamic, dynamic, dynamic>>[#C14, #C16, #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)
