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

class M {
}

class P0 {
  foo() {
    super.toString();    /// 01: compile-time error
    super.foo();         /// 02: compile-time error
    super.bar = 100;     /// 03: compile-time error

    void inner() {
      super.toString();  /// 04: compile-time error
      super.foo();       /// 05: compile-time error
      super.bar = 100;   /// 06: compile-time error
    }
    inner();

    (() {
      super.toString();  /// 07: compile-time error
      super.foo();       /// 08: compile-time error
      super.bar = 100;   /// 09: compile-time error
    })();

    return 42;
  }
}

class P1 {
  bar() {
    super.toString();    /// 10: compile-time error
    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();   /// 11: compile-time error
    return 99;
  }
}

typedef C = Object with M;
typedef D = Object with P0;
typedef E = Object with M, P1;
typedef 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());
}
