library /*isNonNullableByDefault*/;
import self as self;
import "dart:core" as core;

typedef ListList<T extends core::Object? = dynamic> = core::List<core::List<T%>>;
class C extends core::Object {
  synthetic constructor •() → self::C
    : super core::Object::•()
    ;
  static method stat<T extends core::Object? = dynamic>(self::C::stat::T% value) → self::C::stat::T%
    return value;
  method inst<T extends core::Object? = dynamic>(self::C::inst::T% value) → self::C::inst::T%
    return value;
  method method() → void {
    (core::int) → core::int f1 = #C2;
    core::String f1TypeName = (#C2).{core::Object::runtimeType}{core::Type}.{core::Type::toString}(){() → core::String};
    (core::int) → core::int f2 = this.{self::C::inst}{<T extends core::Object? = dynamic>(T%) → T%}<core::int>;
    core::String f2TypeName = (this.{self::C::inst}{<T extends core::Object? = dynamic>(T%) → T%}<core::int>).{core::Object::runtimeType}{core::Type}.{core::Type::toString}(){() → core::String};
    (core::int) → core::int f3 = this.{self::C::inst}{<T extends core::Object? = dynamic>(T%) → T%}<core::int>;
    core::String f3TypeName = (this.{self::C::inst}{<T extends core::Object? = dynamic>(T%) → T%}<core::int>).{core::Object::runtimeType}{core::Type}.{core::Type::toString}(){() → core::String};
  }
}
abstract class M extends self::C /*isMixinDeclaration*/  {
  static method mstat<T extends core::Object? = dynamic>(self::M::mstat::T% value) → self::M::mstat::T%
    return value;
  method minst<T extends core::Object? = dynamic>(self::M::minst::T% value) → self::M::minst::T%
    return value;
  method mmethod() → void {
    (core::int) → core::int f1 = #C4;
    core::String f1TypeName = (#C4).{core::Object::runtimeType}{core::Type}.{core::Type::toString}(){() → core::String};
    (core::int) → core::int f2 = this.{self::M::minst}{<T extends core::Object? = dynamic>(T%) → T%}<core::int>;
    core::String f2TypeName = (this.{self::M::minst}{<T extends core::Object? = dynamic>(T%) → T%}<core::int>).{core::Object::runtimeType}{core::Type}.{core::Type::toString}(){() → core::String};
    (core::int) → core::int f3 = this.{self::M::minst}{<T extends core::Object? = dynamic>(T%) → T%}<core::int>;
    core::String f3TypeName = (this.{self::M::minst}{<T extends core::Object? = dynamic>(T%) → T%}<core::int>).{core::Object::runtimeType}{core::Type}.{core::Type::toString}(){() → core::String};
  }
}
abstract class _D&C&M extends self::C implements self::M /*isAnonymousMixin,isEliminatedMixin*/  {
  synthetic constructor •() → self::_D&C&M
    : super self::C::•()
    ;
  method minst<T extends core::Object? = dynamic>(self::_D&C&M::minst::T% value) → self::_D&C&M::minst::T%
    return value;
  method mmethod() → void {
    (core::int) → core::int f1 = #C4;
    core::String f1TypeName = (#C4).{core::Object::runtimeType}{core::Type}.{core::Type::toString}(){() → core::String};
    (core::int) → core::int f2 = this.{self::M::minst}{<T extends core::Object? = dynamic>(T%) → T%}<core::int>;
    core::String f2TypeName = (this.{self::M::minst}{<T extends core::Object? = dynamic>(T%) → T%}<core::int>).{core::Object::runtimeType}{core::Type}.{core::Type::toString}(){() → core::String};
    (core::int) → core::int f3 = this.{self::M::minst}{<T extends core::Object? = dynamic>(T%) → T%}<core::int>;
    core::String f3TypeName = (this.{self::M::minst}{<T extends core::Object? = dynamic>(T%) → T%}<core::int>).{core::Object::runtimeType}{core::Type}.{core::Type::toString}(){() → core::String};
  }
  static method mstat<T extends core::Object? = dynamic>(self::_D&C&M::mstat::T% value) → self::_D&C&M::mstat::T%
    return value;
}
class D extends self::_D&C&M {
  synthetic constructor •() → self::D
    : super self::_D&C&M::•()
    ;
  method method() → void {
    (core::int) → core::int f4 = super.{self::C::inst}<core::int>;
    core::String f4TypeName = (super.{self::C::inst}<core::int>).{core::Object::runtimeType}{core::Type}.{core::Type::toString}(){() → core::String};
  }
}
extension Ext on self::C {
  static method estat = self::Ext|estat;
  method einst = self::Ext|einst;
  tearoff einst = self::Ext|get#einst;
  method emethod = self::Ext|emethod;
  tearoff emethod = self::Ext|get#emethod;
}
static method top<T extends core::Object? = dynamic>(self::top::T% value) → self::top::T%
  return value;
static method Ext|estat<T extends core::Object? = dynamic>(self::Ext|estat::T% value) → self::Ext|estat::T%
  return value;
static method Ext|einst<T extends core::Object? = dynamic>(lowered final self::C #this, self::Ext|einst::T% value) → self::Ext|einst::T%
  return value;
static method Ext|get#einst(lowered final self::C #this) → <T extends core::Object? = dynamic>(T%) → T%
  return <T extends core::Object? = dynamic>(T% value) → T% => self::Ext|einst<T%>(#this, value);
static method Ext|emethod(lowered final self::C #this) → void {
  (core::int) → core::int f1 = #C6;
  core::String f1TypeName = (#C6).{core::Object::runtimeType}{core::Type}.{core::Type::toString}(){() → core::String};
  (core::int) → core::int f2 = self::Ext|get#einst(#this)<core::int>;
  core::String f2TypeName = (self::Ext|get#einst(#this)<core::int>).{core::Object::runtimeType}{core::Type}.{core::Type::toString}(){() → core::String};
  (core::int) → core::int f3 = self::Ext|get#einst(#this)<core::int>;
  core::String f3TypeName = (self::Ext|get#einst(#this)<core::int>).{core::Object::runtimeType}{core::Type}.{core::Type::toString}(){() → core::String};
}
static method Ext|get#emethod(lowered final self::C #this) → () → void
  return () → void => self::Ext|emethod(#this);
static method main() → void {
  core::Type t1 = #C7;
  core::Type t2 = #C8;
  function local<T extends core::Object? = dynamic>(T% value) → T%
    return value;
  (core::int) → core::int f3 = local<core::int>;
  self::D d = new self::D::•();
  (core::int) → core::int f4 = d.{self::C::inst}{<T extends core::Object? = dynamic>(T%) → T%}<core::int>;
  (core::int) → core::int f5 = d.{self::_D&C&M::minst}{<T extends core::Object? = dynamic>(T%) → T%}<core::int>;
  (core::int) → core::int f6 = self::Ext|get#einst(d)<core::int>;
  core::String typeName = (#C7).{core::Type::toString}(){() → core::String};
  core::String functionTypeName = (local<core::int>).{core::Object::runtimeType}{core::Type}.{core::Type::toString}(){() → core::String};
}

constants  {
  #C1 = tearoff self::C::stat
  #C2 = partial-instantiation self::C::stat <core::int*>
  #C3 = tearoff self::M::mstat
  #C4 = partial-instantiation self::M::mstat <core::int*>
  #C5 = tearoff self::Ext|estat
  #C6 = partial-instantiation self::Ext|estat <core::int*>
  #C7 = TypeLiteralConstant(core::List<core::int*>*)
  #C8 = TypeLiteralConstant(core::List<core::List<core::int*>*>*)
}
