library /*isNonNullableByDefault*/;
import self as self;
import "dart:core" as core;
import "dart:async" as asy;

static field void v1 = self::method();
static field void v2 = self::method();
static field core::List<void> l1 = core::_GrowableList::_literal1<void>(self::method());
static field core::List<void> l2 = core::_GrowableList::_literal1<void>(self::method());
static method method() → void {}
static method test(core::Iterable<void> iterable, asy::Stream<void> stream) → dynamic async /* futureValueType= dynamic */ {
  void v1 = self::method();
  void v2 = self::method();
  {
    core::Iterator<void> :sync-for-iterator = iterable.{core::Iterable::iterator}{core::Iterator<void>};
    for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
      void v3 = :sync-for-iterator.{core::Iterator::current}{void};
      {}
    }
  }
  {
    core::Iterator<void> :sync-for-iterator = iterable.{core::Iterable::iterator}{core::Iterator<void>};
    for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
      void v4 = :sync-for-iterator.{core::Iterator::current}{void};
      {}
    }
  }
  {
    asy::Stream<void> :stream = stream;
    asy::_StreamIterator<void>? :for-iterator = new asy::_StreamIterator::•<void>(:stream);
    try
      while (let dynamic #t1 = asy::_asyncStarMoveNextHelper(:stream) in await :for-iterator.{asy::_StreamIterator::moveNext}(){() → asy::Future<core::bool>}) {
        void v5 = :for-iterator.{asy::_StreamIterator::current}{void};
        {}
      }
    finally
      if(!(:for-iterator.{asy::_StreamIterator::_subscription}{asy::StreamSubscription<void>?} == null))
        await :for-iterator.{asy::_StreamIterator::cancel}(){() → asy::Future<dynamic>};
  }
  {
    asy::Stream<void> :stream = stream;
    asy::_StreamIterator<void>? :for-iterator = new asy::_StreamIterator::•<void>(:stream);
    try
      while (let dynamic #t2 = asy::_asyncStarMoveNextHelper(:stream) in await :for-iterator.{asy::_StreamIterator::moveNext}(){() → asy::Future<core::bool>}) {
        void v6 = :for-iterator.{asy::_StreamIterator::current}{void};
        {}
      }
    finally
      if(!(:for-iterator.{asy::_StreamIterator::_subscription}{asy::StreamSubscription<void>?} == null))
        await :for-iterator.{asy::_StreamIterator::cancel}(){() → asy::Future<dynamic>};
  }
  core::List<void> l1 = core::_GrowableList::_literal1<void>(self::method());
  core::List<void> l2 = core::_GrowableList::_literal1<void>(self::method());
}
static method main() → dynamic {}
