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

class Class extends core::Object {
  synthetic constructor •() → self::Class*
    : super core::Object::•()
    ;
  @#C3
  method instanceMethod() → dynamic {}
  @#C3
  static method staticMethod() → dynamic {}
  abstract member-signature get _identityHashCode() → core::int*;
  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*;
  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*;
  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*;
  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*;
  abstract member-signature operator ==(dynamic other) → core::bool*;
  abstract member-signature get hashCode() → core::int*;
  abstract member-signature method toString() → core::String*;
  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic;
  abstract member-signature get runtimeType() → core::Type*;
}
extension Extension on self::Class* {
  method extensionInstanceMethod = self::Extension|extensionInstanceMethod;
  tearoff extensionInstanceMethod = self::Extension|get#extensionInstanceMethod;
  static method extensionStaticMethod = self::Extension|extensionStaticMethod;
}
@#C3
static method Extension|extensionInstanceMethod(final self::Class* #this) → dynamic {}
static method Extension|get#extensionInstanceMethod(final self::Class* #this) → () →* dynamic
  return () → dynamic => self::Extension|extensionInstanceMethod(#this);
@#C3
static method Extension|extensionStaticMethod() → dynamic {}
@#C3
static method topLevelMethod() → dynamic {}
static method main() → dynamic {}

constants  {
  #C1 = "dart2js:noInline"
  #C2 = null
  #C3 = core::pragma {name:#C1, options:#C2}
}
