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(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(final core::int* #this) → () →* dynamic
  return () → dynamic => self::Extension|syncStarMethod(#this);
static method Extension|asyncMethod(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(final core::int* #this) → () →* dynamic
  return () → dynamic => self::Extension|asyncMethod(#this);
static method Extension|asyncStarMethod(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(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);
}
