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

class Foo extends core::Object {
  field core::int bar = 42;
  synthetic constructor •() → void
    : super core::Object::•()
    ;
}
class Bar<T extends asy::Stream<core::String>> extends core::Object {
  synthetic constructor •() → void
    : super core::Object::•()
    ;
  method foo(self::Bar::T t) → dynamic async {
    await for (dynamic i in t) {
      core::int x = i;
    }
  }
}
class Baz<T extends core::Object, E extends asy::Stream<self::Baz::T>, S extends self::Baz::E> extends core::Object {
  synthetic constructor •() → void
    : super core::Object::•()
    ;
  method foo(self::Baz::S t) → dynamic async {
    await for (dynamic i in t) {
      core::int x = i;
      self::Baz::T y = i;
    }
  }
}
abstract class MyStream<T extends core::Object> extends asy::Stream<self::MyStream::T> {
  static factory •<T extends core::Object>() → self::MyStream<self::MyStream::•::T>
    return null;
}
static method test() → dynamic async {
  dynamic myStream = self::MyStream::•<self::Foo>();
  await for (dynamic x in myStream) {
    core::String y = x;
  }
  await for (dynamic x in myStream) {
    core::String y = x;
  }
  await for (core::String x in myStream) {
    core::String y = x;
  }
  dynamic z;
  await for (final dynamic #t1 in myStream) {
    z = #t1;
    core::String y = z;
  }
  asy::Stream<dynamic> stream = myStream;
  await for (self::Foo x in stream) {
    dynamic y = x;
  }
  dynamic stream2 = myStream;
  await for (self::Foo x in stream2) {
    dynamic y = x;
  }
  dynamic map = <core::String, self::Foo>{};
  await for (dynamic x in map) {
    core::String y = x;
  }
}
static method main() → dynamic {}
