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

class Class<T extends core::Object? = dynamic> extends core::Object {
  static field core::int? _#lateStaticField1 = null;
  static field core::bool _#lateStaticField1#isSet = false;
  static field core::int? _#lateStaticField2 = null;
  static field core::bool _#lateStaticField2#isSet = false;
  field core::int? _#Class#lateInstanceField = null;
  field core::bool _#Class#lateInstanceField#isSet = false;
  field self::Class::T? _#Class#lateGenericInstanceField = null;
  field core::bool _#Class#lateGenericInstanceField#isSet = false;
  synthetic constructor •() → self::Class<self::Class::T%>
    : super core::Object::•()
    ;
  static get lateStaticField1() → core::int?
    return self::Class::_#lateStaticField1#isSet ?{core::int?} self::Class::_#lateStaticField1 : throw new _in::LateError::fieldNI("lateStaticField1");
  static set lateStaticField1(core::int? #t1) → void
    if(self::Class::_#lateStaticField1#isSet)
      throw new _in::LateError::fieldAI("lateStaticField1");
    else {
      self::Class::_#lateStaticField1#isSet = true;
      self::Class::_#lateStaticField1 = #t1;
    }
  static get lateStaticField2() → core::int?
    return self::Class::_#lateStaticField2#isSet ?{core::int?} self::Class::_#lateStaticField2 : throw new _in::LateError::fieldNI("lateStaticField2");
  static set lateStaticField2(core::int? #t2) → void
    if(self::Class::_#lateStaticField2#isSet)
      throw new _in::LateError::fieldAI("lateStaticField2");
    else {
      self::Class::_#lateStaticField2#isSet = true;
      self::Class::_#lateStaticField2 = #t2;
    }
  static method staticMethod() → dynamic {
    self::throws(() → core::int? => self::Class::lateStaticField2, "Read value from uninitialized Class.lateStaticField2");
    self::Class::lateStaticField2 = 42;
    self::expect(42, self::Class::lateStaticField2);
    self::throws(() → core::int => self::Class::lateStaticField2 = 43, "Write value to initialized Class.lateStaticField2");
  }
  get lateInstanceField() → core::int?
    return this.{self::Class::_#Class#lateInstanceField#isSet}{core::bool} ?{core::int?} this.{self::Class::_#Class#lateInstanceField}{core::int?} : throw new _in::LateError::fieldNI("lateInstanceField");
  set lateInstanceField(core::int? #t3) → void
    if(this.{self::Class::_#Class#lateInstanceField#isSet}{core::bool})
      throw new _in::LateError::fieldAI("lateInstanceField");
    else {
      this.{self::Class::_#Class#lateInstanceField#isSet} = true;
      this.{self::Class::_#Class#lateInstanceField} = #t3;
    }
  get lateGenericInstanceField() → self::Class::T?
    return this.{self::Class::_#Class#lateGenericInstanceField#isSet}{core::bool} ?{self::Class::T?} this.{self::Class::_#Class#lateGenericInstanceField}{self::Class::T?} : throw new _in::LateError::fieldNI("lateGenericInstanceField");
  set lateGenericInstanceField(self::Class::T? #t4) → void
    if(this.{self::Class::_#Class#lateGenericInstanceField#isSet}{core::bool})
      throw new _in::LateError::fieldAI("lateGenericInstanceField");
    else {
      this.{self::Class::_#Class#lateGenericInstanceField#isSet} = true;
      this.{self::Class::_#Class#lateGenericInstanceField} = #t4;
    }
  method instanceMethod(generic-covariant-impl self::Class::T% value) → dynamic {
    self::throws(() → core::int? => this.{self::Class::lateInstanceField}{core::int?}, "Read value from uninitialized Class.lateInstanceField");
    this.{self::Class::lateInstanceField} = 16;
    self::expect(16, this.{self::Class::lateInstanceField}{core::int?});
    self::throws(() → core::int => this.{self::Class::lateInstanceField} = 17, "Write value to initialized Class.lateInstanceField");
    self::throws(() → self::Class::T? => this.{self::Class::lateGenericInstanceField}{self::Class::T?}, "Read value from uninitialized Class.lateGenericInstanceField");
    this.{self::Class::lateGenericInstanceField} = value;
    self::expect(value, this.{self::Class::lateGenericInstanceField}{self::Class::T?});
    self::throws(() → self::Class::T% => this.{self::Class::lateGenericInstanceField} = value, "Write value to initialized Class.lateGenericInstanceField");
  }
}
extension Extension<T extends core::Object? = dynamic> on self::Class<T%> {
  static field lateExtensionField1 = self::_#Extension|lateExtensionField1;
  static field lateExtensionField1 = self::_#Extension|lateExtensionField1#isSet;
  static get lateExtensionField1 = get self::Extension|lateExtensionField1;
  static set lateExtensionField1 = set self::Extension|lateExtensionField1;
  static field lateExtensionField2 = self::_#Extension|lateExtensionField2;
  static field lateExtensionField2 = self::_#Extension|lateExtensionField2#isSet;
  static get lateExtensionField2 = get self::Extension|lateExtensionField2;
  static set lateExtensionField2 = set self::Extension|lateExtensionField2;
  static method staticMethod = self::Extension|staticMethod;
}
static field core::int? _#lateTopLevelField = null;
static field core::bool _#lateTopLevelField#isSet = false;
static field core::int? _#Extension|lateExtensionField1 = null;
static field core::bool _#Extension|lateExtensionField1#isSet = false;
static field core::int? _#Extension|lateExtensionField2 = null;
static field core::bool _#Extension|lateExtensionField2#isSet = false;
static get lateTopLevelField() → core::int?
  return self::_#lateTopLevelField#isSet ?{core::int?} self::_#lateTopLevelField : throw new _in::LateError::fieldNI("lateTopLevelField");
static set lateTopLevelField(core::int? #t5) → void
  if(self::_#lateTopLevelField#isSet)
    throw new _in::LateError::fieldAI("lateTopLevelField");
  else {
    self::_#lateTopLevelField#isSet = true;
    self::_#lateTopLevelField = #t5;
  }
static get Extension|lateExtensionField1() → core::int?
  return self::_#Extension|lateExtensionField1#isSet ?{core::int?} self::_#Extension|lateExtensionField1 : throw new _in::LateError::fieldNI("lateExtensionField1");
static set Extension|lateExtensionField1(core::int? #t6) → void
  if(self::_#Extension|lateExtensionField1#isSet)
    throw new _in::LateError::fieldAI("lateExtensionField1");
  else {
    self::_#Extension|lateExtensionField1#isSet = true;
    self::_#Extension|lateExtensionField1 = #t6;
  }
static get Extension|lateExtensionField2() → core::int?
  return self::_#Extension|lateExtensionField2#isSet ?{core::int?} self::_#Extension|lateExtensionField2 : throw new _in::LateError::fieldNI("lateExtensionField2");
static set Extension|lateExtensionField2(core::int? #t7) → void
  if(self::_#Extension|lateExtensionField2#isSet)
    throw new _in::LateError::fieldAI("lateExtensionField2");
  else {
    self::_#Extension|lateExtensionField2#isSet = true;
    self::_#Extension|lateExtensionField2 = #t7;
  }
static method Extension|staticMethod() → dynamic {
  self::throws(() → core::int? => self::Extension|lateExtensionField2, "Read value from uninitialized Class.lateExtensionField2");
  self::Extension|lateExtensionField2 = 42;
  self::expect(42, self::Extension|lateExtensionField2);
  self::throws(() → core::int => self::Extension|lateExtensionField2 = 43, "Write value to initialized Class.lateExtensionField2");
}
static method main() → dynamic {
  self::throws(() → core::int? => self::lateTopLevelField, "Read value from uninitialized lateTopLevelField");
  self::lateTopLevelField = 123;
  self::expect(123, self::lateTopLevelField);
  self::throws(() → core::int => self::lateTopLevelField = 124, "Write value to initialized lateTopLevelField");
  self::throws(() → core::int? => self::Class::lateStaticField1, "Read value from uninitialized Class.lateStaticField1");
  self::Class::lateStaticField1 = 87;
  self::expect(87, self::Class::lateStaticField1);
  self::throws(() → core::int => self::Class::lateStaticField1 = 88, "Write value to initialized Class.lateStaticField1");
  self::Class::staticMethod();
  new self::Class::•<core::int?>().{self::Class::instanceMethod}(null){(core::int?) → dynamic};
  new self::Class::•<core::int?>().{self::Class::instanceMethod}(0){(core::int?) → dynamic};
  new self::Class::•<core::int>().{self::Class::instanceMethod}(0){(core::int) → dynamic};
  self::throws(() → core::int? => self::Extension|lateExtensionField1, "Read value from uninitialized Extension.lateExtensionField1");
  self::Extension|lateExtensionField1 = 87;
  self::expect(87, self::Extension|lateExtensionField1);
  self::throws(() → core::int => self::Extension|lateExtensionField1 = 88, "Write value to initialized Extension.lateExtensionField1");
  self::Extension|staticMethod();
}
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}";
}
