library;
import self as self;
import "typedef_from_opt_in_lib.dart" as typ;
import "dart:async" as asy;
import "dart:core" as core;

import "org-dartlang-testcase:///typedef_from_opt_in_lib.dart";

static method method1() → (typ::Request*) →* FutureOr<typ::Response*>*
  return (typ::Request* r) → asy::Future<typ::Response*>* /* futureValueType= typ::Response* */ /* originally async */ {
    final asy::_Future<typ::Response*>* :async_future = new asy::_Future::•<typ::Response*>();
    core::bool* :is_sync = false;
    typ::Response? :return_value;
    (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_or_exception, dynamic :stack_trace) → dynamic yielding 
      try {
        #L1:
        {
          :return_value = new typ::Response::•();
          break #L1;
        }
        asy::_completeWithNoFutureOnAsyncReturn(:async_future, :return_value, :is_sync);
        return;
      }
      on dynamic catch(dynamic exception, core::StackTrace* stack_trace) {
        asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
      }
    :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
    :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
    :async_op(null, null){() →* dynamic};
    :is_sync = true;
    return :async_future;
  };
static method method2() → (core::int*) →* core::int*
  return (core::int* r) → core::int* => 0;
static method main() → dynamic {}

library /*isNonNullableByDefault*/;
import self as typ;
import "dart:core" as core;

import "dart:async";

typedef Handler = (typ::Request) → FutureOr<typ::Response>;
typedef Typedef = (core::int?) → core::int;
class Request extends core::Object {
  synthetic constructor •() → typ::Request
    : super core::Object::•()
    ;
}
class Response extends core::Object {
  synthetic constructor •() → typ::Response
    : super core::Object::•()
    ;
}
