library #lib /*isNonNullableByDefault*/;
import self as self;
import "dart:core" as core;
import "dart:ffi" as ffi;
import "dart:async" as asy;
import "dart:_internal" as _in;

import "dart:ffi";

class MyFinalizable extends core::Object implements ffi::Finalizable {
  synthetic constructor •() → self::MyFinalizable
    : super core::Object::•()
    ;
}
static method doSomething() → core::int
  return 3;
static method useFinalizableAsyncStar(ffi::Finalizable finalizable) → asy::Stream<core::int> /* originally async* */ {
  asy::_AsyncStarStreamController<core::int>? :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;
  dynamic :saved_try_context_var0;
  dynamic :saved_try_context_var1;
  function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
    try
      try {
        #L1:
        {
          final self::MyFinalizable finalizable2 = new self::MyFinalizable::•();
          if([@vm.call-site-attributes.metadata=receiverType:dart.async::_AsyncStarStreamController<dart.core::int>?] :controller.{asy::_AsyncStarStreamController::add}( block {
            final core::int :expressionValueWrappedFinalizable = self::doSomething();
            _in::reachabilityFence(finalizable);
            _in::reachabilityFence(finalizable2);
          } =>:expressionValueWrappedFinalizable){(core::int) → core::bool})
            return null;
          else
            [yield] null;
          final self::MyFinalizable finalizable3 = new self::MyFinalizable::•();
          [yield] let dynamic #t1 = asy::_awaitHelper( block {
            final asy::Future<core::int> :expressionValueWrappedFinalizable = asy::Future::sync<core::int>(() → core::int => 3);
            _in::reachabilityFence(finalizable);
            _in::reachabilityFence(finalizable2);
            _in::reachabilityFence(finalizable3);
          } =>:expressionValueWrappedFinalizable, :async_op_then, :async_op_error, :async_op) in null;
          _in::unsafeCast<core::int>(:result);
          final self::MyFinalizable finalizable4 = new self::MyFinalizable::•();
          if(new core::DateTime::now().{core::DateTime::millisecondsSinceEpoch}{core::int} =={core::num::==}{(core::Object) → core::bool} 4) {
            {
              _in::reachabilityFence(finalizable);
              _in::reachabilityFence(finalizable2);
              _in::reachabilityFence(finalizable3);
              _in::reachabilityFence(finalizable4);
              break #L1;
            }
          }
          if([@vm.call-site-attributes.metadata=receiverType:dart.async::_AsyncStarStreamController<dart.core::int>?] :controller.{asy::_AsyncStarStreamController::add}( block {
            final core::int :expressionValueWrappedFinalizable = 5;
            _in::reachabilityFence(finalizable);
            _in::reachabilityFence(finalizable2);
            _in::reachabilityFence(finalizable3);
            _in::reachabilityFence(finalizable4);
          } =>:expressionValueWrappedFinalizable){(core::int) → core::bool})
            return null;
          else
            [yield] null;
          _in::reachabilityFence(finalizable2);
          _in::reachabilityFence(finalizable3);
          _in::reachabilityFence(finalizable4);
          _in::reachabilityFence(finalizable);
        }
        return;
      }
      on dynamic catch(dynamic exception, core::StackTrace stack_trace) {
        :controller.{asy::_AsyncStarStreamController::addError}(exception, stack_trace){(core::Object, core::StackTrace) → void};
      }
    finally {
      :controller.{asy::_AsyncStarStreamController::close}(){() → dynamic};
    }
  :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
  :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
  :controller = new asy::_AsyncStarStreamController::•<core::int>(:async_op);
  :controller_stream = :controller.{asy::_AsyncStarStreamController::stream}{asy::Stream<core::int>};
  return :controller_stream;
}
static method main() → void /* originally async */ {
  final asy::_Future<dynamic> :async_future = new asy::_Future::•<dynamic>();
  core::bool* :is_sync = false;
  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;
  dynamic :saved_try_context_var0;
  dynamic :saved_try_context_var1;
  dynamic :exception0;
  dynamic :stack_trace0;
  function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
    try {
      #L2:
      {
        final self::MyFinalizable finalizable = new self::MyFinalizable::•();
        final asy::Stream<core::int> asyncStarResult = self::useFinalizableAsyncStar(finalizable);
        {
          asy::Stream<core::int> :stream = asyncStarResult;
          asy::_StreamIterator<core::int>? :for-iterator = new asy::_StreamIterator::•<core::int>(:stream);
          try
            #L3:
            while (true) {
              dynamic #t2 = asy::_asyncStarMoveNextHelper(:stream);
              [yield] let dynamic #t3 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::moveNext}(){() → asy::Future<core::bool>}, :async_op_then, :async_op_error, :async_op) in null;
              if(_in::unsafeCast<core::bool>(:result)) {
                final core::int element = :for-iterator.{asy::_StreamIterator::current}{core::int};
                {
                  core::print(element);
                }
              }
              else
                break #L3;
            }
          finally
            if(!(:for-iterator.{asy::_StreamIterator::_subscription}{asy::StreamSubscription<core::int>?} == null)) {
              [yield] let dynamic #t4 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::cancel}(){() → asy::Future<dynamic>}, :async_op_then, :async_op_error, :async_op) in null;
              :result;
            }
        }
        _in::reachabilityFence(finalizable);
      }
      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;
}
