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 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*/  {
  static const field core::List<self::E> values = #C5;
  final field self::A<core::String> a;
  enum-element static const field self::E element = #C4;
  const constructor •(core::int #index, core::String #name, self::A<core::String> a) → self::E
    : self::E::a = a, super core::_Enum::•(#index, #name)
    ;
  method _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)
