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

class A1 extends core::Object {
  field core::int* _instanceField;
  static field core::int* _staticField;
  synthetic constructor •() → self::A1*
    ;
  method getInstanceField() → core::int*
    ;
  method setInstanceField(core::int* value) → void
    ;
  static method getStaticField() → core::int*
    ;
  static method setStaticField(core::int* value) → 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* {
  get instanceProperty = self::A2|get#instanceProperty;
  operator + = self::A2|+;
  operator - = self::A2|-;
  operator unary- = self::A2|unary-;
  static field staticField = self::A2|staticField;
  static get staticProperty = get self::A2|staticProperty;
  set instanceProperty = self::A2|set#instanceProperty;
  static set staticProperty = set self::A2|staticProperty;
}
static field core::int* A2|staticField;
static method A2|get#instanceProperty(final self::A1* #this) → core::int*
  ;
static method A2|set#instanceProperty(final self::A1* #this, core::int* value) → void
  ;
static method A2|+(final self::A1* #this, core::int* value) → core::int*
  ;
static method A2|-(final self::A1* #this, core::int* value) → core::int*
  ;
static method A2|unary-(final self::A1* #this) → core::int*
  ;
static get A2|staticProperty() → core::int*
  ;
static set A2|staticProperty(core::int* value) → void
  ;
static method main() → dynamic
  ;
