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

class Foo extends core::Object {
  synthetic constructor •() → void
    : super core::Object::•()
    ;
  method foo(core::int x) → core::int
    return x;
}
static method test() → dynamic {
  dynamic d = new self::Foo::•();
  core::int get_hashCode = d.hashCode;
  dynamic call_hashCode = d.hashCode();
  core::String call_toString = d.toString();
  dynamic call_toStringArg = d.toString(color: "pink");
  dynamic call_foo0 = d.foo();
  dynamic call_foo1 = d.foo(1);
  dynamic call_foo2 = d.foo(1, 2);
  dynamic call_nsm0 = d.noSuchMethod();
  dynamic call_nsm1 = d.noSuchMethod(null);
  dynamic call_nsm2 = d.noSuchMethod(null, null);
  core::bool equals_self = d.==(d);
  core::bool equals_null = d.==(null);
  core::bool null_equals = null.{core::Object::==}(d);
  core::bool not_equals_self = !d.==(d);
  core::bool not_equals_null = !d.==(null);
  core::bool null_not_equals = !null.{core::Object::==}(d);
}
static method main() → dynamic {}
