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

// @dart = 2.9

/// @assertion For any member access, x.foo, x.bar(), x.baz = 42, x(42), x[0] = 1
/// or x + y, including null-aware and cascade accesses which effectively desugar
/// to one of those direct accesses, and including implicit member accesses on
/// this, the language first checks whether the static type of x has a member
/// with the same base name as the operation. That is, if it has a corresponding
/// instance member, respectively, a foo method or getter or a foo= setter, a bar
/// member or bar= setter, a baz member or baz= setter, a call method, a
/// []= operator or a + operator. If so, then the operation is unaffected by
/// extensions. This check does not care whether the invocation is otherwise
/// correct, based on number or type of the arguments, it only checks whether
/// there is a member at all.
///
/// @description Check that an instance member takes a precedence over an
/// extension member
/// @author sgrekhov@unipro.ru


import "../../Utils/expect.dart";

class C {
  String m;
  String get getter => "C getter";
  void set setter(String v) {
    m = v;
  }
  String method(int i) => "$i";
  String operator+(C other) => "C +";
  void operator[]=(int index, String value) {
    m = "[$index]=$value";
  }
}

extension on C {
  String get getter => "Extension getter";
  String get m => "m getter";
  void set setter(String v) {}
  void set m(String v) {}
  String method(int i) => "Extension: $i";
  String operator+(C other) => "Extension +";
  void operator[]=(int index, String value) {}
}

main() {
  C c = new C();
  Expect.equals("C getter", c.getter);
  c.m = "Lily was here";
  Expect.equals("Lily was here", c.m);
  c.setter = "Run, Forrest, run";
  Expect.equals("Run, Forrest, run", c.m);
  Expect.equals("42", c.method(42));
  Expect.equals("C +", c + c);
  c[42]="xxx";
  Expect.equals("[42]=xxx", c.m);
}
