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

import "org-dartlang-testcase:///initializer_rewrite_from_opt_out_lib.dart";

class Class extends core::Object {
  static field core::int nonNullableStaticFieldReads = 0;
  static field core::int? _#nonNullableStaticField = null;
  static field core::bool _#nonNullableStaticField#isSet = false;
  static field core::int nullableStaticFieldReads = 0;
  static field core::int? _#nullableStaticField = null;
  static field core::bool _#nullableStaticField#isSet = false;
  field core::int nonNullableInstanceFieldReads = 0;
  field core::int? _#Class#nonNullableInstanceField = null;
  field core::bool _#Class#nonNullableInstanceField#isSet = false;
  field core::int nullableInstanceFieldReads = 0;
  field core::int? _#Class#nullableInstanceField = null;
  field core::bool _#Class#nullableInstanceField#isSet = false;
  synthetic constructor •() → self::Class
    : super core::Object::•()
    ;
  static get nonNullableStaticField() → core::int {
    if(!self::Class::_#nonNullableStaticField#isSet) {
      final core::int #t1 = (let final core::int #t2 = self::Class::nonNullableStaticFieldReads in let final core::int #t3 = self::Class::nonNullableStaticFieldReads = #t2.{core::num::+}(1) in #t2).{core::num::==}(0) ?{core::int*} self::Class::nonNullableStaticField : ini::computeInitialValue();
      if(self::Class::_#nonNullableStaticField#isSet)
        throw new _in::LateError::fieldADI("nonNullableStaticField");
      self::Class::_#nonNullableStaticField = #t1;
      self::Class::_#nonNullableStaticField#isSet = true;
    }
    return let final core::int? #t4 = self::Class::_#nonNullableStaticField in #t4{core::int};
  }
  static get nullableStaticField() → core::int? {
    if(!self::Class::_#nullableStaticField#isSet) {
      final core::int? #t5 = (let final core::int #t6 = self::Class::nullableStaticFieldReads in let final core::int #t7 = self::Class::nullableStaticFieldReads = #t6.{core::num::+}(1) in #t6).{core::num::==}(0) ?{core::int?} self::Class::nullableStaticField : ini::computeInitialValue();
      if(self::Class::_#nullableStaticField#isSet)
        throw new _in::LateError::fieldADI("nullableStaticField");
      self::Class::_#nullableStaticField = #t5;
      self::Class::_#nullableStaticField#isSet = true;
    }
    return self::Class::_#nullableStaticField;
  }
  get nonNullableInstanceField() → core::int {
    if(!this.{self::Class::_#Class#nonNullableInstanceField#isSet}) {
      final core::int #t8 = (let final core::int #t9 = this.{self::Class::nonNullableInstanceFieldReads} in let final core::int #t10 = this.{self::Class::nonNullableInstanceFieldReads} = #t9.{core::num::+}(1) in #t9).{core::num::==}(0) ?{core::int*} this.{self::Class::nonNullableInstanceField} : ini::computeInitialValue();
      if(this.{self::Class::_#Class#nonNullableInstanceField#isSet})
        throw new _in::LateError::fieldADI("nonNullableInstanceField");
      this.{self::Class::_#Class#nonNullableInstanceField} = #t8;
      this.{self::Class::_#Class#nonNullableInstanceField#isSet} = true;
    }
    return let final core::int? #t11 = this.{self::Class::_#Class#nonNullableInstanceField} in #t11{core::int};
  }
  get nullableInstanceField() → core::int? {
    if(!this.{self::Class::_#Class#nullableInstanceField#isSet}) {
      final core::int? #t12 = (let final core::int #t13 = this.{self::Class::nullableInstanceFieldReads} in let final core::int #t14 = this.{self::Class::nullableInstanceFieldReads} = #t13.{core::num::+}(1) in #t13).{core::num::==}(0) ?{core::int?} this.{self::Class::nullableInstanceField} : ini::computeInitialValue();
      if(this.{self::Class::_#Class#nullableInstanceField#isSet})
        throw new _in::LateError::fieldADI("nullableInstanceField");
      this.{self::Class::_#Class#nullableInstanceField} = #t12;
      this.{self::Class::_#Class#nullableInstanceField#isSet} = true;
    }
    return this.{self::Class::_#Class#nullableInstanceField};
  }
}
static field core::int nonNullableTopLevelFieldReads = 0;
static field core::int? _#nonNullableTopLevelField = null;
static field core::bool _#nonNullableTopLevelField#isSet = false;
static field core::int nullableTopLevelFieldReads = 0;
static field core::int? _#nullableTopLevelField = null;
static field core::bool _#nullableTopLevelField#isSet = false;
static get nonNullableTopLevelField() → core::int {
  if(!self::_#nonNullableTopLevelField#isSet) {
    final core::int #t15 = (let final core::int #t16 = self::nonNullableTopLevelFieldReads in let final core::int #t17 = self::nonNullableTopLevelFieldReads = #t16.{core::num::+}(1) in #t16).{core::num::==}(0) ?{core::int*} self::nonNullableTopLevelField : ini::computeInitialValue();
    if(self::_#nonNullableTopLevelField#isSet)
      throw new _in::LateError::fieldADI("nonNullableTopLevelField");
    self::_#nonNullableTopLevelField = #t15;
    self::_#nonNullableTopLevelField#isSet = true;
  }
  return let final core::int? #t18 = self::_#nonNullableTopLevelField in #t18{core::int};
}
static get nullableTopLevelField() → core::int? {
  if(!self::_#nullableTopLevelField#isSet) {
    final core::int? #t19 = (let final core::int #t20 = self::nullableTopLevelFieldReads in let final core::int #t21 = self::nullableTopLevelFieldReads = #t20.{core::num::+}(1) in #t20).{core::num::==}(0) ?{core::int?} self::nullableTopLevelField : ini::computeInitialValue();
    if(self::_#nullableTopLevelField#isSet)
      throw new _in::LateError::fieldADI("nullableTopLevelField");
    self::_#nullableTopLevelField = #t19;
    self::_#nullableTopLevelField#isSet = true;
  }
  return self::_#nullableTopLevelField;
}
static method main() → void {
  self::throws(() → core::int => self::nonNullableTopLevelField, "Read nonNullableTopLevelField");
  self::throws(() → core::int? => self::nullableTopLevelField, "Read nullableTopLevelField");
  self::throws(() → core::int => self::Class::nonNullableStaticField, "Read nonNullableStaticField");
  self::throws(() → core::int? => self::Class::nullableStaticField, "Read nullableStaticField");
  self::throws(() → core::int => new self::Class::•().{self::Class::nonNullableInstanceField}, "Read nonNullableInstanceField");
  self::throws(() → core::int? => new self::Class::•().{self::Class::nullableInstanceField}, "Read nullableInstanceField");
}
static method throws(() → dynamic f, core::String message) → dynamic {
  dynamic value;
  try {
    value = f.call();
  }
  on core::LateInitializationError catch(final core::LateInitializationError e) {
    core::print(e);
    return;
  }
  throw "${message}: ${value}";
}

library;
import self as ini;
import "dart:core" as core;

static method computeInitialValue() → core::int*
  return null;
