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::•();
  dynamic get_hashCode = d.hashCode;
  dynamic call_hashCode = d.hashCode();
  dynamic 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);
  dynamic equals_self = d.==(d);
  dynamic equals_null = d.==(null);
  dynamic null_equals = null.==(d);
  dynamic not_equals_self = !d.==(d);
  dynamic not_equals_null = !d.==(null);
  dynamic null_not_equals = !null.==(d);
}
static method main() → dynamic {}
