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

class A extends core::_Enum /*isEnum*/  {
  static const field core::List<self::A> values = #C13;
  final field self::B value;
  enum-element static const field self::A a = #C5;
  enum-element static const field self::A b = #C11;
  const constructor •(core::int #index, core::String #name, self::B value) → self::A
    : self::A::value = value, super core::_Enum::•(#index, #name)
    ;
  method _enumToString() → core::String
    return "A.${this.{core::_Enum::_name}{core::String}}";
  static method _#new#tearOff(core::int #index, core::String #name, self::B value) → self::A
    return new self::A::•(#index, #name, value);
}
class B extends core::Object /*hasConstConstructor*/  {
  final field core::int value;
  static const field self::B a = #C3;
  static const field self::B b = #C9;
  const constructor •(core::int value) → self::B
    : self::B::value = value, super core::Object::•()
    ;
  static method _#new#tearOff(core::int value) → self::B
    return new self::B::•(value);
}
static method method(self::A a) → core::String {
  #L1:
  switch(a) /*isExplicitlyExhaustive*/ {
    #L2:
    case #C5:
      {
        return "a";
      }
    #L3:
    case #C11:
      {
        return "b";
      }
    #L4:
    default:
      throw new _in::ReachabilityError::•("`null` encountered as case in a switch statement with a non-nullable type.");
  }
}

constants  {
  #C1 = "a"
  #C2 = eval const core::int::fromEnvironment(#C1)
  #C3 = eval self::B{value:#C2}
  #C4 = 0.0
  #C5 = eval self::A{value:#C3, index:#C4, _name:#C1}
  #C6 = eval const <dynamic>[#C5]
  #C7 = "b"
  #C8 = eval const core::int::fromEnvironment(#C7)
  #C9 = eval self::B{value:#C8}
  #C10 = 1.0
  #C11 = eval self::A{value:#C9, index:#C10, _name:#C7}
  #C12 = eval const <dynamic>[#C11]
  #C13 = eval #C6 + #C12
}


Constructor coverage from constants:
org-dartlang-testcase:///enum_from_environment.dart:
- B. (from org-dartlang-testcase:///enum_from_environment.dart:18:9)
- Object. (from org-dartlang-sdk:///lib/core/object.dart)
- A. (from org-dartlang-testcase:///enum_from_environment.dart:12:9)
- _Enum. (from org-dartlang-sdk:///lib/core/enum.dart)
