// @dart = 2.9
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 {
  Number operator +(Object other) {}
  Number operator -(Object other) {}
}

class Class {
  Number field;
  Class(this.field);
}

extension ClassExtension on Class {
  Number get property => field;
  void set property(Number value) {}
  testImplicitProperties() {}
}

class IntClass {
  int field;
  IntClass(this.field);
}

extension IntClassExtension on IntClass {
  int get property => field;
  void set property(int value) {}
  testImplicitProperties() {}
}

main() {}
testLocals() {}
testProperties() {}
testIntProperties() {}
testExplicitProperties() {}
testExplicitIntProperties() {}
testExplicitNullAwareProperties(Class v) {}
testExplicitNullAwareIntProperties(IntClass v) {}
expect(expected, actual, [expectNull = false]) {}
