Index: pkg/analyzer/test/generated/resolver_test.dart |
diff --git a/pkg/analyzer/test/generated/resolver_test.dart b/pkg/analyzer/test/generated/resolver_test.dart |
index 647f8f49b7fcc6d9e7603c90e662ac65aa7d7254..ecbbb2b99e5724618e4e4fff23a9c702bf92afa7 100644 |
--- a/pkg/analyzer/test/generated/resolver_test.dart |
+++ b/pkg/analyzer/test/generated/resolver_test.dart |
@@ -12972,6 +12972,98 @@ class C<T> { |
expect(f.staticType.toString(), '<S>(S) → dynamic'); |
} |
+ void test_genericMethod_override() { |
+ _resolveTestUnit(r''' |
+class C { |
+ /*=T*/ f/*<T>*/(/*=T*/ x) => null; |
+} |
+class D extends C { |
+ /*=T*/ f/*<T>*/(/*=T*/ x) => null; // from D |
+} |
+'''); |
+ SimpleIdentifier f = |
+ _findIdentifier('f/*<T>*/(/*=T*/ x) => null; // from D'); |
+ MethodElementImpl e = f.staticElement; |
+ expect(e.typeParameters.toString(), '[T]'); |
+ expect(e.type.boundTypeParameters.toString(), '[T]'); |
+ expect(e.type.toString(), '<T>(T) → T'); |
+ |
+ FunctionType ft = e.type.instantiate([typeProvider.stringType]); |
+ expect(ft.toString(), '(String) → String'); |
+ } |
+ |
+ void test_genericMethod_override_bounds() { |
+ _resolveTestUnit(r''' |
+class A {} |
+class B extends A {} |
+class C { |
+ /*=T*/ f/*<T extends B>*/(/*=T*/ x) => null; |
+} |
+class D extends C { |
+ /*=T*/ f/*<T extends A>*/(/*=T*/ x) => null; |
+} |
+'''); |
+ } |
+ |
+ void test_genericMethod_override_invalidReturnType() { |
+ Source source = addSource(r''' |
+class C { |
+ Iterable/*<T>*/ f/*<T>*/(/*=T*/ x) => null; |
+} |
+class D extends C { |
+ String f/*<S>*/(/*=S*/ x) => null; |
+}'''); |
+ // TODO(jmesserly): we can't use assertErrors because STRONG_MODE_* errors |
+ // from CodeChecker don't have working equality. |
+ List<AnalysisError> errors = analysisContext2.computeErrors(source); |
+ expect(errors.map((e) => e.errorCode.name), [ |
+ 'INVALID_METHOD_OVERRIDE_RETURN_TYPE', |
+ 'STRONG_MODE_INVALID_METHOD_OVERRIDE' |
+ ]); |
+ expect(errors[0].message, contains('Iterable<S>'), |
+ reason: 'errors should be in terms of the type parameters ' |
+ 'at the error location'); |
+ verify([source]); |
+ } |
+ |
+ void test_genericMethod_override_invalidTypeParamBounds() { |
+ Source source = addSource(r''' |
+class A {} |
+class B extends A {} |
+class C { |
+ /*=T*/ f/*<T extends A>*/(/*=T*/ x) => null; |
+} |
+class D extends C { |
+ /*=T*/ f/*<T extends B>*/(/*=T*/ x) => null; |
+}'''); |
+ // TODO(jmesserly): this is modified code from assertErrors, which we can't |
+ // use directly because STRONG_MODE_* errors don't have working equality. |
+ List<AnalysisError> errors = analysisContext2.computeErrors(source); |
+ expect(errors.map((e) => e.errorCode.name), [ |
+ 'STRONG_MODE_INVALID_METHOD_OVERRIDE', |
+ 'INVALID_METHOD_OVERRIDE_TYPE_PARAMETER_BOUND' |
+ ]); |
+ verify([source]); |
+ } |
+ |
+ void test_genericMethod_override_invalidTypeParamCount() { |
+ Source source = addSource(r''' |
+class C { |
+ /*=T*/ f/*<T>*/(/*=T*/ x) => null; |
+} |
+class D extends C { |
+ /*=S*/ f/*<T, S>*/(/*=T*/ x) => null; |
+}'''); |
+ // TODO(jmesserly): we can't use assertErrors because STRONG_MODE_* errors |
+ // from CodeChecker don't have working equality. |
+ List<AnalysisError> errors = analysisContext2.computeErrors(source); |
+ expect(errors.map((e) => e.errorCode.name), [ |
+ 'STRONG_MODE_INVALID_METHOD_OVERRIDE', |
+ 'INVALID_METHOD_OVERRIDE_TYPE_PARAMETERS' |
+ ]); |
+ verify([source]); |
+ } |
+ |
void test_pseudoGeneric_max_doubleDouble() { |
String code = r''' |
import 'dart:math'; |