// Copyright (c) 2020, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// @dart=2.9

abstract class A {
  int get property1; // ok
  void set property1(int i);

  num get property2a; // ok
  void set property2a(int i);

  int get property2b; // ok
  void set property2b(num i);

  String get property3; // error
  void set property3(int i);

  int property4; // ok

  int property5; // ok

  covariant String property6; // ok

  static int get property7 => 0; // ok
  static void set property7(int value) {}

  static int get property8a => 0; // ok
  static void set property8a(num value) {}

  static num get property8b => 0; // ok
  static void set property8b(int value) {}

  static num get property9 => 0; // error
  static void set property9(String value) {}
}

abstract class B1 {
  int get property1;

  int get property2;

  String get property3;

  final int property4;

  final int property5;

  final String property6;

  B1(this.property4, this.property5, this.property6);
}

abstract class B2 implements B1 {
  void set property1(int i); // ok

  void set property2(String i); // error

  void set property3(int i); // error

  void set property4(int i); // ok

  void set property5(String i); // error

  void set property6(int i); // error
}

abstract class C1 {
  void set property1(int i);

  void set property2(String i);

  void set property3(int i);

  int property4;

  String property5;

  int property6;
}

abstract class C2 implements C1 {
  int get property1; // ok

  int get property2; // error

  String get property3; // error

  int get property4; // ok

  // This results in two errors; one for the getter/setter type mismatch and one
  // for the getter override.
  int get property5; // error

  // This results in two errors; one for the getter/setter type mismatch and one
  // for the getter override.
  String get property6; // error
}

abstract class D1 {
  int get property1;

  int get property2;

  String get property3;
}

abstract class D2 {
  void set property1(int i);

  void set property2(String i);

  void set property3(int i);
}

abstract class D3 implements D1, D2 /* error on property2 and property3 */ {}

abstract class D4
    implements D3 /* no need for error on property2 and property3 */ {}

extension Extension<T extends num, S extends T> on int {
  int get property1 => 0; // ok
  void set property1(int i) {}

  num get property2a => 0; // ok
  void set property2a(int i) {}

  int get property2b => 0; // ok
  void set property2b(num i) {}

  String get property3 => ''; // error
  void set property3(int i) {}

  S get property4 => 0; // ok
  void set property4(S i) {}

  S get property5a => 0; // ok
  void set property5a(T i) {}

  T get property5b => 0; // ok
  void set property5b(S i) {}

  String get property6 => ''; // error
  void set property6(S i) {}

  static int get property7 => 0; // ok
  static void set property7(int value) {}

  static int get property8a => 0; // ok
  static void set property8a(num value) {}

  static num get property8b => 0; // ok
  static void set property8b(int value) {}

  static num get property9 => 0; // error
  static void set property9(String value) {}
}

main() {}
