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

typedef B = self::A;
class A extends core::Object {
  constructor •(core::int x, core::int y, {required core::int z = null}) → self::A
    ;
  static factory foo(core::int x, core::int y, {required core::int z}) → self::A
    ;
  get property() → (core::int, core::int, {required z: core::int}) → void
    ;
  method bar(core::int x, core::int y, {required core::int z = null}) → void
    ;
}
class Test extends self::A {
  constructor •() → self::Test
    ;
  method test() → dynamic
    ;
}
extension E on self::A {
  method method1 = self::E|method1;
  tearoff method1 = self::E|get#method1;
  method method2 = self::E|method2;
  tearoff method2 = self::E|get#method2;
}
static method foo(core::int x, core::int y, {required core::int z}) → dynamic
  ;
static method E|method1(lowered final self::A #this) → dynamic
  ;
static method E|get#method1(lowered final self::A #this) → () → dynamic
  return () → dynamic => self::E|method1(#this);
static method E|method2(lowered final self::A #this, core::int bar, {core::int? foo}) → dynamic
  ;
static method E|get#method2(lowered final self::A #this) → (core::int, {foo: core::int?}) → dynamic
  return (core::int bar, {core::int? foo}) → dynamic => self::E|method2(#this, bar, foo: foo);
static method test(dynamic d, core::Function f, self::A a) → dynamic
  ;
static method main() → dynamic
  ;
