Chromium Code Reviews| Index: pkg/analyzer/test/src/task/strong/checker_test.dart |
| diff --git a/pkg/analyzer/test/src/task/strong/checker_test.dart b/pkg/analyzer/test/src/task/strong/checker_test.dart |
| index a1170ef89c78c06f4e35dec9b6aff2a07721aa80..f64589f0f9939891eea5a3775b30a71174425225 100644 |
| --- a/pkg/analyzer/test/src/task/strong/checker_test.dart |
| +++ b/pkg/analyzer/test/src/task/strong/checker_test.dart |
| @@ -1351,6 +1351,51 @@ void main() { |
| ''' |
| }); |
| + testChecker('generic class method override', { |
| + '/main.dart': ''' |
| + class A {} |
| + class B extends A {} |
| + |
| + class Base<T extends B> { |
| + T foo() => null; |
| + } |
| + |
| + class Derived<S extends A> extends Base<B> { |
| + /*severe:INVALID_METHOD_OVERRIDE*/S foo() => null; |
| + } |
| + |
| + class Derived2<S extends B> extends Base<B> { |
| + S foo() => null; |
| + } |
| + ''' |
| + }); |
| + |
| + testChecker('generic method override', { |
| + '/main.dart': ''' |
| + class Future<T> { |
| + /*=S*/ then/*<S>*/(/*=S*/ onValue(T t)) => null; |
| + } |
| + |
| + // These work because they're exactly equal FunctionTypes |
| + class DerivedFuture<T> extends Future<T> { |
| + /*=S*/ then/*<S>*/(/*=S*/ onValue(T t)) => null; |
| + } |
| + |
| + class DerivedFuture2<A> extends Future<A> { |
| + /*=B*/ then/*<B>*/(/*=B*/ onValue(A a)) => null; |
| + } |
| + |
| + // These don't work but should. |
| + class DerivedFuture3<T> extends Future<T> { |
| + /*=/*severe:INVALID_METHOD_OVERRIDE*/S*/ then/*<S>*/(Object onValue(T t)) => null; |
|
Leaf
2015/12/07 21:44:54
you can say /*severe:INVALID_METHOD_OVERRIDE shoul
Jennifer Messerly
2015/12/07 22:29:30
Done.
|
| + } |
| + |
| + class DerivedFuture4<A> extends Future<A> { |
| + /*=/*severe:INVALID_METHOD_OVERRIDE*/B*/ then/*<B>*/(Object onValue(A a)) => null; |
| + } |
| + ''' |
| + }); |
| + |
| testChecker('unary operators', { |
| '/main.dart': ''' |
| class A { |