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

class Class extends core::Object {
  synthetic constructor •() → self::Class
    ;
  method noSuchMethod(core::Invocation i) → dynamic
    ;
}
extension ClassExtension on self::Class {
  method method = self::ClassExtension|method;
  method tearoff method = self::ClassExtension|get#method;
}
extension Extension on dynamic {
  method method = self::Extension|method;
  method tearoff method = self::Extension|get#method;
}
static extension-member method ClassExtension|method(lowered final self::Class #this) → core::int
  ;
static extension-member method ClassExtension|get#method(lowered final self::Class #this) → () → core::int
  return () → core::int => self::ClassExtension|method(#this);
static extension-member method Extension|method(lowered final dynamic #this) → core::int
  ;
static extension-member method Extension|get#method(lowered final dynamic #this) → () → core::int
  return () → core::int => self::Extension|method(#this);
static method main() → dynamic
  ;
static method expect(dynamic expected, dynamic actual) → dynamic
  ;
