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

abstract class A extends core::Object {
  synthetic constructor •() → self::A
    : super core::Object::•()
    ;
}
inline class B /* declaredRepresentationType = self::A */ {
  get field = self::B|get#field;
  set field = self::B|set#field;
  method method = self::B|method;
  tearoff method = self::B|get#method;
  method genericMethod = self::B|genericMethod;
  tearoff genericMethod = self::B|get#genericMethod;
  get getter = self::B|get#getter;
  static get staticField = get self::B|staticField;
  static set staticField = set self::B|staticField;
  static method staticMethod = self::B|staticMethod;
  static method staticGenericMethod = self::B|staticGenericMethod;
  static get staticGetter = get self::B|staticGetter;
  set setter = self::B|set#setter;
  static set staticSetter = set self::B|staticSetter;
  constructor • = self::B|;
  tearoff • = self::B|_#new#tearOff;
  constructor named = self::B|named;
  tearoff named = self::B|_#named#tearOff;
}
external static inline-class-member method B|(self::A a) → self::B;
static inline-class-member method B|_#new#tearOff(self::A a) → self::B
  return self::B|(a);
external static inline-class-member method B|named(core::int i) → self::B;
static inline-class-member method B|_#named#tearOff(core::int i) → self::B
  return self::B|named(i);
external static inline-class-member method B|get#field(lowered self::A #this) → self::A;
external static inline-class-member method B|set#field(lowered self::A #this, self::A #externalFieldValue) → void;
external static inline-class-member method B|method(lowered final self::B #this) → self::A;
static inline-class-member method B|get#method(lowered final self::B #this) → () → self::A
  return () → self::A => self::B|method(#this);
external static inline-class-member method B|genericMethod<T extends core::Object? = dynamic>(lowered final self::B #this, self::B|genericMethod::T% t) → self::B|genericMethod::T%;
static inline-class-member method B|get#genericMethod(lowered final self::B #this) → <T extends core::Object? = dynamic>(T%) → T%
  return <T extends core::Object? = dynamic>(T% t) → T% => self::B|genericMethod<T%>(#this, t);
external static inline-class-member method B|get#getter(lowered final self::B #this) → self::B;
external static inline-class-member method B|set#setter(lowered final self::B #this, self::B b) → void;
external static inline-class-member get B|staticField() → self::A;
external static inline-class-member set B|staticField(self::A #externalFieldValue) → void;
external static inline-class-member method B|staticMethod() → self::A;
external static inline-class-member method B|staticGenericMethod<T extends core::Object? = dynamic>(self::B|staticGenericMethod::T% t) → self::B|staticGenericMethod::T%;
external static inline-class-member get B|staticGetter() → self::B;
external static inline-class-member set B|staticSetter(self::B b) → void;
static method method(self::A a) → void {
  self::B b1 = self::B|(a);
  self::B b2 = self::B|named(0);
  a = self::B|get#field(b1);
  self::B|set#field(b1, a);
  a = self::B|method(b1);
  () → self::A f1 = self::B|get#method(b1);
  b2 = self::B|genericMethod<self::B>(b2, b2);
  <T extends core::Object? = dynamic>(T%) → T% f2 = self::B|get#genericMethod(b2);
  (core::int) → core::int f3 = self::B|get#genericMethod(b2)<core::int>;
  b1 = self::B|get#getter(b2);
  self::B|set#setter(b1, b2);
  a = self::B|staticField;
  self::B|staticField = a;
  a = self::B|staticMethod();
  () → self::A f4 = #C1;
  b2 = self::B|staticGenericMethod<self::B>(b2);
  <T extends core::Object? = dynamic>(T%) → T% f5 = #C2;
  (core::String) → core::String f6 = #C3;
  b1 = self::B|staticGetter;
  self::B|staticSetter = b2;
}

constants  {
  #C1 = static-tearoff self::B|staticMethod
  #C2 = static-tearoff self::B|staticGenericMethod
  #C3 = instantiation #C2 <core::String*>
}
