// Copyright (c) 2017, 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

library covariant_override_test;

// This test contains cases where `covariant` is used as intended.

abstract class A {
  A(this.f1, this.f2, this.f3);

  // Normal usage, "by design": superclass requests covariance.
  void m1(covariant Object o);

  // Normal usage, "ad hoc": subclass requests covariance.
  void m2(Object o);

  // Syntactic special case: omit the type in subclass.
  void m3(Object o);

  // Positional optional arguments.
  void m4([covariant Object o]);
  void m5([Object o]);
  void m6([Object o]);

  // Named arguments.
  void m7({covariant Object arg});
  void m8({Object arg});
  void m9({Object arg});

  // Normal usage on field, "by design": superclass requests covariance.
  covariant Object f1;

  // Normal usage on field, "ad hoc": subclass requests covariance.
  Object f2;

  // Syntactic special case.
  Object f3;
}

abstract class B extends A {
  B(num f1, num f2, num f3) : super(f1, f2, f3);

  void m1(num n);
  void m2(covariant num n);
  void m3(covariant n);
  void m4([num n]);
  void m5([covariant num n]);
  void m6([covariant n]);
  void m7({num arg});
  void m8({covariant num arg});
  void m9({covariant arg});
  void set f1(num n);
  void set f2(covariant num n);
  void set f3(covariant n);
}

class C extends B {
  C(int f1, int f2, int f3) : super(f1, f2, f3);

  void m1(int i) {}
  void m2(int i) {}
  void m3(int i) {}
  void m4([int i]) {}
  void m5([int i]) {}
  void m6([int i]) {}
  void m7({int arg}) {}
  void m8({int arg}) {}
  void m9({int arg}) {}
  void set f1(covariant int i) {}
  void set f2(covariant int i) {}
  void set f3(int i) {}
}

main() {
  // For Dart 1.x, `covariant` has no runtime semantics; we just ensure
  // that the code is not unused, such that we know it will be parsed.
  A a = new C(39, 40, 41);
  a.m1(42);
  a.m2(42);
  a.m3(42);
  a.m4(42);
  a.m5(42);
  a.m6(42);
  a.m7(arg: 42);
  a.m8(arg: 42);
  a.m9(arg: 42);
  a.f1 = 42;
  a.f2 = 42;
  a.f3 = 42;
}
