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

// SharedOptions=--enable-experiment=extension-methods

// Tests interactions between getters and setters where there is a conflict.

// Conflicting class declarations.

class C0 {
  int get m1 => 0;
  void set m2(int x) {}
  int operator[](int index) => 0;
}

extension E0 on C0 {
  void set m1(int x) {}
  int get m2 => 0;
  void operator[]=(int index, int value) {}
}

void test0() {
  C0 c0 = C0();
  c0.m1;
  c0.m1 = 0;
  // ^^
  // [analyzer] STATIC_WARNING.ASSIGNMENT_TO_FINAL_NO_SETTER
  // [cfe] unspecified
  E0(c0).m1 = 0;
  E0(c0).m1;
  //     ^^
  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_EXTENSION_GETTER
  // [cfe] unspecified

  c0.m1 += 0;
  // ^^
  // [analyzer] STATIC_WARNING.ASSIGNMENT_TO_FINAL_NO_SETTER
  // [cfe] unspecified

  c0.m1++;
  // ^^
  // [analyzer] STATIC_WARNING.ASSIGNMENT_TO_FINAL_NO_SETTER
  // [cfe] unspecified

  c0.m2 = 0;
  c0.m2;
  // ^^
  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
  // [cfe] unspecified
  c0.m2 += 0;
  // ^^
  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
  // [cfe] unspecified
  c0.m2++;
  // ^^
  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
  // [cfe] unspecified

  E0(c0).m2;

  c0[0];
  c0[0] = 0;
  // ^^^^^^
  // [analyzer] unspecified
  // [cfe] unspecified
  E0(c0)[0];
  // ^^^^^^
  // [analyzer] unspecified
  // [cfe] unspecified
  E0(c0)[0] = 0;

  c0[0] += 0;
  // ^^^^^^
  // [analyzer] unspecified
  // [cfe] unspecified
  c0[0]++;
  // ^^^^^^
  // [analyzer] unspecified
  // [cfe] unspecified

  E0(c0)[0] += 0;
  // ^^^^^^
  // [analyzer] unspecified
  // [cfe] unspecified
  E0(c0)[0]++;
  // ^^^^^^
  // [analyzer] unspecified
  // [cfe] unspecified
}

// Conflicting extensions.

class C1<T> {}

extension E1A<T> on C1<T> {
  int get m1 => 0;
  void set m2(int x) {}
  int operator[](int index) => 0;
}

extension E1B on C1<Object> {
  void set m1(int x) {}
  int get m2 => 0;
  void operator[]=(int index, int value) {}
}

void test1() {
  C1<int> c1a = C1<Null>(); // E1A is more specific.
  c1a.m1;

  c1a.m1 = 0;
  //  ^^
  // [analyzer] STATIC_WARNING.ASSIGNMENT_TO_FINAL_LOCAL
  // [cfe] unspecified

  c1a.m2;
  //  ^^
  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
  // [cfe] unspecified

  c1a.m2 = 0;

  c1a[0] = 0;
  //  ^^
  // [analyzer] unspecified
  // [cfe] unspecified

  c1a[0] += 0;
  //  ^^
  // [analyzer] unspecified
  // [cfe] unspecified

  c1a[0]++;
  //  ^^
  // [analyzer] unspecified
  // [cfe] unspecified

  c1a[0];

  C1<Object> c1b = C1<Null>(); // Neither extension is more specific.

  c1b.m1;
  //  ^^
  // [analyzer] COMPILE_TIME_ERROR.AMBIGUOUS_EXTENSION_MEMBER_ACCESS
  // [cfe] unspecified

  c1b.m1 = 0;
  //  ^^
  // [analyzer] COMPILE_TIME_ERROR.AMBIGUOUS_EXTENSION_MEMBER_ACCESS
  // [cfe] unspecified

  c1b.m1 += 0;
  //  ^^
  // [analyzer] COMPILE_TIME_ERROR.AMBIGUOUS_EXTENSION_MEMBER_ACCESS
  //  ^^
  // [cfe] unspecified
  //  ^^
  // [cfe] unspecified

  c1b.m1++;
  //  ^^
  // [analyzer] COMPILE_TIME_ERROR.AMBIGUOUS_EXTENSION_MEMBER_ACCESS
  //  ^^
  // [cfe] unspecified
  //  ^^
  // [cfe] unspecified

  c1b.m2;
  //  ^^
  // [analyzer] COMPILE_TIME_ERROR.AMBIGUOUS_EXTENSION_MEMBER_ACCESS
  // [cfe] unspecified

  c1b[0];
  //  ^^
  // [analyzer] unspecified
  // [cfe] unspecified

  c1b[0] = 0;
  //  ^^
  // [analyzer] unspecified
  // [cfe] unspecified

  c1b[0] += 0;
  //  ^^
  // [analyzer] unspecified
  // ^
  // [cfe] unspecified
  // ^
  // [cfe] unspecified

  c1b[0]++;
  //  ^^
  // [analyzer] unspecified
  // ^
  // [cfe] unspecified
  // ^
  // [cfe] unspecified
}

// Getter on the extension itself.
class C2 {
  int get m1 => 0;
  void set m2(int x) {}
  int get mc => 0;
  void operator[]=(int index, int value) {}
}

extension E2 on C2 {
  void set m1(int x) {}
  int get m2 => 0;
  String get me => "";
  int operator[](int index) => 0;


  void test2() {
    // Using `this.member` means using the `on` type.

    this.m1;
    this.m1 = 0;
    //   ^^
    // [analyzer] STATIC_WARNING.ASSIGNMENT_TO_FINAL_NO_SETTER
    // [cfe] unspecified

    this.m2 = 0;
    this.m2;
    //   ^^
    // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
    // [cfe] unspecified

    this[0] = 0;
    this[0];
    //   ^^
    // [analyzer] unspecified
    // [cfe] unspecified

    this[0] += 0;
    //   ^^
    // [analyzer] unspecified
    // [cfe] unspecified

    this[0] ++;
    //   ^^
    // [analyzer] unspecified
    // [cfe] unspecified

    // Check that `this.mc` refers to `C2.mc`.
    this.mc.toRadixString(16);
    // Check that `this.me` refers to `E2.me`.
    this.me.substring(0);
  }
}

main() {
  test0();
  test1();
  C2().test2();
}
