| // 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. |
| |
| // @dart = 2.9 |
| |
| /// @assertion The mixinMember production allows the same instance or static |
| /// members that a class would allow, but no constructors (for now). |
| /// |
| /// @description Checks that mixin declaration allows same instance or static |
| /// members that a class would allow. Test non abstract members and type |
| /// parameters |
| /// @author sgrekhov@unipro.ru |
| |
| import "../../Utils/expect.dart"; |
| |
| class S {} |
| class T {} |
| class X extends S {} |
| class Y extends T {} |
| |
| class I<T1> {} |
| class J<T1> {} |
| class B<T1> {} |
| class C<T1> {} |
| |
| mixin M<X extends S, Y extends T> on B<X>, C<Y> implements I<S>, J<T> { |
| static String s = "S.s"; |
| static String get gs => s; |
| static set ss(String v) { |
| s = v; |
| } |
| static String sf() => "S.sf()"; |
| |
| String i = "M.i"; |
| String get gi => i; |
| set si(String v) { |
| i = v; |
| } |
| String mi() => "M.mi()"; |
| int operator +(MA v) => v.i.length * 2; |
| } |
| |
| class A<T1, T2, T3, T4> implements B<T1>, C<T2>, I<T3>, J<T4> { |
| } |
| |
| class MA extends A<X, Y, S, T> with M<X, Y> { |
| } |
| |
| main() { |
| Expect.equals("S.s", M.s); |
| Expect.equals("S.sf()", M.sf()); |
| Expect.equals("S.s", M.gs); |
| M.ss = "x"; |
| Expect.equals("x", M.gs); |
| |
| MA ma = new MA(); |
| Expect.equals(6, ma + ma); |
| Expect.equals("M.i", ma.i); |
| Expect.equals("M.mi()", ma.mi()); |
| Expect.equals("M.i", ma.gi); |
| ma.si = "xx"; |
| Expect.equals("xx", ma.gi); |
| Expect.equals(4, ma + ma); |
| } |