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

class Enum extends core::_Enum /*isEnum*/  {
  static const field core::List<self::Enum> values = #C10;
  enum-element static const field self::Enum a = #C3;
  enum-element static const field self::Enum b = #C6;
  enum-element static const field self::Enum c = #C9;
  const synthetic constructor •(core::int #index, core::String #name) → self::Enum
    : super core::_Enum::•(#index, #name)
    ;
  method _enumToString() → core::String
    return "Enum.${this.{core::_Enum::_name}{core::String}}";
}
static method method(dynamic e) → dynamic {
  #L1:
  switch(e) /* dynamic */ {
    #L2:
    case #C1:
      {
        core::print(0);
        break #L1;
      }
    #L3:
    case #C4:
      {
        core::print(1);
        break #L1;
      }
    #L4:
    case #C7:
      {
        core::print(2);
      }
  }
  #L5:
  {
    final synthesized dynamic #0#0 = e;
    {
      if(#0#0 is core::int && e{core::int} =={core::num::==}{(core::Object) → core::bool} 0) {
        {
          core::print(0);
          break #L5;
        }
      }
    }
    {
      if(#0#0 is core::int && e{core::int} =={core::num::==}{(core::Object) → core::bool} 1) {
        {
          core::print(1);
          break #L5;
        }
      }
    }
    {
      if(#0#0 is core::int && e{core::int} =={core::num::==}{(core::Object) → core::bool} 2) {
        {
          core::print(2);
        }
      }
    }
  }
}
static method method2(self::Enum e) → dynamic {
  #L6:
  switch(e) /* isExplicitlyExhaustive, self::Enum */ {
    #L7:
    case #C3:
      {
        core::print(0);
        break #L6;
      }
    #L8:
    case #C6:
      {
        core::print(1);
        break #L6;
      }
    #L9:
    case #C9:
      {
        core::print(2);
      }
  }
}

constants  {
  #C1 = 0
  #C2 = "a"
  #C3 = self::Enum {index:#C1, _name:#C2}
  #C4 = 1
  #C5 = "b"
  #C6 = self::Enum {index:#C4, _name:#C5}
  #C7 = 2
  #C8 = "c"
  #C9 = self::Enum {index:#C7, _name:#C8}
  #C10 = <self::Enum>[#C3, #C6, #C9]
}


Constructor coverage from constants:
org-dartlang-testcase:///omitted_break.dart:
- Enum. (from org-dartlang-testcase:///omitted_break.dart:5:6)
- _Enum. (from org-dartlang-sdk:///sdk/lib/core/enum.dart)
- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart)
