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

import "package:expect/expect.dart";

class M {}

class P0 {
  foo() {
    super.toString();
    super.foo();
    //    ^^^
    // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_SUPER_MEMBER
    // [cfe] Superclass has no method named 'foo'.
    super.bar = 100;
    //    ^^^
    // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_SUPER_MEMBER
    // [cfe] Superclass has no setter named 'bar'.

    void inner() {
      super.toString();
      super.foo();
      //    ^^^
      // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_SUPER_MEMBER
      // [cfe] Superclass has no method named 'foo'.
      super.bar = 100;
      //    ^^^
      // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_SUPER_MEMBER
      // [cfe] Superclass has no setter named 'bar'.
    }
    inner();

    (() {
      super.toString();
      super.foo();
      //    ^^^
      // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_SUPER_MEMBER
      // [cfe] Superclass has no method named 'foo'.
      super.bar = 100;
      //    ^^^
      // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_SUPER_MEMBER
      // [cfe] Superclass has no setter named 'bar'.
    })();

    return 42;
  }
}

class P1 {
  bar() {
    super.toString();
    return 87;
  }

  // The test method is strategically placed here to try to force the
  // P1 class and its bar method to be resolved before resolving the
  // mixin applications.
  test() {
    new C();
    var d = new D();
    var e = new E();
    var f = new F();
    Expect.equals(42, d.foo());
    Expect.equals(87, e.bar());
    Expect.equals(99, f.baz());
  }
}

class P2 {
  baz() {
    super.toString();
    return 99;
  }
}

class C = Object with M;
class D = Object with P0;
class E = Object with M, P1;
class F = Object with P2, M;

main() {
  var p1 = new P1();
  var p2 = new P2();
  Expect.equals(87, p1.bar());
  p1.test();
  Expect.equals(99, p2.baz());
}
