library #lib;
import self as self;
import "dart:core" as core;

abstract class I extends core::Object {
  abstract method foo() → void;
}
class T1 extends core::Object implements self::I {
  synthetic constructor •() → void
    : super core::Object::•()
    ;
  method foo() → void {}
}
class T2 extends core::Object implements self::I {
  synthetic constructor •() → void
    : super core::Object::•()
    ;
  method foo() → void {}
}
class Point extends core::Object {
[@vm.inferred-type.metadata=!]  final field self::I x;
  const constructor •([@vm.inferred-type.metadata=!] self::I x) → void
    : self::Point::x = x, super core::Object::•()
    ;
  method newPoint1() → self::Point
    return new self::Point::•([@vm.direct-call.metadata=#lib::Point::x] [@vm.inferred-type.metadata=!] this.{self::Point::x});
  method newPoint2() → self::Point
    return new self::Point::•([@vm.direct-call.metadata=#lib::Point::x] [@vm.inferred-type.metadata=!] this.{self::Point::x});
}
static method getX([@vm.inferred-type.metadata=#lib::Point] dynamic point) → dynamic {
  point.x;
}
static method main() → dynamic {
  self::Point a = new self::Point::•(new self::T1::•());
  core::print([@vm.direct-call.metadata=#lib::Point::x] [@vm.inferred-type.metadata=!] a.{self::Point::x});
  self::Point c = new self::Point::•(new self::T2::•());
  [@vm.direct-call.metadata=#lib::Point::x] [@vm.inferred-type.metadata=!] c.{self::Point::x}.{self::I::foo}();
  self::getX([@vm.direct-call.metadata=#lib::Point::newPoint1] [@vm.inferred-type.metadata=#lib::Point] a.{self::Point::newPoint1}());
  self::getX([@vm.direct-call.metadata=#lib::Point::newPoint2] [@vm.inferred-type.metadata=#lib::Point] a.{self::Point::newPoint2}());
}
