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

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 = #C7;
  static const field self::UnusedEnum a = #C3;
  static const field self::UnusedEnum b = #C6;
  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 = #C12;
  static const field self::UsedEnum unusedValue = #C9;
  static const field self::UsedEnum usedValue = #C11;
  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
    : self::UnusedInterface::usedInterfaceField = usedInterfaceField, super core::Object::•()
    ;
}
class UsedClass extends core::Object implements self::UnusedInterface {
  field core::int? unusedField = null;
  field core::int? usedField = null;
  field core::int? usedInterfaceField = null;
  synthetic constructor •() → self::UsedClass
    : super core::Object::•()
    ;
}
class UnusedClass extends core::Object {
  synthetic constructor •() → self::UnusedClass
    : super core::Object::•()
    ;
}
static method usedMethod(self::UnusedInterface c) → dynamic {
  c.{self::UnusedInterface::usedInterfaceField} = c.{self::UnusedInterface::usedInterfaceField}{core::int?};
}
static method unusedMethod() → dynamic {}
static method main() → dynamic {
  self::usedMethod(let final self::UsedClass #t1 = new self::UsedClass::•() in block {
    #t1.{self::UsedClass::usedField}{core::int?};
  } =>#t1);
  #C11;
  core::List<self::UnusedEnum> list = <self::UnusedEnum>[];
  if(list.{core::Iterable::isNotEmpty}{core::bool}) {
    new mai::ConstClass::•().{mai::ConstClass::method}((null as{ForNonNullableByDefault} dynamic) as{TypeError,ForDynamic,ForNonNullableByDefault} mai::ConstEnum){(mai::ConstEnum) → core::int};
  }
}

library /*isNonNullableByDefault*/;
import self as mai;
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<mai::ConstEnum> values = #C15;
  static const field mai::ConstEnum value = #C14;
  const constructor •(core::int index, core::String _name) → mai::ConstEnum
    : mai::ConstEnum::index = index, mai::ConstEnum::_name = _name, super core::Object::•()
    ;
  method toString() → core::String
    return this.{mai::ConstEnum::_name}{core::String};
}
class ConstClass extends core::Object {
  synthetic constructor •() → mai::ConstClass
    : super core::Object::•()
    ;
  method method(mai::ConstEnum e) → core::int
    return e.{mai::ConstEnum::index}{core::int};
}

constants  {
  #C1 = 0
  #C2 = "UnusedEnum.a"
  #C3 = self::UnusedEnum {index:#C1, _name:#C2}
  #C4 = 1
  #C5 = "UnusedEnum.b"
  #C6 = self::UnusedEnum {index:#C4, _name:#C5}
  #C7 = <self::UnusedEnum*>[#C3, #C6]
  #C8 = "UsedEnum.unusedValue"
  #C9 = self::UsedEnum {index:#C1, _name:#C8}
  #C10 = "UsedEnum.usedValue"
  #C11 = self::UsedEnum {index:#C4, _name:#C10}
  #C12 = <self::UsedEnum*>[#C9, #C11]
  #C13 = "ConstEnum.value"
  #C14 = mai::ConstEnum {index:#C1, _name:#C13}
  #C15 = <mai::ConstEnum*>[#C14]
}


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)

org-dartlang-testcase:///main.dart:
- UnusedEnum. (from org-dartlang-testcase:///main.dart:7:6)
- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
- UsedEnum. (from org-dartlang-testcase:///main.dart:8:6)
