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

  part myPart.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 /* futureValueType= dynamic */ /* originally async */ {
    final dart.async::_Future<dynamic>* :async_future = new dart.async::_Future::•<dynamic>();
    dart.core::bool* :is_sync = false;
    dynamic :return_value;
    (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_or_exception, dynamic :stack_trace) → dynamic yielding 
      try {
        #L1:
        {
          [yield] let dynamic #t1 = dart.async::_awaitHelper(main::whatever(), :async_op_then, :async_op_error) in null;
          :result_or_exception;
          dart.core::print(#C2);
          dart.core::print("Done!");
        }
        dart.async::_completeWithNoFutureOnAsyncReturn(:async_future, :return_value, :is_sync);
        return;
      }
      on dynamic catch(dynamic exception, dart.core::StackTrace* stack_trace) {
        dart.async::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
      }
    :async_op_then = dart.async::_asyncThenWrapperHelper(:async_op);
    :async_op_error = dart.async::_asyncErrorWrapperHelper(:async_op);
    :async_op(null, null){() →* dynamic};
    :is_sync = true;
    return :async_future;
  }
  static method /* from org-dartlang-test:///myPart.dart */ whatever() → dynamic /* futureValueType= dynamic */ /* originally async */ {
    final dart.async::_Future<dynamic>* :async_future = new dart.async::_Future::•<dynamic>();
    dart.core::bool* :is_sync = false;
    dynamic :return_value;
    (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_or_exception, dynamic :stack_trace) → dynamic yielding 
      try {
        #L2:
        {
          [yield] let dynamic #t2 = dart.async::_awaitHelper(null, :async_op_then, :async_op_error) in null;
          dart._internal::unsafeCast<Null>(:result_or_exception);
          :return_value = "hello!!!";
          break #L2;
        }
        dart.async::_completeWithNoFutureOnAsyncReturn(:async_future, :return_value, :is_sync);
        return;
      }
      on dynamic catch(dynamic exception, dart.core::StackTrace* stack_trace) {
        dart.async::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
      }
    :async_op_then = dart.async::_asyncThenWrapperHelper(:async_op);
    :async_op_error = dart.async::_asyncErrorWrapperHelper(:async_op);
    :async_op(null, null){() →* dynamic};
    :is_sync = true;
    return :async_future;
  }
}
constants  {
  #C1 = dart.core::_Override {}
  #C2 = main::Foo {}
}
