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*>();
    asy::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*>();
    asy::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* */ {
    core::int* :await_jump_var = 0;
    dynamic :await_ctx_var;
    function :sync_op(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);
  }
  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 {}
