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

import "dart:async";

class X extends core::Object {
  final field dynamic x;
  final field dynamic y;
  constructor •(dynamic x, dynamic y) → self::X
    : self::X::x = x, self::X::y = y, super core::Object::•()
    ;
  method toString() → core::String
    return "X(${this.{self::X::x}{dynamic}}, ${this.{self::X::y}{dynamic}})";
}
class Y extends core::Object {
  synthetic constructor •() → self::Y
    : super core::Object::•()
    ;
  method f(dynamic _) → dynamic {}
}
static method f1() → asy::Future<core::List<core::Object>> async /* emittedValueType= core::List<core::Object> */ {
  return <core::Object>[1];
}
static method f2() → core::List<core::Object>
  return <core::Object>[2];
static method f3() → asy::Future<core::Object> async /* emittedValueType= core::Object */ {
  return 3;
}
static method foo() → asy::Future<self::X> async /* emittedValueType= self::X */ {
  return new self::X::•(let final self::Y #t1 = new self::Y::•() in block {
    #t1.{self::Y::f}(await self::f1()){(dynamic) → dynamic};
    #t1.{self::Y::f}(self::f2()){(dynamic) → dynamic};
  } =>#t1, await self::f3());
}
static method main() → asy::Future<void> async /* emittedValueType= void */ {
  core::print(await self::foo());
}
