blob: ec4fca2b227c98a144067fc43e8ad1c87271da16 [file] [log] [blame]
// 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 the emission of explicit variance modifiers.
// SharedOptions=--enable-experiment=variance
import 'dart:_runtime' as dart;
import 'package:expect/expect.dart';
class A<in T> {}
class B<out T> {}
class C<inout T> {}
class D<T> {}
class E<inout X, out Y, in Z> {}
mixin F<in T> {}
class G<inout T> = Object with F<T>;
List getVariances(Type typeWrapped) {
var type = dart.unwrapType(typeWrapped);
return dart.getGenericArgVariances(type);
}
void checkVariances(List v1, List v2) {
Expect.equals(v1.length, v2.length);
for (int i = 0; i < v1.length; i++) {
Expect.equals(v1[i], v2[i]);
}
}
main() {
checkVariances(getVariances(A), [dart.Variance.contravariant]);
checkVariances(getVariances(B), [dart.Variance.covariant]);
checkVariances(getVariances(C), [dart.Variance.invariant]);
// Implicit variance is not emitted into the generated code.
Expect.isNull(getVariances(D));
checkVariances(getVariances(E), [dart.Variance.invariant, dart.Variance.covariant, dart.Variance.contravariant]);
checkVariances(getVariances(F), [dart.Variance.contravariant]);
checkVariances(getVariances(G), [dart.Variance.invariant]);
}