library;
import self as self;
import "dart:core" as core;

class A extends core::_Enum /*isEnum*/  {
  final field self::B value;
  static const field core::List<self::A> values = #C13;
  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, self::A */ {
    #L2:
    case #C5:
      {
        return "a";
      }
    #L3:
    case #C11:
      {
        return "b";
      }
  }
}

constants  {
  #C1 = "a"
  #C2 = eval /* from org-dartlang-testcase:///enum_from_environment.dart */ const core::int::fromEnvironment(#C1)
  #C3 = eval /* from org-dartlang-testcase:///enum_from_environment.dart */ self::B{value:#C2}
  #C4 = 0.0
  #C5 = eval /* from org-dartlang-testcase:///enum_from_environment.dart */ self::A{value:#C3, index:#C4, _name:#C1}
  #C6 = eval /* from org-dartlang-testcase:///enum_from_environment.dart */ const <dynamic>[#C5]
  #C7 = "b"
  #C8 = eval /* from org-dartlang-testcase:///enum_from_environment.dart */ const core::int::fromEnvironment(#C7)
  #C9 = eval /* from org-dartlang-testcase:///enum_from_environment.dart */ self::B{value:#C8}
  #C10 = 1.0
  #C11 = eval /* from org-dartlang-testcase:///enum_from_environment.dart */ self::A{value:#C9, index:#C10, _name:#C7}
  #C12 = eval /* from org-dartlang-testcase:///enum_from_environment.dart */ const <dynamic>[#C11]
  #C13 = eval /* from org-dartlang-testcase:///enum_from_environment.dart */ #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)
