| // 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 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 num, Y extends num> 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()"; |
| |
| Y i = 2.1 as Y; |
| Y get gi => i; |
| set si(Y v) { |
| i = v; |
| } |
| Y mi() => 22.1 as Y; |
| Type operator ~() => i.runtimeType; |
| } |
| |
| class A<T1, T2, T3, T4> implements B<T1>, C<T2>, I<T3>, J<T4> { |
| } |
| |
| class MA<X1 extends num, Y1 extends num> extends A<X1, Y1, S, T> with M<X1, Y1> { |
| } |
| |
| 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<int, double>(); |
| Expect.equals(double, ~ma); |
| Expect.equals(2.1, ma.i); |
| Expect.equals(22.1, ma.mi()); |
| Expect.equals(2.1, ma.gi); |
| ma.si = 3.14; |
| Expect.equals(3.14, ma.gi); |
| } |