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

static method lateLocalInit() → core::int?
  return 123;
static method main() → dynamic {
  core::int? lateLocal;
  core::bool #lateLocal#isSet = false;
  function #lateLocal#get() → core::int? {
    if(!#lateLocal#isSet) {
      lateLocal = self::lateLocalInit();
      #lateLocal#isSet = true;
    }
    return lateLocal;
  }
  function #lateLocal#set(core::int? #t1) → dynamic {
    #lateLocal#isSet = true;
    return lateLocal = #t1;
  }
  self::expect(123, #lateLocal#get.call());
  self::expect(124, #lateLocal#set.call(124));
  self::expect(124, #lateLocal#get.call());
  function local<T extends core::Object? = dynamic>(T? value1, T? value2) → Null {
    T? lateGenericLocal;
    core::bool #lateGenericLocal#isSet = false;
    function #lateGenericLocal#get() → T? {
      if(!#lateGenericLocal#isSet) {
        lateGenericLocal = value1;
        #lateGenericLocal#isSet = true;
      }
      return lateGenericLocal;
    }
    function #lateGenericLocal#set(T? #t2) → dynamic {
      #lateGenericLocal#isSet = true;
      return lateGenericLocal = #t2;
    }
    self::expect(value1, #lateGenericLocal#get.call());
    self::expect(value2, #lateGenericLocal#set.call(value2));
    self::expect(value2, #lateGenericLocal#get.call());
  }
  local.call<core::int?>(null, 0);
  local.call<core::int?>(0, null);
  local.call<core::int>(null, 0);
  local.call<core::int>(0, null);
}
static method expect(dynamic expected, dynamic actual) → dynamic {
  if(!expected.{core::Object::==}(actual))
    throw "Expected ${expected}, actual ${actual}";
}
