library;
import self as self;
import "main_lib.dart" as mai;
import "dart:core" as core;

import "org-dartlang-testcase:///main_lib.dart";

static method main() → void {
  const mai::SomeEnum a = #C3;
  final mai::SomeEnum b = mai::SomeEnum::value;
  core::print("a == b: ${a =={core::Object::==}{(core::Object) → core::bool} b}");
  core::print("a hash: ${a.{core::Object::hashCode}{core::int}}");
  core::print("b hash: ${b.{core::Object::hashCode}{core::int}}");
}

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

abstract class HasSomeField extends core::Object /*isMixinDeclaration*/  {
  abstract get someField() → core::String;
}
class SomeEnum extends mai::_SomeEnum&_Enum&HasSomeField /*isEnum*/  {
  enum-element static const field mai::SomeEnum value = #C3;
  static const field core::List<mai::SomeEnum> values = #C4;
  const synthetic constructor •(core::int #index, core::String #name) → mai::SomeEnum
    : super mai::_SomeEnum&_Enum&HasSomeField::•(#index, #name)
    ;
  method _enumToString() → core::String
    return "SomeEnum.${this.{core::_Enum::_name}{core::String}}";
  @#C5
  get someField() → core::String
    return "field";
}
abstract class _SomeEnum&_Enum&HasSomeField = core::_Enum with mai::HasSomeField /*isAnonymousMixin,hasConstConstructor*/  {
  const synthetic constructor •(core::int index, core::String _name) → mai::_SomeEnum&_Enum&HasSomeField
    : super core::_Enum::•(index, _name)
    ;
  abstract synthetic mixin-stub get someField() → core::String; -> mai::HasSomeField::someField
}

constants  {
  #C1 = 0.0
  #C2 = "value"
  #C3 = mai::SomeEnum {index:#C1, _name:#C2}
  #C4 = <mai::SomeEnum>[#C3]
  #C5 = core::_Override {}
}

Extra constant evaluation status:
Evaluated: StaticGet @ org-dartlang-testcase:///main.dart:9:22 -> InstanceConstant(const SomeEnum{_Enum.index: 0.0, _Enum._name: "value"})
Evaluated: VariableGetImpl @ org-dartlang-testcase:///main.dart:11:20 -> InstanceConstant(const SomeEnum{_Enum.index: 0.0, _Enum._name: "value"})
Evaluated: VariableGetImpl @ org-dartlang-testcase:///main.dart:12:20 -> InstanceConstant(const SomeEnum{_Enum.index: 0.0, _Enum._name: "value"})
Extra constant evaluation: evaluated: 21, effectively constant: 3


Constructor coverage from constants:
org-dartlang-testcase:///main_lib.dart:
- SomeEnum. (from org-dartlang-testcase:///main_lib.dart:9:6)
- _SomeEnum&_Enum&HasSomeField. (from org-dartlang-testcase:///main_lib.dart:9:6)
- _Enum. (from org-dartlang-sdk:///lib/core/enum.dart)
- Object. (from org-dartlang-sdk:///lib/core/object.dart)
