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

static method main() → dynamic {
  core::bool b = false;
  final core::int? lateLocal;
  core::bool #lateLocal#isSet = false;
  function #lateLocal#get() → core::int
    return #lateLocal#isSet ?{core::int} lateLocal{core::int} : throw new _in::LateInitializationErrorImpl::•("Local 'lateLocal' has not been initialized.");
  function #lateLocal#set(core::int #t1) → dynamic
    if(#lateLocal#isSet)
      throw new _in::LateInitializationErrorImpl::•("Local 'lateLocal' has already been initialized.");
    else {
      #lateLocal#isSet = true;
      return lateLocal = #t1;
    }
  if(b) {
    #lateLocal#set.call(123);
  }
  self::throws(() → core::int => #lateLocal#get.call(), "Read value from uninitialized lateLocal");
  if(!b) {
    self::expect(123, #lateLocal#set.call(123));
    self::expect(123, #lateLocal#get.call());
  }
  self::throws(() → core::int => #lateLocal#set.call(124), "Write value to initialized lateLocal");
  function local<T extends core::Object? = dynamic>(T% value) → core::Null? {
    final T? lateGenericLocal;
    core::bool #lateGenericLocal#isSet = false;
    function #lateGenericLocal#get() → T%
      return #lateGenericLocal#isSet ?{T%} lateGenericLocal{T%} : throw new _in::LateInitializationErrorImpl::•("Local 'lateGenericLocal' has not been initialized.");
    function #lateGenericLocal#set(T% #t2) → dynamic
      if(#lateGenericLocal#isSet)
        throw new _in::LateInitializationErrorImpl::•("Local 'lateGenericLocal' has already been initialized.");
      else {
        #lateGenericLocal#isSet = true;
        return lateGenericLocal = #t2;
      }
    if(b) {
      #lateGenericLocal#set.call(value);
    }
    self::throws(() → T% => #lateGenericLocal#get.call(), "Read value from uninitialized lateGenericLocal");
    if(!b) {
      self::expect(value, #lateGenericLocal#set.call(value));
      self::expect(value, #lateGenericLocal#get.call());
    }
    self::throws(() → T% => #lateGenericLocal#set.call(value), "Write value to initialized lateGenericLocal");
  }
  local.call<core::int?>(null);
  local.call<core::int?>(42);
  local.call<core::int>(42);
}
static method expect(dynamic expected, dynamic actual) → dynamic {
  if(!expected.{core::Object::==}(actual))
    throw "Expected ${expected}, actual ${actual}";
}
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}";
}
