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

class A1 extends core::Object {
  field core::Object* field = null;
  synthetic constructor •() → self::A1*
    : super core::Object::•()
    ;
  method method1() → void {}
  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 operator ==(dynamic other) → 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*;
}
extension A2 on self::A1* {
  method method2 = self::A2|method2;
  tearoff method2 = self::A2|get#method2;
  method method3 = self::A2|method3;
  tearoff method3 = self::A2|get#method3;
  method method4 = self::A2|method4;
  tearoff method4 = self::A2|get#method4;
}
static method A2|method2(final self::A1* #this) → void
  return #this.{self::A1::method1}();
static method A2|get#method2(final self::A1* #this) → () →* void
  return () → void => self::A2|method2(#this);
static method A2|method3(final self::A1* #this) → core::Object*
  return #this.{self::A1::field};
static method A2|get#method3(final self::A1* #this) → () →* core::Object*
  return () → core::Object* => self::A2|method3(#this);
static method A2|method4(final self::A1* #this, core::Object* o) → void {
  #this.{self::A1::field} = o;
}
static method A2|get#method4(final self::A1* #this) → (core::Object*) →* void
  return (core::Object* o) → void => self::A2|method4(#this, o);
static method main() → dynamic {}
