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

class NullEquality extends core::Object {
  synthetic constructor •() → self::NullEquality*
    : super core::Object::•()
    ;
  @#C1
  operator ==(core::Object* other) → core::Null?
    return null;
  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
  abstract member-signature method toString() → core::String*; -> core::Object::toString
  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
}
class SubNullEquality extends self::NullEquality {
  synthetic constructor •() → self::SubNullEquality*
    : super self::NullEquality::•()
    ;
  method test() → void {
    core::bool* super_equals_self = super.{self::NullEquality::==}(this);
    core::bool* super_equals_null = super.{self::NullEquality::==}(null);
    core::bool* super_not_equals_self = !super.{self::NullEquality::==}(this);
    core::bool* super_not_equals_null = !super.{self::NullEquality::==}(null);
  }
}
static method test() → dynamic {
  self::NullEquality* n = new self::NullEquality::•();
  core::bool* equals_self = n.{self::NullEquality::==}(n);
  core::bool* equals_null = n.{self::NullEquality::==}(null);
  core::bool* null_equals = null.{core::Object::==}(n);
  core::bool* not_equals_self = !n.{self::NullEquality::==}(n);
  core::bool* not_equals_null = !n.{self::NullEquality::==}(null);
  core::bool* null_not_equals = !null.{core::Object::==}(n);
}
static method main() → dynamic {
  self::test();
  new self::SubNullEquality::•().{self::SubNullEquality::test}();
}

constants  {
  #C1 = core::_Override {}
}
