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