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

static method main(core::List<core::String> args) → dynamic {
  lowered () →? core::int #recursiveInitLocal;
  lowered core::bool #recursiveInitLocal#isSet = false;
  function #recursiveInitLocal#get() → () → core::int
    return #recursiveInitLocal#isSet ?{() → core::int} #recursiveInitLocal{() → core::int} : throw new _in::LateError::localNI("recursiveInitLocal");
  function #recursiveInitLocal#set(() → core::int recursiveInitLocal#param) → dynamic {
    #recursiveInitLocal#isSet = true;
    return #recursiveInitLocal = recursiveInitLocal#param;
  }
  lowered final core::int? #local;
  lowered core::bool #local#isSet = false;
  function #local#get() → core::int {
    if(!#local#isSet) {
      final core::int #t1 = #recursiveInitLocal#get(){() → () → core::int}(){() → core::int};
      if(#local#isSet)
        throw new _in::LateError::localADI("local");
      #local = #t1;
      #local#isSet = true;
    }
    return #local{core::int};
  }
  core::bool doRecursiveInitLocal = true;
  #recursiveInitLocal#set(() → core::int {
    core::print("Executing initializer");
    if(doRecursiveInitLocal) {
      doRecursiveInitLocal = false;
      core::print("Trigger recursive initialization");
      core::int val = #local#get(){() → core::int};
      core::print("Final local has value ${val}");
      core::print("Returning 4 from initializer");
      return 4;
    }
    core::print("Returning 3 from initializer");
    return 3;
  }){(() → core::int) → dynamic};
  self::throws(() → Null {
    core::int val = #local#get(){() → core::int};
    core::print("Final local has value ${val}");
  }, "Read local");
}
static method expect(dynamic expected, dynamic actual) → dynamic {
  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
    throw "Expected ${expected}, actual ${actual}";
}
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}";
}
