class Number {
  final int value;
  Number(this.value);
  int get hashCode => value.hashCode;
  bool operator ==(Object other) => other is Number && value == other.value;
  String toString() => 'Number($value)';
}
extension NumberExtension ;
on Number (){}
class Class {
  Number field;
  Class(this.field);
}
extension ClassExtension ;
on Class (){}
class IntClass {
  int field;
  IntClass(this.field);
}
extension IntClassExtension ;
on IntClass (){}
main() {}
testLocals() {}
testProperties() {}
testIntProperties() {}
testExplicitProperties() {}
testExplicitIntProperties() {}
testExplicitNullAwareProperties(Class v) {}
testExplicitNullAwareIntProperties(IntClass v) {}
expect(expected, actual, [expectNull = false]) {}
