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::int? _#lateStaticField2 = null;
  field core::int? _#Class#lateInstanceField = null;
  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 let final core::int? #t1 = self::Class::_#lateStaticField1 in #t1.==(null) ?{core::int} throw new _in::LateInitializationErrorImpl::•("Field 'lateStaticField1' has not been initialized.") : #t1{core::int};
  static set lateStaticField1(core::int #t2) → void
    self::Class::_#lateStaticField1 = #t2;
  static get lateStaticField2() → core::int
    return let final core::int? #t3 = self::Class::_#lateStaticField2 in #t3.==(null) ?{core::int} throw new _in::LateInitializationErrorImpl::•("Field 'lateStaticField2' has not been initialized.") : #t3{core::int};
  static set lateStaticField2(core::int #t4) → void
    self::Class::_#lateStaticField2 = #t4;
  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 let final core::int? #t5 = this.{self::Class::_#Class#lateInstanceField} in #t5.==(null) ?{core::int} throw new _in::LateInitializationErrorImpl::•("Field 'lateInstanceField' has not been initialized.") : #t5{core::int};
  set lateInstanceField(core::int #t6) → void
    this.{self::Class::_#Class#lateInstanceField} = #t6;
  get lateGenericInstanceField() → self::Class::T%
    return this.{self::Class::_#Class#lateGenericInstanceField#isSet} ?{self::Class::T%} let final self::Class::T? #t7 = this.{self::Class::_#Class#lateGenericInstanceField} in #t7{self::Class::T%} : throw new _in::LateInitializationErrorImpl::•("Field 'lateGenericInstanceField' has not been initialized.");
  set lateGenericInstanceField(self::Class::T% #t8) → void {
    this.{self::Class::_#Class#lateGenericInstanceField#isSet} = true;
    this.{self::Class::_#Class#lateGenericInstanceField} = #t8;
  }
  method instanceMethod(generic-covariant-impl self::Class::T% value) → dynamic {
    self::throws(() → core::int => this.{self::Class::lateInstanceField}, "Read value from uninitialized Class.lateInstanceField");
    this.{self::Class::lateInstanceField} = 16;
    self::expect(16, this.{self::Class::lateInstanceField});
    self::throws(() → self::Class::T% => this.{self::Class::lateGenericInstanceField}, "Read value from uninitialized Class.lateGenericInstanceField");
    this.{self::Class::lateGenericInstanceField} = value;
    self::expect(value, this.{self::Class::lateGenericInstanceField});
  }
}
extension Extension<T extends core::Object? = dynamic> on self::Class<T%> {
  static field lateExtensionField1 = self::_#Extension|lateExtensionField1;
  static get lateExtensionField1 = get self::Extension|lateExtensionField1;
  static set lateExtensionField1 = set self::Extension|lateExtensionField1;
  static field lateExtensionField2 = self::_#Extension|lateExtensionField2;
  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::int? _#Extension|lateExtensionField1 = null;
static field core::int? _#Extension|lateExtensionField2 = null;
static get lateTopLevelField() → core::int
  return let final core::int? #t9 = self::_#lateTopLevelField in #t9.==(null) ?{core::int} throw new _in::LateInitializationErrorImpl::•("Field 'lateTopLevelField' has not been initialized.") : #t9{core::int};
static set lateTopLevelField(core::int #t10) → void
  self::_#lateTopLevelField = #t10;
static get Extension|lateExtensionField1() → core::int
  return let final core::int? #t11 = self::_#Extension|lateExtensionField1 in #t11.==(null) ?{core::int} throw new _in::LateInitializationErrorImpl::•("Field 'lateExtensionField1' has not been initialized.") : #t11{core::int};
static set Extension|lateExtensionField1(core::int #t12) → void
  self::_#Extension|lateExtensionField1 = #t12;
static get Extension|lateExtensionField2() → core::int
  return let final core::int? #t13 = self::_#Extension|lateExtensionField2 in #t13.==(null) ?{core::int} throw new _in::LateInitializationErrorImpl::•("Field 'lateExtensionField2' has not been initialized.") : #t13{core::int};
static set Extension|lateExtensionField2(core::int #t14) → void
  self::_#Extension|lateExtensionField2 = #t14;
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();
  new self::Class::•<core::int>().{self::Class::instanceMethod}(0);
  self::Class<core::int> c = new self::Class::•<core::int>();
  self::throws(() → core::int => c.{self::Class::lateInstanceField}, "Read value from uninitialized Class.lateInstanceField");
  c.{self::Class::lateInstanceField} = 16;
  self::expect(16, c.{self::Class::lateInstanceField});
  self::throws(() → core::int => c.{self::Class::lateGenericInstanceField}, "Read value from uninitialized Class.lateGenericInstanceField");
  c.{self::Class::lateGenericInstanceField} = 0;
  self::expect(0, c.{self::Class::lateGenericInstanceField});
  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();
}
static method expect(dynamic expected, dynamic actual) → dynamic {
  if(!expected.{core::Object::==}(actual))
    throw "Expected ${expected}, actual ${actual}";
}
static method throws(() → dynamic f, core::String message) → dynamic {
  dynamic value;
  try {
    value = f.call();
  }
  on core::LateInitializationError catch(final core::LateInitializationError e) {
    core::print(e);
    return;
  }
  throw "${message}: ${value}";
}
