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]) { }
