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

class Statics extends core::Object {
  static field core::int? _#a = null;
  static field core::int? _#b = null;
  static field core::int? _#c = null;
  static field core::int? _#d = null;
  synthetic constructor •() → self::Statics
    : super core::Object::•()
    ;
  static get a() → core::int
    return let final core::int? #t1 = self::Statics::_#a in #t1 == null ?{core::int} throw new _in::LateError::fieldNI("a") : #t1{core::int};
  static set a(core::int #t2) → void
    self::Statics::_#a = #t2;
  static get b() → core::int
    return let final core::int? #t3 = self::Statics::_#b in #t3 == null ?{core::int} throw new _in::LateError::fieldNI("b") : #t3{core::int};
  static set b(core::int #t4) → void
    if(self::Statics::_#b == null)
      self::Statics::_#b = #t4;
    else
      throw new _in::LateError::fieldAI("b");
  static get c() → core::int
    return let final core::int? #t5 = self::Statics::_#c in #t5 == null ?{core::int} self::Statics::_#c = 1.{core::int::unary-}(){() → core::int} : #t5{core::int};
  static set c(core::int #t6) → void
    self::Statics::_#c = #t6;
  static get d() → core::int
    return let final core::int? #t7 = self::Statics::_#d in #t7 == null ?{core::int} let final core::int #t8 = 1.{core::int::unary-}(){() → core::int} in self::Statics::_#d == null ?{core::int} self::Statics::_#d = #t8 : throw new _in::LateError::fieldADI("d") : #t7{core::int};
}
static method main() → void {
  self::testUninitializedNonFinalStaticField();
  self::testUninitializedFinalStaticField();
  self::testInitializedNonFinalStaticField();
  self::testInitializedFinalStaticField();
}
static method testUninitializedNonFinalStaticField() → void {
  core::print(self::Statics::a);
  self::Statics::a = 42;
  core::print(self::Statics::a);
}
static method testUninitializedFinalStaticField() → void {
  core::print(self::Statics::b);
  self::Statics::b = 42;
  core::print(self::Statics::b);
}
static method testInitializedNonFinalStaticField() → void {
  core::print(self::Statics::c);
  self::Statics::c = 42;
  core::print(self::Statics::c);
}
static method testInitializedFinalStaticField() → void {
  core::print(self::Statics::d);
}
