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

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

class UnusedEnum extends core::Object /*isEnum*/  {
  final field core::int index;
  final field core::String _name;
  static const field core::List<self::UnusedEnum> values = const <self::UnusedEnum>[self::UnusedEnum::a, self::UnusedEnum::b];
  static const field self::UnusedEnum a = const self::UnusedEnum::•(0, "UnusedEnum.a");
  static const field self::UnusedEnum b = const self::UnusedEnum::•(1, "UnusedEnum.b");
  const constructor •(core::int index, core::String _name) → self::UnusedEnum
    : self::UnusedEnum::index = index, self::UnusedEnum::_name = _name, super core::Object::•()
    ;
  method toString() → core::String
    return this.{self::UnusedEnum::_name};
}
class UsedEnum extends core::Object /*isEnum*/  {
  final field core::int index;
  final field core::String _name;
  static const field core::List<self::UsedEnum> values = const <self::UsedEnum>[self::UsedEnum::unusedValue, self::UsedEnum::usedValue];
  static const field self::UsedEnum unusedValue = const self::UsedEnum::•(0, "UsedEnum.unusedValue");
  static const field self::UsedEnum usedValue = const self::UsedEnum::•(1, "UsedEnum.usedValue");
  const constructor •(core::int index, core::String _name) → self::UsedEnum
    : self::UsedEnum::index = index, self::UsedEnum::_name = _name, super core::Object::•()
    ;
  method toString() → core::String
    return this.{self::UsedEnum::_name};
}
class UnusedInterface extends core::Object {
  field core::int? usedInterfaceField;
  constructor •(core::int? usedInterfaceField) → self::UnusedInterface
    ;
}
class UsedClass extends core::Object implements self::UnusedInterface {
  field core::int? unusedField;
  field core::int? usedField;
  field core::int? usedInterfaceField;
  synthetic constructor •() → self::UsedClass
    ;
}
class UnusedClass extends core::Object {
  synthetic constructor •() → self::UnusedClass
    ;
}
static method usedMethod(self::UnusedInterface c) → dynamic
  ;
static method unusedMethod() → dynamic
  ;
static method main() → dynamic
  ;

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

class ConstEnum extends core::Object /*isEnum*/  {
  final field core::int index;
  final field core::String _name;
  static const field core::List<self2::ConstEnum> values = #C4;
  static const field self2::ConstEnum value = #C3;
  const constructor •(core::int index, core::String _name) → self2::ConstEnum
    : self2::ConstEnum::index = index, self2::ConstEnum::_name = _name, super core::Object::•()
    ;
  method toString() → core::String
    return this.{self2::ConstEnum::_name};
}
class ConstClass extends core::Object {
  synthetic constructor •() → self2::ConstClass
    ;
  method method(self2::ConstEnum e) → core::int
    ;
}

constants  {
  #C1 = 0
  #C2 = "ConstEnum.value"
  #C3 = self2::ConstEnum {index:#C1, _name:#C2}
  #C4 = <self2::ConstEnum*>[#C3]
}

Extra constant evaluation status:
Evaluated: ListLiteral @ org-dartlang-testcase:///main.dart:7:6 -> ListConstant(const <UnusedEnum*>[const UnusedEnum{UnusedEnum.index: 0, UnusedEnum._name: "UnusedEnum.a"}, const UnusedEnum{UnusedEnum.index: 1, UnusedEnum._name: "UnusedEnum.b"}])
Evaluated: ConstructorInvocation @ org-dartlang-testcase:///main.dart:7:19 -> InstanceConstant(const UnusedEnum{UnusedEnum.index: 0, UnusedEnum._name: "UnusedEnum.a"})
Evaluated: ConstructorInvocation @ org-dartlang-testcase:///main.dart:7:22 -> InstanceConstant(const UnusedEnum{UnusedEnum.index: 1, UnusedEnum._name: "UnusedEnum.b"})
Evaluated: ListLiteral @ org-dartlang-testcase:///main.dart:8:6 -> ListConstant(const <UsedEnum*>[const UsedEnum{UsedEnum.index: 0, UsedEnum._name: "UsedEnum.unusedValue"}, const UsedEnum{UsedEnum.index: 1, UsedEnum._name: "UsedEnum.usedValue"}])
Evaluated: ConstructorInvocation @ org-dartlang-testcase:///main.dart:9:3 -> InstanceConstant(const UsedEnum{UsedEnum.index: 0, UsedEnum._name: "UsedEnum.unusedValue"})
Evaluated: ConstructorInvocation @ org-dartlang-testcase:///main.dart:10:3 -> InstanceConstant(const UsedEnum{UsedEnum.index: 1, UsedEnum._name: "UsedEnum.usedValue"})
Extra constant evaluation: evaluated: 18, effectively constant: 6


Constructor coverage from constants:
org-dartlang-testcase:///main_lib.dart:
- ConstEnum. (from org-dartlang-testcase:///main_lib.dart:5:6)
- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
