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;
  generic-covariant-impl 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 {
    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 {
    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);
  }
  get lateInstanceField() → core::int?
    return this.{self::Class::_#Class#lateInstanceField#isSet} ?{core::int?} this.{self::Class::_#Class#lateInstanceField} : throw new _in::LateError::fieldNI("lateInstanceField");
  set lateInstanceField(core::int? #t3) → void {
    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} ?{self::Class::T?} this.{self::Class::_#Class#lateGenericInstanceField} : throw new _in::LateError::fieldNI("lateGenericInstanceField");
  set lateGenericInstanceField(generic-covariant-impl self::Class::T? #t4) → void {
    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(() → 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?});
  }
}
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 {
  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 {
  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 {
  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);
}
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::Class::lateStaticField1, "Read value from uninitialized Class.lateStaticField1");
  self::Class::lateStaticField1 = 87;
  self::expect(87, self::Class::lateStaticField1);
  self::Class::staticMethod();
  self::throws(() → core::int? => self::Extension|lateExtensionField1, "Read value from uninitialized Extension.lateExtensionField1");
  self::Extension|lateExtensionField1 = 87;
  self::expect(87, self::Extension|lateExtensionField1);
  self::Extension|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}(null){(core::int?) → dynamic};
  new self::Class::•<core::int>().{self::Class::instanceMethod}(0){(core::int?) → dynamic};
}
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();
  }
  on core::Error catch(final core::Error e) {
    core::print(e);
    return;
  }
  throw "${message}: ${value}";
}
