library;
import self as self;
import "dart:core" as core;
import "dart:async" as asy;

extension Extension on core::int* {
  method syncStarMethod = self::Extension|syncStarMethod;
  tearoff syncStarMethod = self::Extension|get#syncStarMethod;
  method asyncMethod = self::Extension|asyncMethod;
  tearoff asyncMethod = self::Extension|get#asyncMethod;
  method asyncStarMethod = self::Extension|asyncStarMethod;
  tearoff asyncStarMethod = self::Extension|get#asyncStarMethod;
}
static method Extension|syncStarMethod(lowered final core::int* #this) → dynamic /* originally sync* */ {
  function :sync_op_gen() → (core::_SyncIterator<dynamic>*, dynamic, dynamic) →* core::bool* {
    core::int* :await_jump_var = 0;
    dynamic :await_ctx_var;
    function :sync_op(core::_SyncIterator<dynamic>* :iterator, dynamic :exception, dynamic :stack_trace) → core::bool* yielding {
      {}
      return false;
    }
    return :sync_op;
  }
  return new core::_SyncIterable::•<dynamic>(:sync_op_gen);
}
static method Extension|get#syncStarMethod(lowered final core::int* #this) → () →* dynamic
  return () → dynamic => self::Extension|syncStarMethod(#this);
static method Extension|asyncMethod(lowered final core::int* #this) → dynamic /* originally async */ {
  final asy::_Future<dynamic>* :async_future = new asy::_Future::•<dynamic>();
  core::bool* :is_sync = false;
  FutureOr<dynamic>* :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:
      {}
      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.call();
  :is_sync = true;
  return :async_future;
}
static method Extension|get#asyncMethod(lowered final core::int* #this) → () →* dynamic
  return () → dynamic => self::Extension|asyncMethod(#this);
static method Extension|asyncStarMethod(lowered final core::int* #this) → dynamic /* originally async* */ {
  asy::_AsyncStarStreamController<dynamic>* :controller;
  dynamic :controller_stream;
  (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
      try {
        #L2:
        {}
        return;
      }
      on dynamic catch(dynamic exception, core::StackTrace* stack_trace) {
        :controller.{asy::_AsyncStarStreamController::addError}(exception, stack_trace);
      }
    finally {
      :controller.{asy::_AsyncStarStreamController::close}();
    }
  :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
  :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
  :controller = new asy::_AsyncStarStreamController::•<dynamic>(:async_op);
  :controller_stream = :controller.{asy::_AsyncStarStreamController::stream};
  return :controller_stream;
}
static method Extension|get#asyncStarMethod(lowered final core::int* #this) → () →* dynamic
  return () → dynamic => self::Extension|asyncStarMethod(#this);
static method main() → dynamic {
  self::Extension|syncStarMethod(0);
  self::Extension|get#syncStarMethod(0);
  self::Extension|asyncMethod(0);
  self::Extension|get#asyncMethod(0);
  self::Extension|asyncStarMethod(0);
  self::Extension|get#asyncStarMethod(0);
}
