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

class Class extends core::Object {
  field core::int? _#Class#field = null;
  field core::bool _#Class#field#isSet = false;
  constructor constructor1() → self::Class
    : super core::Object::•()
    ;
  constructor constructor2(core::int? field) → self::Class
    : self::Class::_#Class#field#isSet = true, self::Class::_#Class#field = field, super core::Object::•()
    ;
  constructor constructor3(core::int value) → self::Class
    : self::Class::_#Class#field#isSet = true, 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#isSet = true, self::Class::_#Class#field = field, super core::Object::•()
    ;
  get field() → core::int? {
    if(!this.{self::Class::_#Class#field#isSet}{core::bool}) {
      this.{self::Class::_#Class#field} = self::initField();
      this.{self::Class::_#Class#field#isSet} = true;
    }
    return this.{self::Class::_#Class#field}{core::int?};
  }
  set field(core::int? field#param) → void {
    this.{self::Class::_#Class#field#isSet} = true;
    this.{self::Class::_#Class#field} = field#param;
  }
}
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 initField() → core::int?
  return 10;
static method test1() → dynamic {
  self::Class c1 = new self::Class::constructor1();
  self::expect(10, c1.{self::Class::field}{core::int?});
  c1.{self::Class::field} = 16;
  self::expect(16, c1.{self::Class::field}{core::int?});
  self::Class c2 = new self::Class::constructor2(42);
  self::expect(42, c2.{self::Class::field}{core::int?});
  c2.{self::Class::field} = 43;
  self::expect(43, c2.{self::Class::field}{core::int?});
  self::Class c3 = new self::Class::constructor3(87);
  self::expect(88, c3.{self::Class::field}{core::int?});
  c3.{self::Class::field} = 89;
  self::expect(89, c3.{self::Class::field}{core::int?});
  self::Class c4 = new self::Class::constructor4();
  self::expect(42, c4.{self::Class::field}{core::int?});
  c4.{self::Class::field} = 43;
  self::expect(43, c4.{self::Class::field}{core::int?});
  self::Class c5 = new self::Class::constructor4(123);
  self::expect(123, c5.{self::Class::field}{core::int?});
  c5.{self::Class::field} = 124;
  self::expect(124, c5.{self::Class::field}{core::int?});
}
static method test2() → dynamic {
  self::Subclass c1 = new self::Subclass::constructor1();
  self::expect(10, c1.{self::Class::field}{core::int?});
  c1.{self::Class::field} = 16;
  self::expect(16, c1.{self::Class::field}{core::int?});
  self::Subclass c2 = new self::Subclass::constructor2(42);
  self::expect(42, c2.{self::Class::field}{core::int?});
  c2.{self::Class::field} = 43;
  self::expect(43, c2.{self::Class::field}{core::int?});
  self::Subclass c3 = new self::Subclass::constructor3(87);
  self::expect(88, c3.{self::Class::field}{core::int?});
  c3.{self::Class::field} = 89;
  self::expect(89, c3.{self::Class::field}{core::int?});
  self::Subclass c4 = new self::Subclass::constructor4();
  self::expect(87, c4.{self::Class::field}{core::int?});
  c4.{self::Class::field} = 88;
  self::expect(88, c4.{self::Class::field}{core::int?});
  self::Subclass c5 = new self::Subclass::constructor4(123);
  self::expect(123, c5.{self::Class::field}{core::int?});
  c5.{self::Class::field} = 124;
  self::expect(124, c5.{self::Class::field}{core::int?});
}
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}";
}

constants  {
  #C1 = 42
  #C2 = 87
}
