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:103:9)
- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
