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

/// @assertion The mixin introduced by a mixin declaration contains all the
/// non-static members declared by the mixin, just as the mixin derived from a
/// class declaration currently does.
///
/// @description Checks that a mixin declaration doesn't contain the static
/// members declared by the mixin
/// @author ngl@unipro.ru
/// @author sgrekhov@unipro.ru


class I {
  static int i1 = 1;
}

abstract class J {
  static int j1 = 2;
}

class A {
  static int b1 = 3;
}

abstract class B {
  static int b1 = 3;
}

class C implements A, B {
  static int c1 = 4;
}

mixin M on A, B implements I, J {
  static int m1 = 5;
}

class MA extends C with M {
  test() {
    i1 == 1;
//  ^^
// [analyzer] COMPILE_TIME_ERROR.UNDEFINED_IDENTIFIER
// [cfe] The getter 'i1' isn't defined for the class 'MA'.
    j1 == 2;
//  ^^
// [analyzer] COMPILE_TIME_ERROR.UNDEFINED_IDENTIFIER
// [cfe] The getter 'j1' isn't defined for the class 'MA'.
    b1 == 3;
//  ^^
// [analyzer] COMPILE_TIME_ERROR.UNDEFINED_IDENTIFIER
// [cfe] The getter 'b1' isn't defined for the class 'MA'.
    c1 == 4;
//  ^^
// [analyzer] COMPILE_TIME_ERROR.UNQUALIFIED_REFERENCE_TO_NON_LOCAL_STATIC_MEMBER
// [cfe] The getter 'c1' isn't defined for the class 'MA'.
    m1 == 5;
//  ^^
// [analyzer] COMPILE_TIME_ERROR.UNQUALIFIED_REFERENCE_TO_NON_LOCAL_STATIC_MEMBER
// [cfe] The getter 'm1' isn't defined for the class 'MA'.
  }
}

main() {
  MA ma = new MA();
  MA.i1 == 1;
  // ^^
  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
  // [cfe] Member not found: 'i1'.
  MA.j1 == 2;
  // ^^
  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
  // [cfe] Member not found: 'j1'.
  MA.b1 == 3;
  // ^^
  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
  // [cfe] Member not found: 'b1'.
  MA.c1 == 4;
  // ^^
  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
  // [cfe] Member not found: 'c1'.
  MA.m1 == 5;
  // ^^
  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
  // [cfe] Member not found: 'm1'.

  ma.test();
}
