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> on T {
  method method2 = self::BoundExtension|method2;
  tearoff method2 = self::BoundExtension|get#method2;
}
static method Extension|method1<T extends core::Object? = dynamic>(lowered final self::Extension|method1::T% #this) → self::Extension|method1::T%
  ;
static method Extension|get#method1<T extends core::Object? = dynamic>(lowered 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>(lowered final self::BoundExtension|method2::T #this) → self::BoundExtension|method2::T
  ;
static method BoundExtension|get#method2<T extends self::Class>(lowered 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::test2::T t2) → dynamic
  ;
static method test3<T extends core::Object? = dynamic>(self::test3::T% t3) → dynamic
  ;
static method main() → dynamic
  ;
