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 _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 = #C8;
  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 #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)
