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

class Class extends core::Object {
  synthetic constructor •() → self::Class
    : super core::Object::•()
    ;
}
extension Extension on self::Class {
  method id = self::Extension|id;
  method tearoff id = self::Extension|get#id;
  get getter = self::Extension|get#getter;
  method method = self::Extension|method;
  method tearoff method = self::Extension|get#method;
  method errors = self::Extension|errors;
  method tearoff errors = self::Extension|get#errors;
}
static extension-member method Extension|id<T extends core::Object? = dynamic>(lowered final self::Class #this, self::Extension|id::T% t) → self::Extension|id::T%
  return t;
static extension-member method Extension|get#id(lowered final self::Class #this) → <T extends core::Object? = dynamic>(T%) → T%
  return <T extends core::Object? = dynamic>(T% t) → T% => self::Extension|id<T%>(#this, t);
static extension-member method Extension|get#getter(lowered final self::Class #this) → <T extends core::Object? = dynamic>(T%) → T%
  return self::Extension|get#id(#this);
static extension-member method Extension|method(lowered final self::Class #this) → dynamic {
  (core::String) → core::String stringId = self::Extension|get#id(#this)<core::String>;
}
static extension-member method Extension|get#method(lowered final self::Class #this) → () → dynamic
  return () → dynamic => self::Extension|method(#this);
static extension-member method Extension|errors(lowered final self::Class #this) → dynamic {
  (core::int) → core::int intId = self::Extension|get#getter(#this)<core::int>;
}
static extension-member method Extension|get#errors(lowered final self::Class #this) → () → dynamic
  return () → dynamic => self::Extension|errors(#this);
static method main() → dynamic {
  self::Class c = new self::Class::•();
  (core::int) → core::int intId = self::Extension|get#id(c)<core::int>;
  (core::double) → core::double doubleId = self::Extension|get#id(c)<core::double>;
}
static method errors() → dynamic {
  self::Class c = new self::Class::•();
  (core::num) → core::num numId = self::Extension|get#getter(c)<core::num>;
  (core::bool) → core::bool boolId = self::Extension|get#getter(c)<core::bool>;
}
