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

class Number extends core::Object {
  final field core::int* value;
  constructor •(core::int* value) → self::Number*
    ;
  get hashCode() → core::int*
    ;
  operator ==(core::Object* other) → core::bool*
    ;
  method toString() → core::String*
    ;
}
class Class extends core::Object {
  field self::Number* field;
  constructor •(self::Number* field) → self::Class*
    ;
}
extension NumberExtension on self::Number* {
  operator + = self::NumberExtension|+;
  operator - = self::NumberExtension|-;
}
extension ClassExtension on self::Class* {
  get property = self::ClassExtension|get#property;
  method testImplicitProperties = self::ClassExtension|testImplicitProperties;
  tearoff testImplicitProperties = self::ClassExtension|get#testImplicitProperties;
  set property = self::ClassExtension|set#property;
}
static method NumberExtension|+(final self::Number* #this, core::Object* other) → self::Number*
  ;
static method NumberExtension|-(final self::Number* #this, core::Object* other) → self::Number*
  ;
static method ClassExtension|get#property(final self::Class* #this) → self::Number*
  ;
static method ClassExtension|set#property(final self::Class* #this, self::Number* value) → void
  ;
static method ClassExtension|testImplicitProperties(final self::Class* #this) → dynamic
  ;
static method ClassExtension|get#testImplicitProperties(final self::Class* #this) → () →* dynamic
  return () → dynamic => self::ClassExtension|testImplicitProperties(#this);
static method main() → dynamic
  ;
static method testLocals() → dynamic
  ;
static method testProperties() → dynamic
  ;
static method testExplicitProperties() → dynamic
  ;
static method testExplicitNullAwareProperties(self::Class* v) → dynamic
  ;
static method expect(dynamic expected, dynamic actual, [dynamic expectNull]) → dynamic
  ;
