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? #t1) → void {
    this.{self::Class::_#Class#field#isSet} = true;
    this.{self::Class::_#Class#field} = #t1;
  }
}
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
}
