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

class A extends core::Object {
  field core::int? _#A#nonNullableInstanceField = null;
  field core::bool _#A#nonNullableInstanceField#isSet = false;
  field core::int? _#A#nullableInstanceField = null;
  field core::bool _#A#nullableInstanceField#isSet = false;
  static field core::int? _#nonNullableStaticField = null;
  static field core::bool _#nonNullableStaticField#isSet = false;
  static field core::int? _#nullableStaticField = null;
  static field core::bool _#nullableStaticField#isSet = false;
  synthetic constructor •() → self::A
    : super core::Object::•()
    ;
  get nonNullableInstanceField() → core::int
    return let final core::int? #t1 = this.{self::A::_#A#nonNullableInstanceField}{core::int?} in #t1 == null ?{core::int} this.{self::A::_#A#nonNullableInstanceField} = 0 : #t1{core::int};
  set nonNullableInstanceField(core::int nonNullableInstanceField#param) → void
    this.{self::A::_#A#nonNullableInstanceField} = nonNullableInstanceField#param;
  get nullableInstanceField() → core::int? {
    if(!this.{self::A::_#A#nullableInstanceField#isSet}{core::bool}) {
      this.{self::A::_#A#nullableInstanceField} = self::method();
      this.{self::A::_#A#nullableInstanceField#isSet} = true;
    }
    return this.{self::A::_#A#nullableInstanceField}{core::int?};
  }
  set nullableInstanceField(core::int? nullableInstanceField#param) → void {
    this.{self::A::_#A#nullableInstanceField#isSet} = true;
    this.{self::A::_#A#nullableInstanceField} = nullableInstanceField#param;
  }
  static get nonNullableStaticField() → core::int
    return let final core::int? #t2 = self::A::_#nonNullableStaticField in #t2 == null ?{core::int} self::A::_#nonNullableStaticField = 0 : #t2{core::int};
  static set nonNullableStaticField(core::int nonNullableStaticField#param) → void
    self::A::_#nonNullableStaticField = nonNullableStaticField#param;
  static get nullableStaticField() → core::int? {
    if(!self::A::_#nullableStaticField#isSet) {
      self::A::_#nullableStaticField = self::method();
      self::A::_#nullableStaticField#isSet = true;
    }
    return self::A::_#nullableStaticField;
  }
  static set nullableStaticField(core::int? nullableStaticField#param) → void {
    self::A::_#nullableStaticField#isSet = true;
    self::A::_#nullableStaticField = nullableStaticField#param;
  }
}
class B extends self::A {
  synthetic constructor •() → self::B
    : super self::A::•()
    ;
  get nonNullableInstanceField() → core::int
    return 0;
  set nonNullableInstanceField(core::int value) → void {}
  get nullableInstanceField() → core::int?
    return 0;
  set nullableInstanceField(core::int? value) → void {}
}
static field core::int? _#nonNullableTopLevelField = null;
static field core::bool _#nonNullableTopLevelField#isSet = false;
static field core::int? _#nullableTopLevelField = null;
static field core::bool _#nullableTopLevelField#isSet = false;
static method method() → core::int?
  return null;
static get nonNullableTopLevelField() → core::int
  return let final core::int? #t3 = self::_#nonNullableTopLevelField in #t3 == null ?{core::int} self::_#nonNullableTopLevelField = 0 : #t3{core::int};
static set nonNullableTopLevelField(core::int nonNullableTopLevelField#param) → void
  self::_#nonNullableTopLevelField = nonNullableTopLevelField#param;
static get nullableTopLevelField() → core::int? {
  if(!self::_#nullableTopLevelField#isSet) {
    self::_#nullableTopLevelField = self::method();
    self::_#nullableTopLevelField#isSet = true;
  }
  return self::_#nullableTopLevelField;
}
static set nullableTopLevelField(core::int? nullableTopLevelField#param) → void {
  self::_#nullableTopLevelField#isSet = true;
  self::_#nullableTopLevelField = nullableTopLevelField#param;
}
static method main() → dynamic {}
