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}{core::int?};
}
static method main() → dynamic {
  self::usedMethod(let final self::UsedClass #t1 = new self::UsedClass::•() in block {
    #t1.{self::UsedClass::usedField}{core::int?};
  } =>#t1);
  #C3;
  core::List<self::UnusedEnum> list = core::_GrowableList::•<self::UnusedEnum>(0);
  if(list.{core::Iterable::isNotEmpty}{core::bool}) {
    new mai::ConstClass::•().{mai::ConstClass::method}(_in::unsafeCast<mai::ConstEnum>(_in::unsafeCast<dynamic>(null))){(mai::ConstEnum) → core::int};
  }
}

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

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)
