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

class Class extends core::Object {
  field dynamic field;
  synthetic constructor •() → self::Class*
    ;
}
class GenericClass<T extends core::Object* = dynamic> extends core::Object {
  generic-covariant-impl field self::GenericClass::T* field;
  synthetic constructor •() → self::GenericClass<self::GenericClass::T*>*
    ;
}
extension Extension on self::Class* {
  method readGetter = self::Extension|readGetter;
  tearoff readGetter = self::Extension|get#readGetter;
  method writeSetterRequired = self::Extension|writeSetterRequired;
  tearoff writeSetterRequired = self::Extension|get#writeSetterRequired;
  method writeSetterOptional = self::Extension|writeSetterOptional;
  tearoff writeSetterOptional = self::Extension|get#writeSetterOptional;
  method writeSetterNamed = self::Extension|writeSetterNamed;
  tearoff writeSetterNamed = self::Extension|get#writeSetterNamed;
  get tearOffGetterNoArgs = self::Extension|get#tearOffGetterNoArgs;
  get tearOffGetterRequired = self::Extension|get#tearOffGetterRequired;
  get tearOffGetterOptional = self::Extension|get#tearOffGetterOptional;
  get tearOffGetterNamed = self::Extension|get#tearOffGetterNamed;
  get property = self::Extension|get#property;
  method invocations = self::Extension|invocations;
  tearoff invocations = self::Extension|get#invocations;
  method tearOffs = self::Extension|tearOffs;
  tearoff tearOffs = self::Extension|get#tearOffs;
  method getterCalls = self::Extension|getterCalls;
  tearoff getterCalls = self::Extension|get#getterCalls;
  set property = self::Extension|set#property;
}
extension GenericExtension<T extends core::Object* = dynamic> on self::GenericClass<T*>* {
  method readGetter = self::GenericExtension|readGetter;
  tearoff readGetter = self::GenericExtension|get#readGetter;
  method writeSetterRequired = self::GenericExtension|writeSetterRequired;
  tearoff writeSetterRequired = self::GenericExtension|get#writeSetterRequired;
  method writeSetterOptional = self::GenericExtension|writeSetterOptional;
  tearoff writeSetterOptional = self::GenericExtension|get#writeSetterOptional;
  method writeSetterNamed = self::GenericExtension|writeSetterNamed;
  tearoff writeSetterNamed = self::GenericExtension|get#writeSetterNamed;
  method genericWriteSetterRequired = self::GenericExtension|genericWriteSetterRequired;
  tearoff genericWriteSetterRequired = self::GenericExtension|get#genericWriteSetterRequired;
  method genericWriteSetterOptional = self::GenericExtension|genericWriteSetterOptional;
  tearoff genericWriteSetterOptional = self::GenericExtension|get#genericWriteSetterOptional;
  method genericWriteSetterNamed = self::GenericExtension|genericWriteSetterNamed;
  tearoff genericWriteSetterNamed = self::GenericExtension|get#genericWriteSetterNamed;
  get property = self::GenericExtension|get#property;
  get tearOffGetterNoArgs = self::GenericExtension|get#tearOffGetterNoArgs;
  get tearOffGetterRequired = self::GenericExtension|get#tearOffGetterRequired;
  get tearOffGetterOptional = self::GenericExtension|get#tearOffGetterOptional;
  get tearOffGetterNamed = self::GenericExtension|get#tearOffGetterNamed;
  get tearOffGetterGenericRequired = self::GenericExtension|get#tearOffGetterGenericRequired;
  get tearOffGetterGenericOptional = self::GenericExtension|get#tearOffGetterGenericOptional;
  get tearOffGetterGenericNamed = self::GenericExtension|get#tearOffGetterGenericNamed;
  method invocations = self::GenericExtension|invocations;
  tearoff invocations = self::GenericExtension|get#invocations;
  method tearOffs = self::GenericExtension|tearOffs;
  tearoff tearOffs = self::GenericExtension|get#tearOffs;
  method getterCalls = self::GenericExtension|getterCalls;
  tearoff getterCalls = self::GenericExtension|get#getterCalls;
  set property = self::GenericExtension|set#property;
}
static method Extension|get#readGetter(final self::Class* #this) → () →* dynamic
  return () → dynamic => self::Extension|readGetter(#this);
static method Extension|readGetter(final self::Class* #this) → dynamic
  ;
static method Extension|writeSetterRequired(final self::Class* #this, dynamic value) → dynamic
  ;
static method Extension|get#writeSetterRequired(final self::Class* #this) → (dynamic) →* dynamic
  return (dynamic value) → dynamic => self::Extension|writeSetterRequired(#this, value);
static method Extension|writeSetterOptional(final self::Class* #this, [dynamic value]) → dynamic
  ;
static method Extension|get#writeSetterOptional(final self::Class* #this) → ([dynamic]) →* dynamic
  return ([dynamic value = null]) → dynamic => self::Extension|writeSetterOptional(#this, value);
static method Extension|writeSetterNamed(final self::Class* #this, {dynamic value}) → dynamic
  ;
static method Extension|get#writeSetterNamed(final self::Class* #this) → ({value: dynamic}) →* dynamic
  return ({dynamic value = null}) → dynamic => self::Extension|writeSetterNamed(#this, value: value);
static method Extension|get#tearOffGetterNoArgs(final self::Class* #this) → dynamic
  ;
static method Extension|get#tearOffGetterRequired(final self::Class* #this) → dynamic
  ;
static method Extension|get#tearOffGetterOptional(final self::Class* #this) → dynamic
  ;
static method Extension|get#tearOffGetterNamed(final self::Class* #this) → dynamic
  ;
static method Extension|get#property(final self::Class* #this) → dynamic
  ;
static method Extension|set#property(final self::Class* #this, dynamic value) → void
  ;
static method Extension|invocations(final self::Class* #this, dynamic value) → dynamic
  ;
static method Extension|get#invocations(final self::Class* #this) → (dynamic) →* dynamic
  return (dynamic value) → dynamic => self::Extension|invocations(#this, value);
static method Extension|get#tearOffs(final self::Class* #this) → (dynamic) →* dynamic
  return (dynamic value) → dynamic => self::Extension|tearOffs(#this, value);
static method Extension|tearOffs(final self::Class* #this, dynamic value) → dynamic
  ;
static method Extension|getterCalls(final self::Class* #this, dynamic value) → dynamic
  ;
static method Extension|get#getterCalls(final self::Class* #this) → (dynamic) →* dynamic
  return (dynamic value) → dynamic => self::Extension|getterCalls(#this, value);
static method GenericExtension|readGetter<T extends core::Object* = dynamic>(final self::GenericClass<self::GenericExtension|readGetter::T*>* #this) → self::GenericExtension|readGetter::T*
  ;
static method GenericExtension|get#readGetter<T extends core::Object* = dynamic>(final self::GenericClass<self::GenericExtension|get#readGetter::T*>* #this) → () →* self::GenericExtension|get#readGetter::T*
  return () → self::GenericExtension|get#readGetter::T* => self::GenericExtension|readGetter<self::GenericExtension|get#readGetter::T*>(#this);
static method GenericExtension|writeSetterRequired<T extends core::Object* = dynamic>(final self::GenericClass<self::GenericExtension|writeSetterRequired::T*>* #this, self::GenericExtension|writeSetterRequired::T* value) → dynamic
  ;
static method GenericExtension|get#writeSetterRequired<T extends core::Object* = dynamic>(final self::GenericClass<self::GenericExtension|get#writeSetterRequired::T*>* #this) → (self::GenericExtension|get#writeSetterRequired::T*) →* dynamic
  return (self::GenericExtension|get#writeSetterRequired::T* value) → dynamic => self::GenericExtension|writeSetterRequired<self::GenericExtension|get#writeSetterRequired::T*>(#this, value);
static method GenericExtension|writeSetterOptional<T extends core::Object* = dynamic>(final self::GenericClass<self::GenericExtension|writeSetterOptional::T*>* #this, [self::GenericExtension|writeSetterOptional::T* value]) → dynamic
  ;
static method GenericExtension|get#writeSetterOptional<T extends core::Object* = dynamic>(final self::GenericClass<self::GenericExtension|get#writeSetterOptional::T*>* #this) → ([self::GenericExtension|get#writeSetterOptional::T*]) →* dynamic
  return ([self::GenericExtension|get#writeSetterOptional::T* value = null]) → dynamic => self::GenericExtension|writeSetterOptional<self::GenericExtension|get#writeSetterOptional::T*>(#this, value);
static method GenericExtension|writeSetterNamed<T extends core::Object* = dynamic>(final self::GenericClass<self::GenericExtension|writeSetterNamed::T*>* #this, {self::GenericExtension|writeSetterNamed::T* value}) → dynamic
  ;
static method GenericExtension|get#writeSetterNamed<T extends core::Object* = dynamic>(final self::GenericClass<self::GenericExtension|get#writeSetterNamed::T*>* #this) → ({value: self::GenericExtension|get#writeSetterNamed::T*}) →* dynamic
  return ({self::GenericExtension|get#writeSetterNamed::T* value = null}) → dynamic => self::GenericExtension|writeSetterNamed<self::GenericExtension|get#writeSetterNamed::T*>(#this, value: value);
static method GenericExtension|genericWriteSetterRequired<T extends core::Object* = dynamic, S extends self::GenericExtension|genericWriteSetterRequired::T* = dynamic>(final self::GenericClass<self::GenericExtension|genericWriteSetterRequired::T*>* #this, self::GenericExtension|genericWriteSetterRequired::S* value) → dynamic
  ;
static method GenericExtension|get#genericWriteSetterRequired<T extends core::Object* = dynamic>(final self::GenericClass<self::GenericExtension|get#genericWriteSetterRequired::T*>* #this) → <S extends self::GenericExtension|get#genericWriteSetterRequired::T* = dynamic>(S*) →* dynamic
  return <S extends self::GenericExtension|get#genericWriteSetterRequired::T* = dynamic>(S* value) → dynamic => self::GenericExtension|genericWriteSetterRequired<self::GenericExtension|get#genericWriteSetterRequired::T*, S*>(#this, value);
static method GenericExtension|genericWriteSetterOptional<T extends core::Object* = dynamic, S extends self::GenericExtension|genericWriteSetterOptional::T* = dynamic>(final self::GenericClass<self::GenericExtension|genericWriteSetterOptional::T*>* #this, [self::GenericExtension|genericWriteSetterOptional::S* value]) → dynamic
  ;
static method GenericExtension|get#genericWriteSetterOptional<T extends core::Object* = dynamic>(final self::GenericClass<self::GenericExtension|get#genericWriteSetterOptional::T*>* #this) → <S extends self::GenericExtension|get#genericWriteSetterOptional::T* = dynamic>([S*]) →* dynamic
  return <S extends self::GenericExtension|get#genericWriteSetterOptional::T* = dynamic>([S* value = null]) → dynamic => self::GenericExtension|genericWriteSetterOptional<self::GenericExtension|get#genericWriteSetterOptional::T*, S*>(#this, value);
static method GenericExtension|get#genericWriteSetterNamed<T extends core::Object* = dynamic>(final self::GenericClass<self::GenericExtension|get#genericWriteSetterNamed::T*>* #this) → <S extends self::GenericExtension|get#genericWriteSetterNamed::T* = dynamic>({value: S*}) →* dynamic
  return <S extends self::GenericExtension|get#genericWriteSetterNamed::T* = dynamic>({S* value = null}) → dynamic => self::GenericExtension|genericWriteSetterNamed<self::GenericExtension|get#genericWriteSetterNamed::T*, S*>(#this, value: value);
static method GenericExtension|genericWriteSetterNamed<T extends core::Object* = dynamic, S extends self::GenericExtension|genericWriteSetterNamed::T* = dynamic>(final self::GenericClass<self::GenericExtension|genericWriteSetterNamed::T*>* #this, {self::GenericExtension|genericWriteSetterNamed::S* value}) → dynamic
  ;
static method GenericExtension|get#property<T extends core::Object* = dynamic>(final self::GenericClass<self::GenericExtension|get#property::T*>* #this) → self::GenericExtension|get#property::T*
  ;
static method GenericExtension|set#property<T extends core::Object* = dynamic>(final self::GenericClass<self::GenericExtension|set#property::T*>* #this, self::GenericExtension|set#property::T* value) → void
  ;
static method GenericExtension|get#tearOffGetterNoArgs<T extends core::Object* = dynamic>(final self::GenericClass<self::GenericExtension|get#tearOffGetterNoArgs::T*>* #this) → dynamic
  ;
static method GenericExtension|get#tearOffGetterRequired<T extends core::Object* = dynamic>(final self::GenericClass<self::GenericExtension|get#tearOffGetterRequired::T*>* #this) → dynamic
  ;
static method GenericExtension|get#tearOffGetterOptional<T extends core::Object* = dynamic>(final self::GenericClass<self::GenericExtension|get#tearOffGetterOptional::T*>* #this) → dynamic
  ;
static method GenericExtension|get#tearOffGetterNamed<T extends core::Object* = dynamic>(final self::GenericClass<self::GenericExtension|get#tearOffGetterNamed::T*>* #this) → dynamic
  ;
static method GenericExtension|get#tearOffGetterGenericRequired<T extends core::Object* = dynamic>(final self::GenericClass<self::GenericExtension|get#tearOffGetterGenericRequired::T*>* #this) → dynamic
  ;
static method GenericExtension|get#tearOffGetterGenericOptional<T extends core::Object* = dynamic>(final self::GenericClass<self::GenericExtension|get#tearOffGetterGenericOptional::T*>* #this) → dynamic
  ;
static method GenericExtension|get#tearOffGetterGenericNamed<T extends core::Object* = dynamic>(final self::GenericClass<self::GenericExtension|get#tearOffGetterGenericNamed::T*>* #this) → dynamic
  ;
static method GenericExtension|invocations<T extends core::Object* = dynamic, S extends self::GenericExtension|invocations::T* = dynamic>(final self::GenericClass<self::GenericExtension|invocations::T*>* #this, self::GenericExtension|invocations::S* value) → dynamic
  ;
static method GenericExtension|get#invocations<T extends core::Object* = dynamic>(final self::GenericClass<self::GenericExtension|get#invocations::T*>* #this) → <S extends self::GenericExtension|get#invocations::T* = dynamic>(S*) →* dynamic
  return <S extends self::GenericExtension|get#invocations::T* = dynamic>(S* value) → dynamic => self::GenericExtension|invocations<self::GenericExtension|get#invocations::T*, S*>(#this, value);
static method GenericExtension|tearOffs<T extends core::Object* = dynamic, S extends self::GenericExtension|tearOffs::T* = dynamic>(final self::GenericClass<self::GenericExtension|tearOffs::T*>* #this, self::GenericExtension|tearOffs::S* value) → dynamic
  ;
static method GenericExtension|get#tearOffs<T extends core::Object* = dynamic>(final self::GenericClass<self::GenericExtension|get#tearOffs::T*>* #this) → <S extends self::GenericExtension|get#tearOffs::T* = dynamic>(S*) →* dynamic
  return <S extends self::GenericExtension|get#tearOffs::T* = dynamic>(S* value) → dynamic => self::GenericExtension|tearOffs<self::GenericExtension|get#tearOffs::T*, S*>(#this, value);
static method GenericExtension|getterCalls<T extends core::Object* = dynamic, S extends self::GenericExtension|getterCalls::T* = dynamic>(final self::GenericClass<self::GenericExtension|getterCalls::T*>* #this, self::GenericExtension|getterCalls::S* value) → dynamic
  ;
static method GenericExtension|get#getterCalls<T extends core::Object* = dynamic>(final self::GenericClass<self::GenericExtension|get#getterCalls::T*>* #this) → <S extends self::GenericExtension|get#getterCalls::T* = dynamic>(S*) →* dynamic
  return <S extends self::GenericExtension|get#getterCalls::T* = dynamic>(S* value) → dynamic => self::GenericExtension|getterCalls<self::GenericExtension|get#getterCalls::T*, S*>(#this, value);
static method main() → dynamic
  ;
