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

class Class extends core::Object {
  synthetic constructor •() → self::Class
    ;
}
class SubClass extends self::Class {
  synthetic constructor •() → self::SubClass
    ;
}
extension Extension<T extends core::Object? = dynamic> on T% {
  method method1 = self::Extension|method1;
  tearoff method1 = self::Extension|get#method1;
}
extension BoundExtension<T extends self::Class = self::Class> on T {
  method method2 = self::BoundExtension|method2;
  tearoff method2 = self::BoundExtension|get#method2;
}
static method Extension|method1<T extends core::Object? = dynamic>(final self::Extension|method1::T% #this) → self::Extension|method1::T%
  ;
static method Extension|get#method1<T extends core::Object? = dynamic>(final self::Extension|get#method1::T% #this) → () → self::Extension|get#method1::T%
  return () → self::Extension|get#method1::T% => self::Extension|method1<self::Extension|get#method1::T%>(#this);
static method BoundExtension|method2<T extends self::Class = self::Class>(final self::BoundExtension|method2::T #this) → self::BoundExtension|method2::T
  ;
static method BoundExtension|get#method2<T extends self::Class = self::Class>(final self::BoundExtension|get#method2::T #this) → () → self::BoundExtension|get#method2::T
  return () → self::BoundExtension|get#method2::T => self::BoundExtension|method2<self::BoundExtension|get#method2::T>(#this);
static method test1<T extends core::Object? = dynamic>(self::test1::T% t1) → self::Class
  ;
static method test2<T extends self::Class = self::Class>(self::test2::T t2) → dynamic
  ;
static method test3<T extends core::Object? = dynamic>(self::test3::T% t3) → dynamic
  ;
static method main() → dynamic
  ;
