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

abstract class A extends core::Object {
  constructor •(core::int initializedField1) → self::A
    ;
  external get fieldWithInitializer() → core::int;
  external set fieldWithInitializer(synthesized core::int #externalFieldValue) → void;
  external get initializedField1() → core::int;
  external set initializedField1(synthesized core::int #externalFieldValue) → void;
  external get initializedField2() → core::int;
  external set initializedField2(synthesized core::int #externalFieldValue) → void;
  external static get staticField() → core::int;
  external static set staticField(synthesized core::int #externalFieldValue) → void;
  external static get finalStaticField() → core::int;
}
abstract class B extends core::Object /*isMixinDeclaration*/  {
  external static get staticField() → core::int;
  external static set staticField(synthesized core::int #externalFieldValue) → void;
  external static get finalStaticField() → core::int;
}
extension Extension on self::A {
  get extensionInstanceField = self::Extension|get#extensionInstanceField;
  set extensionInstanceField = self::Extension|set#extensionInstanceField;
  get finalExtensionInstanceField = self::Extension|get#finalExtensionInstanceField;
  static get extensionStaticField = get self::Extension|extensionStaticField;
  static set extensionStaticField = set self::Extension|extensionStaticField;
  static get finalExtensionStaticField = get self::Extension|finalExtensionStaticField;
}
external static get topLevelField() → core::int;
external static set topLevelField(synthesized core::int #externalFieldValue) → void;
external static get finalTopLevelField() → core::int;
external static get constField() → core::int;
external static set constField(synthesized core::int #externalFieldValue) → void;
external static extension-member method Extension|get#extensionInstanceField(lowered self::A #this) → core::int;
external static extension-member method Extension|set#extensionInstanceField(lowered self::A #this, synthesized core::int #externalFieldValue) → void;
external static extension-member method Extension|get#finalExtensionInstanceField(lowered self::A #this) → core::int;
external static extension-member get Extension|extensionStaticField() → core::int;
external static extension-member set Extension|extensionStaticField(synthesized core::int #externalFieldValue) → void;
external static extension-member get Extension|finalExtensionStaticField() → core::int;
static method main() → dynamic
  ;
