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 {
    if(!this.{self::A::_#A#nonNullableInstanceField#isSet}{core::bool}) {
      this.{self::A::_#A#nonNullableInstanceField} = 0;
      this.{self::A::_#A#nonNullableInstanceField#isSet} = true;
    }
    return let final core::int? #t1 = this.{self::A::_#A#nonNullableInstanceField}{core::int?} in #t1{core::int};
  }
  set nonNullableInstanceField(core::int nonNullableInstanceField#param) → void {
    this.{self::A::_#A#nonNullableInstanceField#isSet} = true;
    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 {
    if(!self::A::_#nonNullableStaticField#isSet) {
      self::A::_#nonNullableStaticField = 0;
      self::A::_#nonNullableStaticField#isSet = true;
    }
    return let final core::int? #t2 = self::A::_#nonNullableStaticField in #t2{core::int};
  }
  static set nonNullableStaticField(core::int nonNullableStaticField#param) → void {
    self::A::_#nonNullableStaticField#isSet = true;
    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 {
  if(!self::_#nonNullableTopLevelField#isSet) {
    self::_#nonNullableTopLevelField = 0;
    self::_#nonNullableTopLevelField#isSet = true;
  }
  return let final core::int? #t3 = self::_#nonNullableTopLevelField in #t3{core::int};
}
static set nonNullableTopLevelField(core::int nonNullableTopLevelField#param) → void {
  self::_#nonNullableTopLevelField#isSet = true;
  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 {}
