// 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.

// test w/ `pub run test -N unnecessary_overrides`

class Base {
  int get x => 0;
  set x(other) {}

  int max1(int a, int b) => 0;
  int max2(int a, int b) => 0;
  int m1({int a, int b}) => 0;
  int m2({int a, int b}) => 0;
  int m3({int a, int b}) => 0;
  int operator +(other) => 0;
  Base operator ~()=> null;
}

class Parent extends Base {
  @override
  int get x => super.x; // LINT

  @override
  set x(other) { // LINT
    super.x = other;
  }

  @override
  int max1(int a, int b) => super.max1(a, b); // LINT

  @override
  int max2(int a, int b) => super.max2(b, a); // OK

  @override
  int m1({int a, int b}) => super.m1(a: a, b: b); // LINT

  @override
  int m2({int a, int b}) => super.m2(b: b, a: a); // LINT

  @override
  int m3({int a, int b}) => super.m3(b: a, a: b); // OK

  @override
  int operator +(other) => super + other; // LINT

  @override
  Base operator ~()=> ~super; // LINT
}

class Okay extends Parent {
  final a = new Parent();
  @override
  int get x => a.x; // OK

  @override
  set x(other) { // OK
    a.x = other;
  }
}

class NoError extends Okay {
  @override
  int get x => x; // OK

  @override
  set x(other) { // OK
    x = other;
  }
}

class A {
  void foo() {}

  void bar() {}

  int getA(Iterable a) => 0;

  int getB(Iterable a) => 0;

  int getC(Iterable a) => 0;
}

class B extends A {
  @override
  void foo() { // LINT
    super.foo();
  }

  @override
  void bar() { // OK
    bar();
  }

  @override
  int getA(Iterable a) => super.getA(a); // LINT

  @override
  int getB(Iterable a) { // LINT
    return super.getB(a);
  }

  @override
  int getC(Iterable a) { // OK
    print("something");
    return super.getC(a);
  }
}

class C {
  num get g => null;
  set s(int v) => null;
  num m(int v) => null;
  num m1({int v = 20}) => null;
  num m2([int v = 20]) => null;
  num operator +(int other) => null;
}
class ReturnTypeChanged extends C {
  @override
  int get g => super.g; // OK
  @override
  int m(int v) => super.m(v); // OK
  @override
  int m1({int v = 20}) => super.m1(v: v); // OK
  @override
  int m2([int v = 20]) => super.m2(v); // OK
  @override
  int operator +(int other) => super + other; // OK
}
class ParameterTypeChanged extends C {
  @override
  set s(num v) => super.s = v; // OK
  @override
  num m(num v) => super.m(v); // OK
  @override
  num m1({num v = 20}) => super.m1(v: v); // OK
  @override
  num m2([num v = 20]) => super.m2(v); // OK
  @override
  num operator +(num other) => super + other; // OK
}
class ParameterNameChanged extends C {
  @override
  set s(num v2) => super.s = v2; // OK
  @override
  num m(int v2) => super.m(v2); // OK
  @override
  num m2([int v2 = 20]) => super.m2(v2); // OK
  @override
  num operator +(int other2) => super + other2; // OK
}
class ParameterCovarianceChanged extends C {
  @override
  set s(covariant int v) => super.s = v; // OK
  @override
  num m(covariant int v) => super.m(v); // OK
  @override
  num m1({covariant int v = 20}) => super.m1(v: v); // OK
  @override
  num m2([covariant int v = 20]) => super.m2(v); // OK
  @override
  num operator +(covariant int other) => super + other; // OK
}
class ParameterAdditional extends C {
  @override
  num m(int v, [int v2]) => super.m(v); // OK
  @override
  num m1({int v = 20, int v2}) => super.m1(v: v); // OK
  @override
  num m2([int v = 20, int v2]) => super.m2(v); // OK
}
class ParameterDefaultChange extends C {
  @override
  num m1({int v = 10}) => super.m1(v: v); // OK
  @override
  num m2([int v = 10]) => super.m2(v); // OK
}

// noSuchMethod is allowed to proxify
class D implements C {
  @override
  dynamic noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
}

class E extends C {
  /// it's ok to override to provide better documentation
  @override
  num get g => super.g; // OK
}