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*;
  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*;
  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*;
  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*;
  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*;
  abstract member-signature get hashCode() → core::int*;
  abstract member-signature method toString() → core::String*;
  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic;
  abstract member-signature get runtimeType() → core::Type*;
}
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 {}
}
