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

class Class<T extends core::Object? = dynamic> extends core::Object {
  static field dynamic field;
  synthetic constructor •() → self::Class<self::Class::T%>
    ;
}
extension Extension<T extends core::Object? = dynamic> on self::Class<T%> {
  static get property = get self::Extension|property;
  static set property = set self::Extension|property;
  static field field = self::Extension|field;
  static method readGetter = self::Extension|readGetter;
  static method writeSetterRequired = self::Extension|writeSetterRequired;
  static method writeSetterOptional = self::Extension|writeSetterOptional;
  static method writeSetterNamed = self::Extension|writeSetterNamed;
  static method genericWriteSetterRequired = self::Extension|genericWriteSetterRequired;
  static method genericWriteSetterOptional = self::Extension|genericWriteSetterOptional;
  static method genericWriteSetterNamed = self::Extension|genericWriteSetterNamed;
  static get tearOffGetterNoArgs = get self::Extension|tearOffGetterNoArgs;
  static get tearOffGetterRequired = get self::Extension|tearOffGetterRequired;
  static get tearOffGetterOptional = get self::Extension|tearOffGetterOptional;
  static get tearOffGetterNamed = get self::Extension|tearOffGetterNamed;
  static get tearOffGetterGenericRequired = get self::Extension|tearOffGetterGenericRequired;
  static get tearOffGetterGenericOptional = get self::Extension|tearOffGetterGenericOptional;
  static get tearOffGetterGenericNamed = get self::Extension|tearOffGetterGenericNamed;
  static method invocationsFromStaticContext = self::Extension|invocationsFromStaticContext;
  static method tearOffsFromStaticContext = self::Extension|tearOffsFromStaticContext;
  static method fieldAccessFromStaticContext = self::Extension|fieldAccessFromStaticContext;
  static method getterCallsFromStaticContext = self::Extension|getterCallsFromStaticContext;
  method invocationsFromInstanceContext = self::Extension|invocationsFromInstanceContext;
  method tearoff invocationsFromInstanceContext = self::Extension|get#invocationsFromInstanceContext;
  method tearOffsFromInstanceContext = self::Extension|tearOffsFromInstanceContext;
  method tearoff tearOffsFromInstanceContext = self::Extension|get#tearOffsFromInstanceContext;
  method fieldAccessFromInstanceContext = self::Extension|fieldAccessFromInstanceContext;
  method tearoff fieldAccessFromInstanceContext = self::Extension|get#fieldAccessFromInstanceContext;
  method getterCallsFromInstanceContext = self::Extension|getterCallsFromInstanceContext;
  method tearoff getterCallsFromInstanceContext = self::Extension|get#getterCallsFromInstanceContext;
}
static field dynamic Extension|field;
static extension-member get Extension|property() → dynamic
  ;
static extension-member set Extension|property(dynamic value) → void
  ;
static extension-member method Extension|readGetter() → dynamic
  ;
static extension-member method Extension|writeSetterRequired(dynamic value) → dynamic
  ;
static extension-member method Extension|writeSetterOptional([dynamic value]) → dynamic
  ;
static extension-member method Extension|writeSetterNamed({dynamic value}) → dynamic
  ;
static extension-member method Extension|genericWriteSetterRequired<S extends core::Object? = dynamic>(self::Extension|genericWriteSetterRequired::S% value) → dynamic
  ;
static extension-member method Extension|genericWriteSetterOptional<S extends core::Object? = dynamic>([self::Extension|genericWriteSetterOptional::S? value]) → dynamic
  ;
static extension-member method Extension|genericWriteSetterNamed<S extends core::Object? = dynamic>({self::Extension|genericWriteSetterNamed::S? value}) → dynamic
  ;
static extension-member get Extension|tearOffGetterNoArgs() → dynamic
  ;
static extension-member get Extension|tearOffGetterRequired() → dynamic
  ;
static extension-member get Extension|tearOffGetterOptional() → dynamic
  ;
static extension-member get Extension|tearOffGetterNamed() → dynamic
  ;
static extension-member get Extension|tearOffGetterGenericRequired() → dynamic
  ;
static extension-member get Extension|tearOffGetterGenericOptional() → dynamic
  ;
static extension-member get Extension|tearOffGetterGenericNamed() → dynamic
  ;
static extension-member method Extension|invocationsFromStaticContext(core::int value) → dynamic
  ;
static extension-member method Extension|tearOffsFromStaticContext(core::int value) → dynamic
  ;
static extension-member method Extension|fieldAccessFromStaticContext() → dynamic
  ;
static extension-member method Extension|getterCallsFromStaticContext(core::int value) → dynamic
  ;
static extension-member method Extension|invocationsFromInstanceContext<T extends core::Object? = dynamic>(lowered final self::Class<self::Extension|invocationsFromInstanceContext::T%> #this, self::Extension|invocationsFromInstanceContext::T% value) → dynamic
  ;
static extension-member method Extension|get#invocationsFromInstanceContext<T extends core::Object? = dynamic>(lowered final self::Class<self::Extension|get#invocationsFromInstanceContext::T%> #this) → (self::Extension|get#invocationsFromInstanceContext::T%) → dynamic
  return (self::Extension|get#invocationsFromInstanceContext::T% value) → dynamic => self::Extension|invocationsFromInstanceContext<self::Extension|get#invocationsFromInstanceContext::T%>(#this, value);
static extension-member method Extension|tearOffsFromInstanceContext<T extends core::Object? = dynamic>(lowered final self::Class<self::Extension|tearOffsFromInstanceContext::T%> #this, self::Extension|tearOffsFromInstanceContext::T% value) → dynamic
  ;
static extension-member method Extension|get#tearOffsFromInstanceContext<T extends core::Object? = dynamic>(lowered final self::Class<self::Extension|get#tearOffsFromInstanceContext::T%> #this) → (self::Extension|get#tearOffsFromInstanceContext::T%) → dynamic
  return (self::Extension|get#tearOffsFromInstanceContext::T% value) → dynamic => self::Extension|tearOffsFromInstanceContext<self::Extension|get#tearOffsFromInstanceContext::T%>(#this, value);
static extension-member method Extension|fieldAccessFromInstanceContext<T extends core::Object? = dynamic>(lowered final self::Class<self::Extension|fieldAccessFromInstanceContext::T%> #this) → dynamic
  ;
static extension-member method Extension|get#fieldAccessFromInstanceContext<T extends core::Object? = dynamic>(lowered final self::Class<self::Extension|get#fieldAccessFromInstanceContext::T%> #this) → () → dynamic
  return () → dynamic => self::Extension|fieldAccessFromInstanceContext<self::Extension|get#fieldAccessFromInstanceContext::T%>(#this);
static extension-member method Extension|getterCallsFromInstanceContext<T extends core::Object? = dynamic>(lowered final self::Class<self::Extension|getterCallsFromInstanceContext::T%> #this, self::Extension|getterCallsFromInstanceContext::T% value) → dynamic
  ;
static extension-member method Extension|get#getterCallsFromInstanceContext<T extends core::Object? = dynamic>(lowered final self::Class<self::Extension|get#getterCallsFromInstanceContext::T%> #this) → (self::Extension|get#getterCallsFromInstanceContext::T%) → dynamic
  return (self::Extension|get#getterCallsFromInstanceContext::T% value) → dynamic => self::Extension|getterCallsFromInstanceContext<self::Extension|get#getterCallsFromInstanceContext::T%>(#this, value);
static method main() → dynamic
  ;
