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;
  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
    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} 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}) {
      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} 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}{self::Class::T%};
      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}{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}";
}
