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* {
  static method method = self::Extension|method;
  static method genericMethod = self::Extension|genericMethod;
  static get property = get self::Extension|property;
  static field field = self::Extension|field;
  static set property = set self::Extension|property;
}
static field dynamic Extension|field;
static method Extension|method() → dynamic {}
static method Extension|genericMethod<T extends core::Object* = dynamic>(self::Extension|genericMethod::T* t) → dynamic {}
static get Extension|property() → dynamic
  return 42;
static set Extension|property(dynamic value) → void {}
static method main() → dynamic {
  self::Extension|method();
  self::Extension|genericMethod<core::int*>(42);
  self::Extension|genericMethod<core::num*>(42);
  #C1;
  #C2;
  self::Extension|property;
  self::Extension|property = 42;
  self::Extension|field;
  self::Extension|field = 42;
}

constants  {
  #C1 = tearoff self::Extension|method
  #C2 = tearoff self::Extension|genericMethod
}
