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

// noSuchMethod does not overwrite actual implementations, so if an
// implementation of a member exists that doesn't fulfill the interface it's
// an error.
// On the other hand, if no implementation exists,
// noSuchMethod will take its place and everything is okay.

class B {
  foo(int x, // force formatter to not combine these lines.
          {int? y} //# 02: compile-time error
          ) =>
      x;
}

class C extends B {
  foo(int x, // force formatter to not combine these lines.
      {int? y} //# 01: compile-time error
      );
  bar();

  noSuchMethod(i) {
    print("No such method!");
    return 42;
  }
}

abstract class D {
  foo(int x, // force formatter to not combine these lines.
      {int? y} //# 03: ok
      );
}

abstract class E {
  foo(int x, // force formatter to not combine these lines.
      {int? y} //# 04: ok
      );
}

class F extends D implements E {
  noSuchMethod(i) {
    print("No such method!");
    return 42;
  }
}

class G {
  foo(int x, // force formatter to not combine these lines.
          {int? y} //# 05: ok
          ) =>
      x;
}

class H {
  foo(int x, // force formatter to not combine these lines.
          {int? y} //# 06: compile-time error
          ) =>
      x;
}

class I extends G implements H {
  noSuchMethod(i) {
    print("No such method: $i!");
    return 42;
  }
}

main() {
  var c = new C();
  c.foo(123);
  c.bar();
  var f = new F();
  f.foo(42);
  var i = new I();
  i.foo(42);
}
