library /*isNonNullableByDefault*/;
import self as self;
import "dart:core" as core;

import "org-dartlang-testcase:///main_lib.dart";

typedef Alias1 = self::Enum1;
class Enum1 extends core::_Enum /*isEnum*/  {
  static const field core::List<self::Enum1> values = const <self::Enum1>[self::Enum1::a, self::Enum1::b, self::Enum1::c];
  static const field self::Enum1 a = const self::Enum1::•(0, "a");
  static const field self::Enum1 b = const self::Enum1::•(1, "b");
  static const field self::Enum1 c = const self::Enum1::•(2, "c");
  const constructor •(core::int #index, core::String #name) → self::Enum1
    : super core::_Enum::•(#index, #name)
    ;
  method toString() → core::String
    return "Enum1.${this.{core::_Enum::_name}{core::String}}";
}
static method test() → dynamic
  ;
static method main() → dynamic
  ;

library /*isNonNullableByDefault*/;
import self as self2;
import "dart:core" as core;

typedef Alias2 = self2::Enum2;
class Enum2 extends core::_Enum /*isEnum*/  {
  static const field core::List<self2::Enum2> values = #C10;
  static const field self2::Enum2 a = #C3;
  static const field self2::Enum2 b = #C6;
  static const field self2::Enum2 c = #C9;
  const constructor •(core::int #index, core::String #name) → self2::Enum2
    : super core::_Enum::•(#index, #name)
    ;
  method toString() → core::String
    return "Enum2.${this.{core::_Enum::_name}{core::String}}";
}

constants  {
  #C1 = 0
  #C2 = "a"
  #C3 = self2::Enum2 {index:#C1, _name:#C2}
  #C4 = 1
  #C5 = "b"
  #C6 = self2::Enum2 {index:#C4, _name:#C5}
  #C7 = 2
  #C8 = "c"
  #C9 = self2::Enum2 {index:#C7, _name:#C8}
  #C10 = <self2::Enum2*>[#C3, #C6, #C9]
}

Extra constant evaluation status:
Evaluated: ListLiteral @ org-dartlang-testcase:///main.dart:7:6 -> ListConstant(const <Enum1*>[const Enum1{_Enum.index: 0, _Enum._name: "a"}, const Enum1{_Enum.index: 1, _Enum._name: "b"}, const Enum1{_Enum.index: 2, _Enum._name: "c"}])
Evaluated: ConstructorInvocation @ org-dartlang-testcase:///main.dart:7:14 -> InstanceConstant(const Enum1{_Enum.index: 0, _Enum._name: "a"})
Evaluated: ConstructorInvocation @ org-dartlang-testcase:///main.dart:7:17 -> InstanceConstant(const Enum1{_Enum.index: 1, _Enum._name: "b"})
Evaluated: ConstructorInvocation @ org-dartlang-testcase:///main.dart:7:20 -> InstanceConstant(const Enum1{_Enum.index: 2, _Enum._name: "c"})
Extra constant evaluation: evaluated: 14, effectively constant: 4


Constructor coverage from constants:
org-dartlang-testcase:///main_lib.dart:
- Enum2. (from org-dartlang-testcase:///main_lib.dart:5:6)
- _Enum. (from org-dartlang-sdk:///sdk/lib/core/enum.dart)
- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart)
