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

abstract class A extends core::Object {
  abstract get value() → core::int;
  static factory •({core::int value = #C1}) → self::A /* redirection-target: self::_AImpl::• */
    return new self::_AImpl::•(value: value);
}
class _AImpl extends core::Object implements self::A {
  final field core::int value;
  constructor •({core::int value = #C1}) → self::_AImpl
    : self::_AImpl::value = value, super core::Object::•()
    ;
}
static const field ({value: core::int}) → self::A _new = #C2;
static const field ({value: core::int}) → self::_AImpl _newImpl = #C3;
static method main(core::List<core::String> args) → void {
  self::expect(0, new self::_AImpl::•().{self::A::value}{core::int});
  self::expect(0, new self::_AImpl::•().{self::A::value}{core::int});
  self::expect(0, #C2(){({value: core::int}) → self::A}.{self::A::value}{core::int});
  self::expect(0, #C2(){({value: core::int}) → self::A}.{self::A::value}{core::int});
  self::expect(0, new self::_AImpl::•().{self::_AImpl::value}{core::int});
  self::expect(0, new self::_AImpl::•().{self::_AImpl::value}{core::int});
  self::expect(0, #C3(){({value: core::int}) → self::_AImpl}.{self::_AImpl::value}{core::int});
  self::expect(0, #C3(){({value: core::int}) → self::_AImpl}.{self::_AImpl::value}{core::int});
}
static method expect(dynamic expected, dynamic actual) → dynamic {
  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
    throw "Expected ${expected}, actual ${actual}";
}

constants  {
  #C1 = 0
  #C2 = redirecting-factory-tearoff self::A::•
  #C3 = constructor-tearoff self::_AImpl::•
}
