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

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