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

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;
  final field self::Class::T% field;
  generic-covariant-impl field self::Class::T? _#Class#lateGenericField1 = null;
  field core::bool _#Class#lateGenericField1#isSet = false;
  generic-covariant-impl field self::Class::T? _#Class#lateGenericField2 = null;
  field core::bool _#Class#lateGenericField2#isSet = false;
  constructor •(self::Class::T% field) → self::Class<self::Class::T%>
    : self::Class::field = field, super core::Object::•()
    ;
  static get lateStaticField1() → core::int {
    if(!self::Class::_#lateStaticField1#isSet) {
      self::Class::_#lateStaticField1 = 87;
      self::Class::_#lateStaticField1#isSet = true;
    }
    return let final core::int? #t1 = self::Class::_#lateStaticField1 in #t1{core::int};
  }
  static set lateStaticField1(core::int #t2) → void {
    self::Class::_#lateStaticField1#isSet = true;
    self::Class::_#lateStaticField1 = #t2;
  }
  static get lateStaticField2() → core::int {
    if(!self::Class::_#lateStaticField2#isSet) {
      self::Class::_#lateStaticField2 = 42;
      self::Class::_#lateStaticField2#isSet = true;
    }
    return let final core::int? #t3 = self::Class::_#lateStaticField2 in #t3{core::int};
  }
  static set lateStaticField2(core::int #t4) → void {
    self::Class::_#lateStaticField2#isSet = true;
    self::Class::_#lateStaticField2 = #t4;
  }
  static method staticMethod() → dynamic {
    self::expect(42, self::Class::lateStaticField2);
    self::Class::lateStaticField2 = 43;
    self::expect(43, self::Class::lateStaticField2);
  }
  get lateInstanceField() → core::int {
    if(!this.{self::Class::_#Class#lateInstanceField#isSet}) {
      this.{self::Class::_#Class#lateInstanceField} = 16;
      this.{self::Class::_#Class#lateInstanceField#isSet} = true;
    }
    return let final core::int? #t5 = this.{self::Class::_#Class#lateInstanceField} in #t5{core::int};
  }
  set lateInstanceField(core::int #t6) → void {
    this.{self::Class::_#Class#lateInstanceField#isSet} = true;
    this.{self::Class::_#Class#lateInstanceField} = #t6;
  }
  get lateGenericField1() → self::Class::T% {
    if(!this.{self::Class::_#Class#lateGenericField1#isSet}) {
      this.{self::Class::_#Class#lateGenericField1} = this.{self::Class::field};
      this.{self::Class::_#Class#lateGenericField1#isSet} = true;
    }
    return let final self::Class::T? #t7 = this.{self::Class::_#Class#lateGenericField1} in #t7{self::Class::T%};
  }
  set lateGenericField1(generic-covariant-impl self::Class::T% #t8) → void {
    this.{self::Class::_#Class#lateGenericField1#isSet} = true;
    this.{self::Class::_#Class#lateGenericField1} = #t8;
  }
  get lateGenericField2() → self::Class::T% {
    if(!this.{self::Class::_#Class#lateGenericField2#isSet}) {
      this.{self::Class::_#Class#lateGenericField2} = this.{self::Class::field};
      this.{self::Class::_#Class#lateGenericField2#isSet} = true;
    }
    return let final self::Class::T? #t9 = this.{self::Class::_#Class#lateGenericField2} in #t9{self::Class::T%};
  }
  set lateGenericField2(generic-covariant-impl self::Class::T% #t10) → void {
    this.{self::Class::_#Class#lateGenericField2#isSet} = true;
    this.{self::Class::_#Class#lateGenericField2} = #t10;
  }
  method instanceMethod(generic-covariant-impl self::Class::T% value) → dynamic {
    self::expect(16, this.{self::Class::lateInstanceField});
    this.{self::Class::lateInstanceField} = 17;
    self::expect(17, this.{self::Class::lateInstanceField});
    self::expect(this.{self::Class::field}, this.{self::Class::lateGenericField1});
    this.{self::Class::lateGenericField1} = value;
    self::expect(value, this.{self::Class::lateGenericField1});
    this.{self::Class::lateGenericField2} = value;
    self::expect(value, this.{self::Class::lateGenericField2});
  }
}
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? _#lateTopLevelField1 = null;
static field core::bool _#lateTopLevelField1#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 lateTopLevelField1() → core::int {
  if(!self::_#lateTopLevelField1#isSet) {
    self::_#lateTopLevelField1 = 123;
    self::_#lateTopLevelField1#isSet = true;
  }
  return let final core::int? #t11 = self::_#lateTopLevelField1 in #t11{core::int};
}
static set lateTopLevelField1(core::int #t12) → void {
  self::_#lateTopLevelField1#isSet = true;
  self::_#lateTopLevelField1 = #t12;
}
static get Extension|lateExtensionField1() → core::int {
  if(!self::_#Extension|lateExtensionField1#isSet) {
    self::_#Extension|lateExtensionField1 = 87;
    self::_#Extension|lateExtensionField1#isSet = true;
  }
  return let final core::int? #t13 = self::_#Extension|lateExtensionField1 in #t13{core::int};
}
static set Extension|lateExtensionField1(core::int #t14) → void {
  self::_#Extension|lateExtensionField1#isSet = true;
  self::_#Extension|lateExtensionField1 = #t14;
}
static get Extension|lateExtensionField2() → core::int {
  if(!self::_#Extension|lateExtensionField2#isSet) {
    self::_#Extension|lateExtensionField2 = 42;
    self::_#Extension|lateExtensionField2#isSet = true;
  }
  return let final core::int? #t15 = self::_#Extension|lateExtensionField2 in #t15{core::int};
}
static set Extension|lateExtensionField2(core::int #t16) → void {
  self::_#Extension|lateExtensionField2#isSet = true;
  self::_#Extension|lateExtensionField2 = #t16;
}
static method Extension|staticMethod() → dynamic {
  self::expect(42, self::Extension|lateExtensionField2);
  self::Extension|lateExtensionField2 = 43;
  self::expect(43, self::Extension|lateExtensionField2);
}
static method main() → dynamic {
  self::expect(123, self::lateTopLevelField1);
  self::lateTopLevelField1 = 124;
  self::expect(124, self::lateTopLevelField1);
  self::expect(87, self::Class::lateStaticField1);
  self::Class::lateStaticField1 = 88;
  self::expect(88, self::Class::lateStaticField1);
  self::Class::staticMethod();
  new self::Class::•<core::int>(0).{self::Class::instanceMethod}(42);
  self::expect(87, self::Extension|lateExtensionField1);
  self::Extension|lateExtensionField1 = 88;
  self::expect(88, self::Extension|lateExtensionField1);
  self::Extension|staticMethod();
}
static method expect(dynamic expected, dynamic actual) → dynamic {
  if(!expected.{core::Object::==}(actual))
    throw "Expected ${expected}, actual ${actual}";
}
