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}{core::String};
}
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}{core::String};
}
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}{core::String};
}
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)
