main = main::main;
library from "org-dartlang-test:///libA.dart" as libA {

  static method whatever() → dynamic /* originally async */ {
    final dart.async::_AsyncAwaitCompleter<dynamic>* :async_completer = new dart.async::_AsyncAwaitCompleter::•<dynamic>();
    FutureOr<dynamic>* :return_value;
    dynamic :async_stack_trace;
    (dynamic) →* dynamic :async_op_then;
    (dart.core::Object*, dart.core::StackTrace*) →* dynamic :async_op_error;
    dart.core::int* :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:
        {
          [yield] let dynamic #t1 = dart.async::_awaitHelper(null, :async_op_then, :async_op_error, :async_op) in null;
          dart._internal::unsafeCast<dart.core::Null?>(:result);
          :return_value = "hello";
          break #L1;
        }
        dart.async::_completeOnAsyncReturn(:async_completer, :return_value);
        return;
      }
      on dynamic catch(dynamic exception, dart.core::StackTrace* stack_trace) {
        :async_completer.{dart.async::Completer::completeError}(exception, stack_trace);
      }
    :async_stack_trace = dart.async::_asyncStackTraceHelper(:async_op);
    :async_op_then = dart.async::_asyncThenWrapperHelper(:async_op);
    :async_op_error = dart.async::_asyncErrorWrapperHelper(:async_op);
    :async_completer.{dart.async::_AsyncAwaitCompleter::start}(:async_op);
    return :async_completer.{dart.async::Completer::future};
  }
}
library from "org-dartlang-test:///main.dart" as main {

  import "org-dartlang-test:///libA.dart";

  class Foo extends dart.core::Object /*hasConstConstructor*/  {
    const constructor •() → main::Foo*
      : super dart.core::Object::•()
      ;
    @#C1
    method toString() → dart.core::String*
      return "Foo!";
    abstract member-signature get _identityHashCode() → dart.core::int*; -> dart.core::Object::_identityHashCode
    abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → dart.core::bool*; -> dart.core::Object::_instanceOf
    abstract member-signature method _simpleInstanceOf(dynamic type) → dart.core::bool*; -> dart.core::Object::_simpleInstanceOf
    abstract member-signature method _simpleInstanceOfTrue(dynamic type) → dart.core::bool*; -> dart.core::Object::_simpleInstanceOfTrue
    abstract member-signature method _simpleInstanceOfFalse(dynamic type) → dart.core::bool*; -> dart.core::Object::_simpleInstanceOfFalse
    abstract member-signature operator ==(dynamic other) → dart.core::bool*; -> dart.core::Object::==
    abstract member-signature get hashCode() → dart.core::int*; -> dart.core::Object::hashCode
    abstract member-signature method noSuchMethod(dart.core::Invocation* invocation) → dynamic; -> dart.core::Object::noSuchMethod
    abstract member-signature get runtimeType() → dart.core::Type*; -> dart.core::Object::runtimeType
  }
  static method main() → dynamic /* originally async */ {
    final dart.async::_AsyncAwaitCompleter<dynamic>* :async_completer = new dart.async::_AsyncAwaitCompleter::•<dynamic>();
    FutureOr<dynamic>* :return_value;
    dynamic :async_stack_trace;
    (dynamic) →* dynamic :async_op_then;
    (dart.core::Object*, dart.core::StackTrace*) →* dynamic :async_op_error;
    dart.core::int* :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 {
        #L2:
        {
          [yield] let dynamic #t2 = dart.async::_awaitHelper(libA::whatever(), :async_op_then, :async_op_error, :async_op) in null;
          :result;
          dart.core::print(#C2);
        }
        dart.async::_completeOnAsyncReturn(:async_completer, :return_value);
        return;
      }
      on dynamic catch(dynamic exception, dart.core::StackTrace* stack_trace) {
        :async_completer.{dart.async::Completer::completeError}(exception, stack_trace);
      }
    :async_stack_trace = dart.async::_asyncStackTraceHelper(:async_op);
    :async_op_then = dart.async::_asyncThenWrapperHelper(:async_op);
    :async_op_error = dart.async::_asyncErrorWrapperHelper(:async_op);
    :async_completer.{dart.async::_AsyncAwaitCompleter::start}(:async_op);
    return :async_completer.{dart.async::Completer::future};
  }
}
constants  {
  #C1 = dart.core::_Override {}
  #C2 = main::Foo {}
}
