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

class Class<T extends self::Class<self::Class::T*>* = self::Class<dynamic>*> extends core::Object {
  synthetic constructor •() → self::Class<self::Class::T*>*
    : super core::Object::•()
    ;
}
class Subclass extends self::Class<self::Subclass*> {
  synthetic constructor •() → self::Subclass*
    : super self::Class::•()
    ;
}
extension _extension#0<R extends core::Object* = dynamic, T extends core::Object* = dynamic> on (T*) →* R* {
  get returnType = self::_extension#0|get#returnType;
  get parameterType = self::_extension#0|get#parameterType;
}
extension _extension#1<T extends self::Class<T*>* = dynamic> on <S extends T* = dynamic>(T*, S*) →* dynamic {
  get parameterType = self::_extension#1|get#parameterType;
}
static method _extension#0|get#returnType<R extends core::Object* = dynamic, T extends core::Object* = dynamic>(final (self::_extension#0|get#returnType::T*) →* self::_extension#0|get#returnType::R* #this) → core::Type*
  return self::_extension#0|get#returnType::R*;
static method _extension#0|get#parameterType<R extends core::Object* = dynamic, T extends core::Object* = dynamic>(final (self::_extension#0|get#parameterType::T*) →* self::_extension#0|get#parameterType::R* #this) → core::Type*
  return self::_extension#0|get#parameterType::T*;
static method _extension#1|get#parameterType<T extends self::Class<self::_extension#1|get#parameterType::T*>* = dynamic>(final <S extends self::_extension#1|get#parameterType::T* = dynamic>(self::_extension#1|get#parameterType::T*, S*) →* dynamic #this) → core::Type*
  return self::_extension#1|get#parameterType::T*;
static method main() → dynamic {
  function local1(core::int* i) → core::int*
    return i;
  core::print(self::_extension#0|get#returnType<core::int*, core::int*>(local1));
  core::print(self::_extension#0|get#parameterType<core::int*, core::int*>(local1));
  function local2<S extends self::Subclass* = self::Subclass*>(self::Subclass* a, S* b) → self::Subclass*
    return a;
  core::print(self::_extension#1|get#parameterType<self::Subclass*>(local2));
}
