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

typedef TA<Y extends core::Object? = dynamic> = self::A<Y%>;
class A<X extends core::Object? = dynamic> extends core::Object /*hasConstConstructor*/  {
  const constructor •() → self::A<self::A::X%>
    : super core::Object::•()
    ;
  static const factory redir<X extends core::Object? = dynamic>() → self::A<self::A::redir::X%> /* redirection-target: self::A::•<self::A::redir::X%>*/
    return new self::A::•<self::A::redir::X%>();
}
class E extends core::_Enum /*isEnum*/  {
  enum-element static const field self::E element = #C4;
  final field self::A<core::String> a;
  static const field core::List<self::E> values = #C5;
  const constructor •(core::int #index, core::String #name, initializing-formal self::A<core::String> a) → self::E
    : self::E::a = a, super core::_Enum::•(#index, #name)
    ;
  method core::_enumToString() → core::String
    return "E.${this.{core::_Enum::_name}{core::String}}";
}

constants  {
  #C1 = self::A<core::String> {}
  #C2 = 0
  #C3 = "element"
  #C4 = self::E {a:#C1, index:#C2, _name:#C3}
  #C5 = <self::E>[#C4]
}


Constructor coverage from constants:
org-dartlang-testcase:///issue55152.dart:
- A. (from org-dartlang-testcase:///issue55152.dart:6:9)
- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart)
- E. (from org-dartlang-testcase:///issue55152.dart:18:9)
- _Enum. (from org-dartlang-sdk:///sdk/lib/core/enum.dart)
