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;
    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::_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(){() →* 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::•()
    ;
}
