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::int? _#A#y = null;
  field core::bool _#A#y#isSet = false;
  synthetic constructor •() → self::A
    : super core::Object::•()
    ;
  get x() → core::int
    return let final core::int? #t1 = this.{self::A::_#A#x}{core::int?} in #t1 == null ?{core::int} throw new _in::LateError::fieldNI("x") : #t1{core::int};
  set x(core::int x#param) → void
    if(this.{self::A::_#A#x}{core::int?} == null)
      this.{self::A::_#A#x} = x#param;
    else
      throw new _in::LateError::fieldAI("x");
  get y() → core::int?
    return this.{self::A::_#A#y#isSet}{core::bool} ?{core::int?} this.{self::A::_#A#y}{core::int?} : throw new _in::LateError::fieldNI("y");
  set y(core::int? y#param) → void
    if(this.{self::A::_#A#y#isSet}{core::bool})
      throw new _in::LateError::fieldAI("y");
    else {
      this.{self::A::_#A#y#isSet} = true;
      this.{self::A::_#A#y} = y#param;
    }
}
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::int? _#C#y = null;
  field core::bool _#C#y#isSet = false;
  synthetic constructor •() → self::C
    : super self::A::•()
    ;
  get x() → core::int
    return let final core::int? #t2 = this.{self::C::_#C#x}{core::int?} in #t2 == null ?{core::int} let final core::int #t3 = 2 in this.{self::C::_#C#x}{core::int?} == null ?{core::int} this.{self::C::_#C#x} = #t3 : throw new _in::LateError::fieldADI("x") : #t2{core::int};
  get y() → core::int? {
    if(!this.{self::C::_#C#y#isSet}{core::bool}) {
      final core::int? #t4 = 2;
      if(this.{self::C::_#C#y#isSet}{core::bool})
        throw new _in::LateError::fieldADI("y");
      this.{self::C::_#C#y} = #t4;
      this.{self::C::_#C#y#isSet} = true;
    }
    return this.{self::C::_#C#y}{core::int?};
  }
}
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}{core::int});
  self::expect(2, c.{self::C::x}{core::int});
  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}{core::int?});
  self::expect(2, c.{self::C::y}{core::int?});
}
static method expect(dynamic expected, dynamic actual) → dynamic {
  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
    throw "Expected ${expected}, actual ${actual}";
}
static method throws(() → dynamic f, core::String message) → dynamic {
  dynamic value;
  try {
    value = f(){() → dynamic};
  }
  on core::Error catch(final core::Error e) {
    core::print(e);
    return;
  }
  throw "${message}: ${value}";
}
