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

class A extends core::Object {
  field core::int? _#A#x = null;
  field core::bool _#A#x#isSet = false;
  field core::int? _#A#y = null;
  field core::bool _#A#y#isSet = false;
  synthetic constructor •() → self::A
    : super core::Object::•()
    ;
  get x() → core::int
    return this.{self::A::_#A#x#isSet} ?{core::int} let final core::int? #t1 = this.{self::A::_#A#x} in #t1{core::int} : throw new _in::LateInitializationErrorImpl::•("Field 'x' has not been initialized.");
  set x(core::int #t2) → void
    if(this.{self::A::_#A#x#isSet})
      throw new _in::LateInitializationErrorImpl::•("Field 'x' has already been initialized.");
    else {
      this.{self::A::_#A#x#isSet} = true;
      this.{self::A::_#A#x} = #t2;
    }
  get y() → core::int?
    return this.{self::A::_#A#y#isSet} ?{core::int?} this.{self::A::_#A#y} : throw new _in::LateInitializationErrorImpl::•("Field 'y' has not been initialized.");
  set y(core::int? #t3) → void
    if(this.{self::A::_#A#y#isSet})
      throw new _in::LateInitializationErrorImpl::•("Field 'y' has already been initialized.");
    else {
      this.{self::A::_#A#y#isSet} = true;
      this.{self::A::_#A#y} = #t3;
    }
}
class B extends self::A {
  synthetic constructor •() → self::B
    : super self::A::•()
    ;
  get x() → core::int
    return 1;
  get y() → core::int?
    return 1;
}
class C extends self::A {
  field core::int? _#C#x = null;
  field core::bool _#C#x#isSet = false;
  field core::int? _#C#y = null;
  field core::bool _#C#y#isSet = false;
  synthetic constructor •() → self::C
    : super self::A::•()
    ;
  get x() → core::int {
    if(!this.{self::C::_#C#x#isSet}) {
      final core::int #t4 = 2;
      if(this.{self::C::_#C#x#isSet})
        throw new _in::LateInitializationErrorImpl::•("Field 'x' has been assigned during initialization.");
      this.{self::C::_#C#x} = #t4;
      this.{self::C::_#C#x#isSet} = true;
    }
    return let final core::int? #t5 = this.{self::C::_#C#x} in #t5{core::int};
  }
  get y() → core::int? {
    if(!this.{self::C::_#C#y#isSet}) {
      final core::int? #t6 = 2;
      if(this.{self::C::_#C#y#isSet})
        throw new _in::LateInitializationErrorImpl::•("Field 'y' has been assigned during initialization.");
      this.{self::C::_#C#y} = #t6;
      this.{self::C::_#C#y#isSet} = true;
    }
    return this.{self::C::_#C#y};
  }
}
static method main() → dynamic {
  self::B b = new self::B::•();
  b.{self::A::x} = 3;
  self::C c = new self::C::•();
  self::throws(() → core::int => b.{self::A::x} = 14, "Write to B.x");
  c.{self::A::x} = 3;
  self::throws(() → core::int => c.{self::A::x} = 14, "Write to C.x");
  self::expect(1, b.{self::B::x});
  self::expect(2, c.{self::C::x});
  b.{self::A::y} = 3;
  self::throws(() → core::int => b.{self::A::y} = 14, "Write to B.y");
  c.{self::A::y} = 3;
  self::throws(() → core::int => c.{self::A::y} = 14, "Write to C.y");
  self::expect(1, b.{self::B::y});
  self::expect(2, c.{self::C::y});
}
static method expect(dynamic expected, dynamic actual) → dynamic {
  if(!expected.{core::Object::==}(actual))
    throw "Expected ${expected}, actual ${actual}";
}
static method throws(() → dynamic f, core::String message) → dynamic {
  dynamic value;
  try {
    value = f.call();
  }
  on core::LateInitializationError catch(final core::LateInitializationError e) {
    core::print(e);
    return;
  }
  throw "${message}: ${value}";
}
