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

class I<T extends core::Object? = dynamic> extends core::Object {
  synthetic constructor •() → self::I<self::I::T%>
    ;
}
class J<T extends core::Object? = dynamic> extends self::I<self::J::T%> {
  synthetic constructor •() → self::J<self::J::T%>
    ;
}
class A<T extends core::Object? = dynamic> extends self::J<self::A::T%> {
  synthetic constructor •() → self::A<self::A::T%>
    ;
}
extension /* unnamed */ _extension#0<T extends core::Object? = dynamic> on self::I<T%> {
  get member = self::_extension#0|get#member;
}
static field core::int counter;
static extension-member method _extension#0|get#member<T extends core::Object? = dynamic>(lowered final self::I<self::_extension#0|get#member::T%> #this) → core::num
  ;
static method method1(self::I<core::num> i) → core::num
  ;
static method method2(self::A<core::num> i) → core::num
  ;
static method main() → dynamic
  ;
static method expect(dynamic expected, dynamic actual) → dynamic
  ;
