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){(core::num) → core::int} in #t2) =={core::num::==}{(core::Object) → core::bool} 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){(core::num) → core::int} in #t6) =={core::num::==}{(core::Object) → core::bool} 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}{core::bool}) {
      final core::int #t8 = (let final core::int #t9 = this.{self::Class::nonNullableInstanceFieldReads}{core::int} in let final core::int #t10 = this.{self::Class::nonNullableInstanceFieldReads} = #t9.{core::num::+}(1){(core::num) → core::int} in #t9) =={core::num::==}{(core::Object) → core::bool} 0 ?{core::int*} this.{self::Class::nonNullableInstanceField}{core::int} : ini::computeInitialValue();
      if(this.{self::Class::_#Class#nonNullableInstanceField#isSet}{core::bool})
        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}{core::int?} in #t11{core::int};
  }
  get nullableInstanceField() → core::int? {
    if(!this.{self::Class::_#Class#nullableInstanceField#isSet}{core::bool}) {
      final core::int? #t12 = (let final core::int #t13 = this.{self::Class::nullableInstanceFieldReads}{core::int} in let final core::int #t14 = this.{self::Class::nullableInstanceFieldReads} = #t13.{core::num::+}(1){(core::num) → core::int} in #t13) =={core::num::==}{(core::Object) → core::bool} 0 ?{core::int?} this.{self::Class::nullableInstanceField}{core::int?} : ini::computeInitialValue();
      if(this.{self::Class::_#Class#nullableInstanceField#isSet}{core::bool})
        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}{core::int?};
  }
}
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){(core::num) → core::int} in #t16) =={core::num::==}{(core::Object) → core::bool} 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){(core::num) → core::int} in #t20) =={core::num::==}{(core::Object) → core::bool} 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}{core::int}, "Read nonNullableInstanceField");
  self::throws(() → core::int? => new self::Class::•().{self::Class::nullableInstanceField}{core::int?}, "Read nullableInstanceField");
}
static method throws(() → dynamic f, core::String message) → dynamic {
  dynamic value;
  try {
    value = f(){() → dynamic};
  }
  on core::Error catch(final core::Error 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;
