library test /*isNonNullableByDefault*/;
import self as self;
import "dart:core" as core;

abstract class A extends core::Object {
  synthetic constructor •() → self::A
    ;
  abstract set x(core::int? value) → void;
}
class B extends core::Object {
  synthetic constructor •() → self::B
    ;
  set x(core::int? value) → void
    ;
}
class C extends self::A {
  field core::int? x;
  synthetic constructor •() → self::C
    ;
}
class D extends self::B {
  field core::int? x;
  synthetic constructor •() → self::D
    ;
}
class E extends core::Object implements self::A {
  field core::int? x;
  synthetic constructor •() → self::E
    ;
}
class F extends core::Object implements self::B {
  field core::int? x;
  synthetic constructor •() → self::F
    ;
}
abstract class _G&Object&B = core::Object with self::B /*isAnonymousMixin,hasConstConstructor*/  {
  const synthetic constructor •() → self::_G&Object&B
    : super core::Object::•()
    ;
  mixin-super-stub set x(core::int? value) → void
    return super.{self::B::x} = value;
}
class G extends self::_G&Object&B {
  field core::int? x;
  synthetic constructor •() → self::G
    ;
}
static method main() → dynamic
  ;
