library /*isNonNullableByDefault*/;
import self as self;
import "dart:core" as core;

abstract class A extends core::Object {
  static final field dynamic _redirecting# = <dynamic>[#C1]/*isLegacy*/;
  abstract get value() → core::int;
  static factory •({core::int value = #C2}) → self::A
    return new self::_AImpl::•(value: value);
}
class _AImpl extends core::Object implements self::A {
  final field core::int value;
  constructor •({core::int value = #C2}) → self::_AImpl
    : self::_AImpl::value = value, super core::Object::•()
    ;
}
static const field ({value: core::int}) → self::A _new = #C3;
static const field ({value: core::int}) → self::_AImpl _newImpl = #C4;
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, #C3(){({value: core::int}) → self::A}.{self::A::value}{core::int});
  self::expect(0, #C3(){({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, #C4(){({value: core::int}) → self::_AImpl}.{self::_AImpl::value}{core::int});
  self::expect(0, #C4(){({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 = constructor-tearoff self::A::•
  #C2 = 0
  #C3 = redirecting-factory-tearoff self::A::•
  #C4 = constructor-tearoff self::_AImpl::•
}
