| // 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 reified types of torn-off methods with type parameters that have |
| // explicit variance modifiers. |
| |
| // SharedOptions=--enable-experiment=variance |
| |
| import "package:expect/expect.dart"; |
| |
| class Contravariant<in T> { |
| int method(T x) {} |
| } |
| |
| class Invariant<inout T> { |
| T method(T x) {} |
| } |
| |
| class LegacyCovariant<T> { |
| int method(T x) {} |
| } |
| |
| class NoSuchMethod<inout T> implements Invariant<T> { |
| noSuchMethod(_) => 3; |
| } |
| |
| main() { |
| Contravariant<int> contraDiff = new Contravariant<num>(); |
| Expect.notType<int Function(Object)>(contraDiff.method); |
| Expect.type<int Function(num)>(contraDiff.method); |
| |
| Contravariant<num> contraSame = new Contravariant<num>(); |
| Expect.notType<int Function(Object)>(contraSame.method); |
| Expect.type<int Function(num)>(contraSame.method); |
| |
| Invariant<num> invSame = new Invariant<num>(); |
| Expect.notType<num Function(Object)>(invSame.method); |
| Expect.type<num Function(num)>(invSame.method); |
| |
| LegacyCovariant<num> legacyDiff = new LegacyCovariant<int>(); |
| Expect.type<int Function(Object)>(legacyDiff.method); |
| Expect.type<int Function(num)>(legacyDiff.method); |
| |
| LegacyCovariant<num> legacySame = new LegacyCovariant<num>(); |
| Expect.type<int Function(Object)>(legacySame.method); |
| Expect.type<int Function(num)>(legacySame.method); |
| |
| NoSuchMethod<num> nsm = new NoSuchMethod<num>(); |
| Expect.notType<num Function(Object)>(nsm.method); |
| Expect.type<num Function(num)>(nsm.method); |
| } |