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

class B extends core::Object implements self::A {
  final field core::int x = 1;
  synthetic constructor •() → self::B
    : super core::Object::•()
    ;
  static method _#new#tearOff() → self::B
    return new self::B::•();
}
abstract class A extends core::Object {
  abstract get x() → core::int;
  static factory •() → self::A /* redirection-target: self::B::• */
    return new self::B::•();
  static method _#new#tearOff() → self::A
    return new self::B::•();
}
extension type C(self::A point) implements self::A {
  abstract extension-type-member representation-field get point() → self::A;
  constructor _ = self::C|constructor#_;
  constructor tearoff _ = self::C|constructor#_#_#tearOff;
  constructor • = self::C|constructor#;
  constructor tearoff • = self::C|constructor#_#new#tearOff;
}
static extension-type-member method C|constructor#_(self::A point) → self::C /* erasure=self::A */ {
  lowered final self::C /* erasure=self::A */ #this = point;
  return #this;
}
static extension-type-member method C|constructor#_#_#tearOff(self::A point) → self::C /* erasure=self::A */
  return self::C|constructor#_(point);
static extension-type-member method C|constructor#() → self::C /* erasure=self::A */ {
  lowered final self::C /* erasure=self::A */ #this = new self::B::•();
  return #this;
}
static extension-type-member method C|constructor#_#new#tearOff() → self::C /* erasure=self::A */
  return self::C|constructor#();
static method main() → void {
  self::expectEquals(new self::B::•().{self::A::x}{core::int}, 1);
  self::expectEquals(self::C|constructor#().{self::A::x}{core::int}, 1);
}
static method expectEquals(dynamic x, dynamic y) → dynamic {
  if(!(x =={core::Object::==}{(core::Object) → core::bool} y)) {
    throw "Expected equal values, got '${x}' and '${y}'.";
  }
}
