library #lib;
import self as self;
import "dart:core" as core;
import "package:expect/expect.dart" as exp;

class T1 extends core::Object {
  synthetic constructor •() → void
    : super core::Object::•()
    ;
  method doTest1() → void {
    self::ok = true;
  }
}
class A1 extends core::Object {
[@vm.inferred-type.metadata=#lib::T1?]  field self::T1 foo = null;
  synthetic constructor •() → void
    : super core::Object::•()
    ;
  method call([dynamic a1 = null, dynamic a2 = null, dynamic a3 = null, [@vm.inferred-type.metadata=dart.core::_Smi?] dynamic a4 = null, [@vm.inferred-type.metadata=#lib::T1?] dynamic a5 = null]) → void {
    [@vm.direct-call.metadata=#lib::A1::foo] this.{self::A1::foo} = a5 as{TypeError} self::T1;
  }
}
class B1 extends core::Object {
[@vm.inferred-type.metadata=#lib::A1]  field self::A1 aa1 = new self::A1::•();
  synthetic constructor •() → void
    : super core::Object::•()
    ;
}
class T2 extends core::Object {
  synthetic constructor •() → void
    : super core::Object::•()
    ;
  method doTest2() → void {
    self::ok = true;
  }
}
class A2 extends core::Object {
[@vm.inferred-type.metadata=#lib::T2?]  field dynamic foo = null;
  synthetic constructor •() → void
    : super core::Object::•()
    ;
  method call([dynamic a1 = null, dynamic a2 = null, dynamic a3 = null, [@vm.inferred-type.metadata=dart.core::_Smi?] dynamic a4 = null, [@vm.inferred-type.metadata=dart.core::_Smi?] dynamic a5 = null, [@vm.inferred-type.metadata=#lib::T2?] dynamic a6 = null]) → void {
    [@vm.direct-call.metadata=#lib::A2::foo] this.{self::A2::foo} = a6;
  }
}
abstract class B2Base extends core::Object {
[@vm.inferred-type.metadata=#lib::A2]  field dynamic _aa = new self::A2::•();
  synthetic constructor •() → void
    : super core::Object::•()
    ;
  get aa2() → dynamic
    return [@vm.direct-call.metadata=#lib::B2Base::_aa] [@vm.inferred-type.metadata=#lib::A2] this.{self::B2Base::_aa};
}
class B2 extends self::B2Base {
  synthetic constructor •() → void
    : super self::B2Base::•()
    ;
  method doSuperCall() → void {
    [@vm.call-site-attributes.metadata=receiverType:dynamic] [@vm.direct-call.metadata=#lib::A2::call] [@vm.inferred-type.metadata=#lib::A2] super.{self::B2Base::aa2}.call(1, 2, 3, 4, 5, new self::T2::•());
  }
}
class T3 extends core::Object {
  synthetic constructor •() → void
    : super core::Object::•()
    ;
  method doTest3() → void {
    self::ok = true;
  }
}
class A3 extends core::Object {
[@vm.inferred-type.metadata=#lib::T3?]  field dynamic foo = null;
  synthetic constructor •() → void
    : super core::Object::•()
    ;
  method call([dynamic a1 = null, dynamic a2 = null, dynamic a3 = null, [@vm.inferred-type.metadata=dart.core::_Smi?] dynamic a4 = null, [@vm.inferred-type.metadata=dart.core::_Smi?] dynamic a5 = null, [@vm.inferred-type.metadata=dart.core::_Smi?] dynamic a6 = null, [@vm.inferred-type.metadata=#lib::T3?] dynamic a7 = null]) → void {
    [@vm.direct-call.metadata=#lib::A3::foo] this.{self::A3::foo} = a7;
  }
}
class B3 extends core::Object {
[@vm.inferred-type.metadata=#lib::A3]  field self::A3 aa3 = new self::A3::•();
  synthetic constructor •() → void
    : super core::Object::•()
    ;
}
class T4 extends core::Object {
  synthetic constructor •() → void
    : super core::Object::•()
    ;
  method doTest4() → void {
    self::ok = true;
  }
}
class A4 extends core::Object {
[@vm.inferred-type.metadata=#lib::T4?]  field dynamic foo = null;
  synthetic constructor •() → void
    : super core::Object::•()
    ;
  method call([dynamic a1 = null, dynamic a2 = null, dynamic a3 = null, [@vm.inferred-type.metadata=dart.core::_Smi?] dynamic a4 = null, [@vm.inferred-type.metadata=dart.core::_Smi?] dynamic a5 = null, [@vm.inferred-type.metadata=dart.core::_Smi?] dynamic a6 = null, [@vm.inferred-type.metadata=dart.core::_Smi?] dynamic a7 = null, [@vm.inferred-type.metadata=#lib::T4?] dynamic a8 = null]) → void {
    [@vm.direct-call.metadata=#lib::A4::foo] this.{self::A4::foo} = a8;
  }
}
class B4 extends core::Object {
[@vm.inferred-type.metadata=#lib::A4]  field dynamic _aa = new self::A4::•();
  synthetic constructor •() → void
    : super core::Object::•()
    ;
  get aa4() → dynamic
    return [@vm.direct-call.metadata=#lib::B4::_aa] [@vm.inferred-type.metadata=#lib::A4] this.{self::B4::_aa};
}
[@vm.inferred-type.metadata=dart.core::bool?]static field core::bool ok;
[@vm.inferred-type.metadata=#lib::B3?]static field dynamic bb3 = new self::B3::•();
[@vm.inferred-type.metadata=dart.core::_Closure?]static field core::Function unknown3 = () → dynamic => self::bb3;
[@vm.inferred-type.metadata=#lib::B4?]static field dynamic bb4 = new self::B4::•();
[@vm.inferred-type.metadata=dart.core::_Closure?]static field core::Function unknown4 = () → dynamic => self::bb4;
static method test1() → void {
  self::B1 bb = new self::B1::•();
  [@vm.inferred-type.metadata=#lib::A1] bb.{self::B1::aa1}(1, 2, 3, 4, new self::T1::•());
  self::ok = false;
  [@vm.direct-call.metadata=#lib::T1::doTest1??] [@vm.direct-call.metadata=#lib::A1::foo] [@vm.inferred-type.metadata=#lib::T1?] [@vm.direct-call.metadata=#lib::B1::aa1] [@vm.inferred-type.metadata=#lib::A1] bb.{self::B1::aa1}.{self::A1::foo}.{self::T1::doTest1}();
  exp::Expect::isTrue([@vm.inferred-type.metadata=dart.core::bool?] self::ok);
}
static method test2() → void {
  self::B2 bb = new self::B2::•();
  [@vm.direct-call.metadata=#lib::B2::doSuperCall] bb.{self::B2::doSuperCall}();
  self::ok = false;
  [@vm.direct-call.metadata=#lib::T2::doTest2??] [@vm.direct-call.metadata=#lib::A2::foo] [@vm.inferred-type.metadata=#lib::T2?] [@vm.direct-call.metadata=#lib::B2Base::aa2] [@vm.inferred-type.metadata=#lib::A2] bb.{self::B2Base::aa2}.foo.doTest2();
  exp::Expect::isTrue([@vm.inferred-type.metadata=dart.core::bool?] self::ok);
}
static method getDynamic3() → dynamic
  return [@vm.call-site-attributes.metadata=receiverType:dart.core::Function] self::unknown3.call();
static method test3() → void {
  self::getDynamic3().aa3(1, 2, 3, 4, 5, 6, new self::T3::•());
  self::ok = false;
  [@vm.direct-call.metadata=#lib::T3::doTest3??] [@vm.direct-call.metadata=#lib::A3::foo] [@vm.inferred-type.metadata=#lib::T3?] [@vm.direct-call.metadata=#lib::B3::aa3??] [@vm.inferred-type.metadata=#lib::A3] [@vm.inferred-type.metadata=#lib::B3?] self::bb3.aa3.foo.doTest3();
  exp::Expect::isTrue([@vm.inferred-type.metadata=dart.core::bool?] self::ok);
}
static method getDynamic4() → dynamic
  return [@vm.call-site-attributes.metadata=receiverType:dart.core::Function] self::unknown4.call();
static method test4() → void {
  self::getDynamic4().aa4(1, 2, 3, 4, 5, 6, 7, new self::T4::•());
  self::ok = false;
  [@vm.direct-call.metadata=#lib::T4::doTest4??] [@vm.direct-call.metadata=#lib::A4::foo] [@vm.inferred-type.metadata=#lib::T4?] [@vm.inferred-type.metadata=#lib::A4] self::getDynamic4().aa4.foo.doTest4();
  exp::Expect::isTrue([@vm.inferred-type.metadata=dart.core::bool?] self::ok);
}
static method main() → void {
  self::test1();
  self::test2();
  self::test3();
  self::test4();
}
