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*>* /* originally async */ {
    final asy::_Future<typ::Response*>* :async_future = new asy::_Future::•<typ::Response*>();
    core::bool* :is_sync = false;
    FutureOr<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, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
      try {
        #L1:
        {
          :return_value = new typ::Response::•();
          break #L1;
        }
        asy::_completeOnAsyncReturn(: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(){() →* 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::•()
    ;
}
