|  | // Copyright (c) 2011, 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. | 
|  |  | 
|  | import "package:expect/expect.dart"; | 
|  |  | 
|  | // Checks that a method with an instantiated return type can override a method | 
|  | // with a generic return type. | 
|  |  | 
|  | typedef V RemoveFunctionType<K, V>(K key); | 
|  |  | 
|  | class MapBase<K, V> { | 
|  | K remove(K key) { | 
|  | throw 'Must be implemented'; | 
|  | } | 
|  |  | 
|  | void tests() { | 
|  | Expect.isTrue(this is MapBase<int, int>); | 
|  |  | 
|  | // `remove` takes an argument which is covariant-by-class, so | 
|  | // the tear-off has dynamic type `int Function(Object)`. | 
|  |  | 
|  | Expect.isTrue(remove is RemoveFunctionType); | 
|  | Expect.isTrue(remove is RemoveFunctionType<int, int>); | 
|  | Expect.isTrue(remove is RemoveFunctionType<String, int>); | 
|  | Expect.isTrue(remove is RemoveFunctionType<MapBase<int, int>, int>); | 
|  | } | 
|  | } | 
|  |  | 
|  | class MethodOverrideTest extends MapBase<String, String> { | 
|  | String remove(String key) { | 
|  | throw 'Must be implemented'; | 
|  | } | 
|  |  | 
|  | void tests() { | 
|  | Expect.isTrue(this is MethodOverrideTest); | 
|  | Expect.isTrue(this is MapBase<String, String>); | 
|  |  | 
|  | // `remove` takes an argument which is covariant-by-class because | 
|  | // an overridden method does so, and hence the tear-off has dynamic | 
|  | // type `String Function(Object)`; so does `super.remove`. | 
|  |  | 
|  | Expect.isTrue(remove is RemoveFunctionType); | 
|  | Expect.isTrue(remove is RemoveFunctionType<String, String>); | 
|  | Expect.isTrue(remove is! RemoveFunctionType<int, int>); | 
|  | Expect.isTrue(super.remove is RemoveFunctionType); | 
|  | Expect.isTrue(super.remove is RemoveFunctionType<String, String>); | 
|  | Expect.isTrue(super.remove is! RemoveFunctionType<int, int>); | 
|  | } | 
|  | } | 
|  |  | 
|  | main() { | 
|  | new MapBase<int, int>().tests(); | 
|  | new MethodOverrideTest().tests(); | 
|  | } |