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};
}
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};
}
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};
}
static method unusedMethod() → dynamic {}
static method main() → dynamic {
  self::usedMethod(let final self::UsedClass #t1 = new self::UsedClass::•() in block {
    #t1.{self::UsedClass::usedField};
  } =>#t1);
  #C11;
  core::List<self::UnusedEnum> list = <self::UnusedEnum>[];
  if(list.{core::Iterable::isNotEmpty}) {
    new mai::ConstClass::•().{mai::ConstClass::method}((null as{ForNonNullableByDefault} dynamic) as{TypeError,ForDynamic,ForNonNullableByDefault} mai::ConstEnum);
  }
}

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};
}
class ConstClass extends core::Object {
  synthetic constructor •() → mai::ConstClass
    : super core::Object::•()
    ;
  method method(mai::ConstEnum e) → core::int
    return e.{mai::ConstEnum::index};
}

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)
