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

class A extends core::_Enum /*isEnum*/  {
  enum-element static const field self::A a = #C5;
  enum-element static const field self::A b = #C10;
  final field self::B value;
  static const field core::List<self::A> values = #C13;
  const constructor •(core::int #index, core::String #name, self::B value) → self::A
    : self::A::value = value, super core::_Enum::•(#index, #name)
    ;
  method core::_enumToString() → core::String
    return "A.${this.{core::_Enum::_name}{core::String}}";
}
class B extends core::Object /*hasConstConstructor*/  {
  final field core::int value;
  static const field self::B a = #C3;
  static const field self::B b = #C8;
  const constructor •(core::int value) → self::B
    : self::B::value = value, super core::Object::•()
    ;
  static synthetic 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 #C10:
      {
        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 = "b"
  #C7 = eval /* from org-dartlang-testcase:///enum_from_environment.dart */ const core::int::fromEnvironment(#C6)
  #C8 = eval /* from org-dartlang-testcase:///enum_from_environment.dart */ self::B{value:#C7}
  #C9 = 1.0
  #C10 = eval /* from org-dartlang-testcase:///enum_from_environment.dart */ self::A{value:#C8, index:#C9, _name:#C6}
  #C11 = eval /* from org-dartlang-testcase:///enum_from_environment.dart */ const <dynamic>[#C5]
  #C12 = eval /* from org-dartlang-testcase:///enum_from_environment.dart */ const <dynamic>[#C10]
  #C13 = eval /* from org-dartlang-testcase:///enum_from_environment.dart */ #C11 + #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)
