| // 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. |
| |
| // Tests variance usage multiple type parameters. |
| |
| // SharedOptions=--enable-experiment=variance |
| |
| typedef CovFunction<T> = T Function(); |
| typedef ContraFunction<T> = void Function(T); |
| |
| class Covariant<out T> {} |
| class Contravariant<in T> {} |
| |
| class A<in T, out U> {} |
| class B<in T, out U, inout V> {} |
| |
| class C<inout T, in U, out V> extends A<T, V> {} |
| class D<inout T, in U, out V> extends B<U, V, T> {} |
| class E<inout T, in U, out V> extends B<T, T, T> {} |
| |
| class F<inout T, in U, out V> extends A<Contravariant<V>, Contravariant<U>> {} |
| class G<inout T, in U, out V> extends A<Covariant<Contravariant<V>>, Contravariant<Covariant<U>>> {} |
| class H<inout T, in U, out V> extends B<Covariant<U>, Covariant<V>, Covariant<T>> {} |
| |
| class I<inout T, in U, out V> extends A<ContraFunction<V>, ContraFunction<U>> {} |
| class J<inout T, in U, out V> extends A<CovFunction<ContraFunction<V>>, ContraFunction<CovFunction<U>>> {} |
| class K<inout T, in U, out V> extends B<CovFunction<U>, CovFunction<V>, CovFunction<T>> {} |
| |
| main() { |
| A<num, bool> a = A(); |
| B<num, bool, String> b = B(); |
| C<num, bool, String> c = C(); |
| D<num, bool, String> d = D(); |
| E<num, bool, String> e = E(); |
| F<num, bool, String> f = F(); |
| G<num, bool, String> g = G(); |
| H<num, bool, String> h = H(); |
| I<num, bool, String> i = I(); |
| J<num, bool, String> j = J(); |
| K<num, bool, String> k = K(); |
| } |