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

class A extends core::Object {
  constructor •() → void
    : super core::Object::•()
    ;
}
static method foo() → dynamic /* originally async */ {
  final asy::Completer<asy::FutureOr<dynamic>> :completer = asy::Completer::sync<asy::FutureOr<dynamic>>();
  asy::FutureOr<dynamic> :return_value;
  dynamic :async_op_then;
  dynamic :async_op_error;
  dynamic :await_jump_var = 0;
  dynamic :await_ctx_var;
  dynamic :saved_try_context_var0;
  function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
    try {
      #L1:
      {
        asy::Future<core::List<self::A>> f1 = null;
        asy::Future<core::List<self::A>> f2 = null;
        asy::_awaitHelper(asy::Future::wait<core::List<self::A>>(<asy::Future<core::List<self::A>>>[f1, f2]), :async_op_then, :async_op_error, :async_op);
        [yield] null;
        core::List<core::List<self::A>> merged = :result;
      }
      :completer.complete(:return_value);
      return;
    }
    on dynamic catch(dynamic :exception, dynamic :stack_trace) {
      :completer.completeError(:exception, :stack_trace);
    }
  :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
  :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
  asy::Future::microtask<dynamic>(:async_op);
  return :completer.future;
}
static method main() → dynamic {}
