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

class Class extends core::Object {
  field core::int? _#Class#field = null;
  constructor constructor1() → self::Class
    : super core::Object::•()
    ;
  constructor constructor2(core::int field) → self::Class
    : self::Class::_#Class#field = field, super core::Object::•()
    ;
  constructor constructor3(core::int value) → self::Class
    : self::Class::_#Class#field = value.{core::num::+}(1){(core::num) → core::int}, super core::Object::•()
    ;
  constructor constructor4([core::int field = #C1]) → self::Class
    : self::Class::_#Class#field = field, super core::Object::•()
    ;
  get field() → core::int
    return let final core::int? #t1 = this.{self::Class::_#Class#field}{core::int?} in #t1 == null ?{core::int} throw new _in::LateError::fieldNI("field") : #t1{core::int};
  set field(core::int field#param) → void
    if(this.{self::Class::_#Class#field}{core::int?} == null)
      this.{self::Class::_#Class#field} = field#param;
    else
      throw new _in::LateError::fieldAI("field");
}
class Subclass extends self::Class {
  constructor constructor1() → self::Subclass
    : super self::Class::constructor1()
    ;
  constructor constructor2(core::int value) → self::Subclass
    : super self::Class::constructor2(value)
    ;
  constructor constructor3(core::int value) → self::Subclass
    : super self::Class::constructor3(value)
    ;
  constructor constructor4([core::int value = #C2]) → self::Subclass
    : super self::Class::constructor4(value)
    ;
}
static method test1() → dynamic {
  self::Class c1 = new self::Class::constructor1();
  self::throws(() → core::int => c1.{self::Class::field}{core::int}, "Read value from uninitialized Class.field");
  c1.{self::Class::field} = 16;
  self::expect(16, c1.{self::Class::field}{core::int});
  self::throws(() → core::int => c1.{self::Class::field} = 17, "Write value to initialized Class.field");
  self::Class c2 = new self::Class::constructor2(42);
  self::expect(42, c2.{self::Class::field}{core::int});
  self::throws(() → core::int => c2.{self::Class::field} = 43, "Write value to initialized Class.field");
  self::Class c3 = new self::Class::constructor3(87);
  self::expect(88, c3.{self::Class::field}{core::int});
  self::throws(() → core::int => c3.{self::Class::field} = 89, "Write value to initialized Class.field");
  self::Class c4 = new self::Class::constructor4();
  self::expect(42, c4.{self::Class::field}{core::int});
  self::throws(() → core::int => c4.{self::Class::field} = 43, "Write value to initialized Class.field");
  self::Class c5 = new self::Class::constructor4(123);
  self::expect(123, c5.{self::Class::field}{core::int});
  self::throws(() → core::int => c5.{self::Class::field} = 124, "Write value to initialized Class.field");
  self::Class c6 = new self::Class::constructor1();
  c6.{self::Class::field} = 32;
  self::expect(32, c6.{self::Class::field}{core::int});
  self::throws(() → core::int => c6.{self::Class::field} = 32, "Write value to initialized Class.field");
}
static method test2() → dynamic {
  self::Subclass c1 = new self::Subclass::constructor1();
  self::throws(() → core::int => c1.{self::Class::field}{core::int}, "Read value from uninitialized Class1.field");
  c1.{self::Class::field} = 16;
  self::expect(16, c1.{self::Class::field}{core::int});
  self::throws(() → core::int => c1.{self::Class::field} = 17, "Write value to initialized Class.field");
  self::Subclass c2 = new self::Subclass::constructor2(42);
  self::expect(42, c2.{self::Class::field}{core::int});
  self::throws(() → core::int => c2.{self::Class::field} = 43, "Write value to initialized Class.field");
  self::Subclass c3 = new self::Subclass::constructor3(87);
  self::expect(88, c3.{self::Class::field}{core::int});
  self::throws(() → core::int => c3.{self::Class::field} = 89, "Write value to initialized Class.field");
  self::Subclass c4 = new self::Subclass::constructor4();
  self::expect(87, c4.{self::Class::field}{core::int});
  self::throws(() → core::int => c4.{self::Class::field} = 88, "Write value to initialized Class.field");
  self::Subclass c5 = new self::Subclass::constructor4(123);
  self::expect(123, c5.{self::Class::field}{core::int});
  self::throws(() → core::int => c5.{self::Class::field} = 124, "Write value to initialized Class.field");
  self::Subclass c6 = new self::Subclass::constructor1();
  c6.{self::Class::field} = 32;
  self::expect(32, c6.{self::Class::field}{core::int});
  self::throws(() → core::int => c6.{self::Class::field} = 32, "Write value to initialized Class.field");
}
static method main() → dynamic {
  self::test1();
  self::test2();
}
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}";
}

constants  {
  #C1 = 42
  #C2 = 87
}
