library test;
import self as self;
import "dart:core" as core;
import "dart:async" as asy;

static method test() → dynamic {
  function f0() → core::int*
    return 42;
  function f1() → asy::Future<core::int*>* /* originally async */ {
    final asy::_AsyncAwaitCompleter<core::int*>* :async_completer = new asy::_AsyncAwaitCompleter::•<core::int*>();
    FutureOr<core::int*>* :return_value;
    dynamic :async_stack_trace;
    (dynamic) →* dynamic :async_op_then;
    (core::Object*, core::StackTrace*) →* dynamic :async_op_error;
    core::int* :await_jump_var = 0;
    dynamic :await_ctx_var;
    function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
      try {
        #L1:
        {
          :return_value = 42;
          break #L1;
        }
        asy::_completeOnAsyncReturn(:async_completer, :return_value);
        return;
      }
      on dynamic catch(dynamic exception, core::StackTrace* stack_trace) {
        :async_completer.{asy::Completer::completeError}(exception, stack_trace);
      }
    :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
    :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
    :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
    :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
    return :async_completer.{asy::Completer::future};
  }
  function f2() → core::int* {
    return 42;
  }
  function f3() → asy::Future<core::int*>* /* originally async */ {
    final asy::_AsyncAwaitCompleter<core::int*>* :async_completer = new asy::_AsyncAwaitCompleter::•<core::int*>();
    FutureOr<core::int*>* :return_value;
    dynamic :async_stack_trace;
    (dynamic) →* dynamic :async_op_then;
    (core::Object*, core::StackTrace*) →* dynamic :async_op_error;
    core::int* :await_jump_var = 0;
    dynamic :await_ctx_var;
    function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
      try {
        #L2:
        {
          :return_value = 42;
          break #L2;
        }
        asy::_completeOnAsyncReturn(:async_completer, :return_value);
        return;
      }
      on dynamic catch(dynamic exception, core::StackTrace* stack_trace) {
        :async_completer.{asy::Completer::completeError}(exception, stack_trace);
      }
    :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
    :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
    :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
    :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
    return :async_completer.{asy::Completer::future};
  }
  function f4() → core::Iterable<core::int*>* /* originally sync* */ {
    function :sync_op_gen() → (core::_SyncIterator<core::int*>*) →* core::bool* {
      core::int* :await_jump_var = 0;
      dynamic :await_ctx_var;
      return (core::_SyncIterator<core::int*>* :iterator) → core::bool* yielding {
        {
          {
            :iterator.{core::_SyncIterator::_current} = 42;
            [yield] true;
          }
        }
        return false;
      };
    }
    return new core::_SyncIterable::•<core::int*>(:sync_op_gen);
  }
  function f5() → asy::Stream<core::int*>* /* originally async* */ {
    asy::_AsyncStarStreamController<core::int*>* :controller;
    dynamic :controller_stream;
    dynamic :async_stack_trace;
    (dynamic) →* dynamic :async_op_then;
    (core::Object*, core::StackTrace*) →* dynamic :async_op_error;
    core::int* :await_jump_var = 0;
    dynamic :await_ctx_var;
    dynamic :saved_try_context_var0;
    dynamic :saved_try_context_var1;
    function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
      try
        try {
          #L3:
          {
            if(:controller.{asy::_AsyncStarStreamController::add}(42))
              return null;
            else
              [yield] null;
          }
          return;
        }
        on dynamic catch(dynamic exception, core::StackTrace* stack_trace) {
          :controller.{asy::_AsyncStarStreamController::addError}(exception, stack_trace);
        }
      finally {
        :controller.{asy::_AsyncStarStreamController::close}();
      }
    :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
    :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
    :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
    :controller = new asy::_AsyncStarStreamController::•<core::int*>(:async_op);
    :controller_stream = :controller.{asy::_AsyncStarStreamController::stream};
    return :controller_stream;
  }
  function f6() → core::num*
    return 42;
  function f7() → dynamic
    return f7.call();
  function f8() → asy::Stream<core::int*>*
    return f5.call();
  () →* core::int* v0 = f0;
  () →* asy::Future<core::int*>* v1 = f1;
  () →* core::int* v2 = f2;
  () →* asy::Future<core::int*>* v3 = f3;
  () →* core::Iterable<core::int*>* v4 = f4;
  () →* asy::Stream<core::int*>* v5 = f5;
  () →* core::num* v6 = f6;
  () →* dynamic v7 = f7;
  () →* asy::Stream<core::int*>* v8 = f8;
}
static method main() → dynamic {}
