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

extension /* unnamed */ _extension#0 on core::Object {
  get setter = self::_extension#0|get#setter;
  set getter = self::_extension#0|set#getter;
}
inline class InlineClass /* declaredRepresentationType = core::int */ {
  method test = self::InlineClass|test;
  tearoff test = self::InlineClass|get#test;
  operator + = self::InlineClass|+;
  operator unary- = self::InlineClass|unary-;
  operator [] = self::InlineClass|[];
  operator []= = self::InlineClass|[]=;
  get getter = self::InlineClass|get#getter;
  method method = self::InlineClass|method;
  tearoff method = self::InlineClass|get#method;
  method genericMethod = self::InlineClass|genericMethod;
  tearoff genericMethod = self::InlineClass|get#genericMethod;
  method call = self::InlineClass|call;
  tearoff call = self::InlineClass|get#call;
  set setter = self::InlineClass|set#setter;
  constructor • = self::InlineClass|;
  tearoff • = self::InlineClass|_#new#tearOff;
}
static extension-member method _extension#0|get#setter(lowered final core::Object #this) → core::int
  ;
static extension-member method _extension#0|set#getter(lowered final core::Object #this, core::int value) → void
  ;
static inline-class-member method InlineClass|(core::int it) → self::InlineClass
  ;
static inline-class-member method InlineClass|_#new#tearOff(core::int it) → self::InlineClass
  return self::InlineClass|(it);
static inline-class-member method InlineClass|test(lowered final self::InlineClass #this) → dynamic
  ;
static inline-class-member method InlineClass|get#test(lowered final self::InlineClass #this) → () → dynamic
  return () → dynamic => self::InlineClass|test(#this);
static inline-class-member method InlineClass|+(lowered final self::InlineClass #this, core::int other) → core::int
  ;
static inline-class-member method InlineClass|unary-(lowered final self::InlineClass #this) → core::int
  ;
static inline-class-member method InlineClass|[](lowered final self::InlineClass #this, core::int index) → core::int
  ;
static inline-class-member method InlineClass|[]=(lowered final self::InlineClass #this, core::int index, core::int value) → void
  ;
static inline-class-member method InlineClass|get#getter(lowered final self::InlineClass #this) → core::int
  ;
static inline-class-member method InlineClass|method(lowered final self::InlineClass #this) → core::int
  ;
static inline-class-member method InlineClass|get#method(lowered final self::InlineClass #this) → () → core::int
  return () → core::int => self::InlineClass|method(#this);
static inline-class-member method InlineClass|set#setter(lowered final self::InlineClass #this, core::int value) → void
  ;
static inline-class-member method InlineClass|genericMethod<T extends core::Object? = dynamic>(lowered final self::InlineClass #this, self::InlineClass|genericMethod::T% t) → self::InlineClass|genericMethod::T%
  ;
static inline-class-member method InlineClass|get#genericMethod(lowered final self::InlineClass #this) → <T extends core::Object? = dynamic>(T%) → T%
  return <T extends core::Object? = dynamic>(T% t) → T% => self::InlineClass|genericMethod<T%>(#this, t);
static inline-class-member method InlineClass|call(lowered final self::InlineClass #this) → core::int
  ;
static inline-class-member method InlineClass|get#call(lowered final self::InlineClass #this) → () → core::int
  return () → core::int => self::InlineClass|call(#this);
static method test(self::InlineClass ic) → dynamic
  ;
