main = <No Member>;
library from "org-dartlang-test:///lib.dart" as lib {

  abstract class TestMixin<T extends dart.core::Object? = dynamic> extends dart.core::Object /*isMixinDeclaration*/  {
    method test(covariant-by-class dart.async::Future<lib::TestMixin::T%> fetch) → dart.async::Future<lib::TestMixin::T%> /* futureValueType= lib::TestMixin::T% */ /* originally async */ {
      final dart.async::_Future<lib::TestMixin::T%> :async_future = new dart.async::_Future::•<lib::TestMixin::T%>();
      dart.core::bool* :is_sync = false;
      FutureOr<lib::TestMixin::T%>? :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(fetch, :async_op_then, :async_op_error) in null;
            final lib::TestMixin::T% response = dart._internal::unsafeCast<lib::TestMixin::T%>(:result_or_exception);
            :return_value = response;
            break #L1;
          }
          dart.async::_completeOnAsyncReturn(: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;
    }
  }
}
library from "org-dartlang-test:///main.dart" as main {

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

  abstract class _Class2&Object&TestMixin extends dart.core::Object implements lib::TestMixin<dart.core::String> /*isAnonymousMixin,isEliminatedMixin,hasConstConstructor*/  {
    const synthetic constructor •() → main::_Class2&Object&TestMixin
      : super dart.core::Object::•()
      ;
    method /* from org-dartlang-test:///lib.dart */ test(covariant-by-class dart.async::Future<dart.core::String> fetch) → dart.async::Future<dart.core::String> /* futureValueType= dart.core::String */ /* originally async */ {
      final dart.async::_Future<dart.core::String> :async_future = new dart.async::_Future::•<dart.core::String>();
      dart.core::bool* :is_sync = false;
      FutureOr<dart.core::String>? :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(fetch, :async_op_then, :async_op_error) in null;
            final dart.core::String response = dart._internal::unsafeCast<dart.core::String>(:result_or_exception);
            :return_value = response;
            break #L2;
          }
          dart.async::_completeOnAsyncReturn(: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;
    }
  }
  class Class2 extends main::_Class2&Object&TestMixin {
    synthetic constructor •() → main::Class2
      : super main::_Class2&Object&TestMixin::•()
      ;
  }
}
