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

class A extends core::Object {
  synthetic constructor •() → self::A*
    ;
  get call() → core::String*
    ;
  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*;
}
class B extends core::Object {
  synthetic constructor •() → self::B*
    ;
  get call() → () →* core::String*
    ;
  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 _extension#0 on core::int* {
  get call = self::_extension#0|get#call;
}
extension _extension#1 on core::num* {
  get call = self::_extension#1|get#call;
}
extension _extension#2 on core::String* {
  get call = self::_extension#2|get#call;
}
static field core::String* topLevel1;
static field core::String* topLevel2;
static field core::String* topLevel3;
static field core::String* topLevel4;
static field self::A* a;
static field core::String* topLevel5;
static field self::B* b;
static field core::String* topLevel6;
static method _extension#0|get#call(final core::int* #this) → core::String*
  ;
static method _extension#1|get#call(final core::num* #this) → core::String*
  ;
static method _extension#2|get#call(final core::String* #this) → () →* core::String*
  ;
static method main() → dynamic
  ;
static method errors() → dynamic
  ;
