| // 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. |
| |
| /// @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 A {} |
| class C extends A { |
| 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 E<T extends A> on T { |
| 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); |
| } |