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

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

abstract class UnusedEnum extends core::Object {
}
class UsedEnum extends core::Object /*isEnum*/  {
  final field core::int index;
  final field core::String _name;
  method toString() → core::String
    return this.{self::UsedEnum::_name};
}
abstract class UnusedInterface extends core::Object {
  abstract get /*isLegacy*/ usedInterfaceField() → core::int?;
  abstract set /*isLegacy*/ usedInterfaceField(core::int? value) → void;
}
class UsedClass extends core::Object implements self::UnusedInterface {
  field core::int? usedField = null;
  field core::int? usedInterfaceField = null;
  synthetic constructor •() → self::UsedClass
    : super core::Object::•()
    ;
}
static method usedMethod(self::UnusedInterface c) → dynamic {
  c.{self::UnusedInterface::usedInterfaceField} = c.{self::UnusedInterface::usedInterfaceField};
}
static method main() → dynamic {
  self::usedMethod(let final self::UsedClass #t1 = new self::UsedClass::•() in block {
    #t1.{self::UsedClass::usedField};
  } =>#t1);
  #C3;
  core::List<self::UnusedEnum> list = core::_GrowableList::•<self::UnusedEnum>(0);
  if(list.{core::Iterable::isNotEmpty}) {
    new mai::ConstClass::•().{mai::ConstClass::method}(_in::unsafeCast<mai::ConstEnum>(_in::unsafeCast<dynamic>(null)));
  }
}

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

abstract class ConstEnum extends core::Object {
  abstract get /*isLegacy*/ index() → core::int;
}
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 = 1
  #C2 = "UsedEnum.usedValue"
  #C3 = self::UsedEnum {index:#C1, _name:#C2}
}


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

org-dartlang-testcase:///main.dart:
- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
